Skip to content

feat(cli): read audio stems through your HeyGen account - #6993

Merged
jerrai-bot-heygen merged 9 commits into
mainfrom
jerrai/read-audio-by-stem-11022026
Nov 2, 2026
Merged

jerrai-bot-heygen merged 9 commits into
mainfrom
jerrai/read-audio-by-stem-11022026

Conversation

@jerrai-bot-heygen

@jerrai-bot-heygen jerrai-bot-heygen commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

What

Read a recording by its six audio stems: vocals, drums, bass, guitar, piano and other. Describe each audible stem, summarize the soundtrack, and add voice-free mix: and bgm prompt: output lines. The structured music-prompt value is null when there is no music.

Descriptions now use the signed-in HeyGen account or HeyGen API key, including credentials supplied by the desktop app. No separate Google or Gemini API key is used.

Every measured sound-effect event is labelled effect. Similar sounds remain grouped as S1, S2 and so on, with their time, source stem, band, attack, tail, peak and level above music preserved. The CLI reference and audio guide describe this output.

Why

One HeyGen credential should be enough to read a soundtrack. Heuristic effect-kind labels were unreliable, so the output keeps the measurements instead of assigning a sound name. The soundtrack summary and music prompt use an API-enforced schema rather than parsing labels from free-form text.

Missing credentials or failed description requests produce one warning line explaining why descriptions are unavailable; the reader does not switch providers or guess a description.

Related work and merge prerequisites

  • The HeyGen LLM messages endpoint accepts audio input and is deployed to production.
  • A live audio --read run through the HeyGen endpoint passed in a development environment using only a HeyGen CLI sign-in, without a Google or Gemini key: five stem descriptions and one overall summary, with all six requests returning HTTP 200.

The production check is the first post-release run.

How

  • Send stem audio as base64 audio/mpeg blocks through the shared HeyGen credential path.
  • Keep stem descriptions as plain text; require the overall response to satisfy { overall: string, bgm_prompt: string | null } through the API's JSON-schema output configuration.
  • Remove effect-kind classification and its group/summary labels without dropping signal measurements.
  • Invalidate cached analyses so older effect labels and description results are recomputed.

CodeQL notes

  • The stem MP3 upload is intentional: the audio is the model's input for each stem description, sent through the signed-in HeyGen endpoint.
  • The description text cache is intentional: it stores the model's result, keyed by a hash of the audio content, model, prompt and output schema. The cache key contains no credentials, authentication errors or endpoint URLs.

Test plan

  • Five targeted audio test files: 63 tests passed, with at most six workers.
  • CLI package typecheck: passed.
  • CLI-only lint: zero warnings and errors.
  • Changed TypeScript formatting and comment-citation checks: passed.
  • Regression mutation: adding a GEMINI_API_KEY read made its test fail; restoring the implementation returned the suite to green.
  • Documentation updated.
  • Live description requests in a development environment: five stem descriptions and one overall summary, six HTTP 200 responses, using only a HeyGen CLI sign-in.
  • Desktop end-to-end verification: not rerun for this CLI change.

The mocked-request tests cover API-key and access-token headers, audio blocks, enforced output schema, both response fields including bgm_prompt: null, missing credentials, failure warnings, cache reuse and the absence of provider-key reads.

Initial runtime checks ran at 8dc92aeef7a73541ad98f38310f0330cd84a16cc. At 631b21d967986c9815e80200a8eeef1065745614, both changed audio test files passed (41 tests, at most six workers), including malformed responses, mixed content blocks, cache identity and the portable stem-path assertion. The hosted Comments check passed at this head. No full-repository test suite was run locally.

xuanruli and others added 7 commits November 2, 2026 07:00
Measures where each stem is heard, leaves the drums' recurring hits to the
music while it plays, names the stem of each remaining effect, writes a
voice-free mix next to the stems, and describes each audible stem and the
whole recording with Gemini.
Piano, guitar and other are mixed into melodic.wav next to the stems; levels,
spans, descriptions, effects and pieces are read per group, and a group heard
for under two seconds or 5% of the recording is left out of the reading.
…pt from them

Stems are read one by one again; a stem heard under two seconds or 5% of the
recording is still left out. Each stem's description gives the times of its
changes and names the effects it hears. The overall and the BGM prompt are
written from those descriptions and the measured spans, not by listening to
the mix again; the BGM prompt orders the arrangement without seconds.
…usic

Foley and effects in a rhythm are not music; the reading says so instead of a
prompt that would make a remix generate a track the reference never had.
@mintlify

mintlify Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
hyperframes 🟢 Ready View Preview Nov 2, 2026, 2:20 PM

💡 Tip: Enable Automations to automatically generate PRs for you.

@jerrai-bot-heygen

Copy link
Copy Markdown
Contributor Author

Verification

Current head: eb28cfc25bfd8b76b7740ac82d9bd7580bf27c1d.

The runtime checks below ran at 8dc92aeef7a73541ad98f38310f0330cd84a16cc. The only change after that commit is the CLI reference paragraph documenting generic effect events, S1/S2 groups and retained measurements; runtime code and tests are unchanged.

Check Result
bun run --cwd packages/cli test src/audio/read/describe.test.ts src/audio/read/effects.test.ts src/audio/read/format.test.ts src/audio/read/music.test.ts src/audio/read/read.test.ts --maxWorkers=6 5 files passed; 63 tests passed
bun run --filter @hyperframes/cli typecheck Passed
node_modules/.bin/oxlint --threads 6 packages/cli 0 warnings, 0 errors
Formatting of the 12 changed TypeScript files Passed
Comment citations in the changed TypeScript files Passed
Reintroduce a GEMINI_API_KEY read The regression test failed on that read, as intended; the mutation was removed and all 63 tests passed again
Documentation patch whitespace check Passed

Description requests were mocked. Tests cover HeyGen API-key/access-token authentication, base64 audio, schema configuration, summary parsing with both a string and null music prompt, no credential/no request, failure warnings, cache reuse and no Google/Gemini key reads.

Not covered: live hosted-description requests, desktop end-to-end testing, a full-repository suite, or a documentation-site build. The comment-ratchet check could not run with local Git 2.39 because git check-attr --source is unsupported; the hosted Comments CI workflow covers that check. Broad local commit hooks were not run; scoped lint, formatting, typecheck and commit-message checks were run directly.

This PR must remain unmerged until production audio support is serving and a live audio --read run passes through the real HeyGen path with only a HeyGen credential. No direct-provider fallback is present.

Comment thread packages/cli/src/audio/read/describe.ts Dismissed
Comment thread packages/cli/src/audio/read/describe.ts Dismissed
@xuanruli

xuanruli commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

RV2 inputs for the read_audio verification (from the handoff: run read_audio on the RV2 "That's Framer" reference through Desktop's real path, with the HeyGen credential only, and post the raw output).

The files are on HeyGenverse (sign in with your HeyGen account to download):

File Put it at (project root) Link
Reference video (11 MB) assets/thats-framer-reference.mp4 https://www.heygenverse.com/s/13d9e4b3-9230-4993-a4dd-7717206441a4/raw
stems.json .hyperframes/read-audio/stems/370f836c4de8/stems.json https://www.heygenverse.com/s/7af09f50-d6b8-4f25-869c-dc06c4353957/raw
vocals .hyperframes/read-audio/stems/370f836c4de8/vocals.audio https://www.heygenverse.com/s/f50162dd-c367-4b6d-b4e7-0403da4bea24/raw
drums …/370f836c4de8/drums.audio https://www.heygenverse.com/s/28993689-b404-44bd-920e-89bb722cda5d/raw
bass …/370f836c4de8/bass.audio https://www.heygenverse.com/s/7567257b-033b-42ba-acb1-c372cdfef1ae/raw
guitar …/370f836c4de8/guitar.audio https://www.heygenverse.com/s/809367c3-7053-4b68-82f9-dde30ba02334/raw
piano …/370f836c4de8/piano.audio https://www.heygenverse.com/s/d64155c5-2680-47e6-8768-8b5fff6bea77/raw
other …/370f836c4de8/other.audio https://www.heygenverse.com/s/aa20eb9e-cca7-422e-8019-ac801752d98b/raw

The stems are 128 kbps MP3s uploaded with a .mp3 name; save each back under its .audio name. They are the stems the g32 run cached in RV2__dsh-sonnet-headless__1101132943 (six distinct files).

How to use them:

  • With the cache in place, read_audio reuses the stems and the run exercises the describe step through the HeyGen route.
  • To also exercise the HeyGen stems service, leave out .hyperframes/read-audio/stems/.
  • If describe answers 400 on the server route, that part belongs on heygen-com/experiment-framework#63540.

@jerrai-bot-heygen

Copy link
Copy Markdown
Contributor Author

RV2 cached-stem verification, using the supplied inputs.

Ran commit eb28cfc25bfd8b76b7740ac82d9bd7580bf27c1d: hyperframes audio rv2-read-audio-verification-1102/assets/thats-framer-reference.mp4 --read --dir /home/ubuntu/rv2-read-audio-verification-1102, via the locally built CLI and Node 22.23.4. Environment: env -i with only PATH and an isolated HOME; real Node/FFmpeg binaries, no shim; cached stems, no credentials, and no Gemini/Google API key. Exit code: 0. The reference SHA-256 starts 370f836c4de8, matching the cache directory.

Result: measured stems and generic effect events with S1–S7 groups; no effect-kind names. Description was skipped with one no-HeyGen-credential warning. There is also a separate, expected no-transcript warning because these inputs contain no transcript.

Not covered yet: description through the live HeyGen route, pending the server audio-support rollout; fresh stem separation; Desktop's end-to-end path.

Full raw combined stdout/stderr, unchanged:


  Hyperframes collects usage data to improve the tool, anonymous until you sign in.
  File paths and composition content are never collected.
  If you sign in to HeyGen, your account (email and username) is linked to your usage.

  Disable anytime: hyperframes telemetry disable

[SystemMemory] cgroup memory limit detected: 196608 MiB. It governs memory-adaptive render behaviour instead of host RAM.
rv2-read-audio-verification-1102/assets/thats-framer-reference.mp4 · 37.6 s · 103 BPM
voice-free mix: .hyperframes/read-audio/stems/370f836c4de8/no-vocals.wav
stems: .hyperframes/read-audio/stems/370f836c4de8/

vocals  -18 dB · 0.75–4.5, 5.75–35.25
bass    -22 dB · 6.25–18.5, 33.75–37.5
drums   -25 dB · 0–37.25
piano   -30 dB · 0–17.75, 30.75–36.75
other   -32 dB · 6.25–17.5, 18.5–23.25, 24.75–29.5, 30.75–36.5

voice: 9 lines, 8 pauses, median pitch 121 Hz
effects: 7 in 7 sounds (S1 ×1, S2 ×1, S3 ×1, S4 ×1, S5 ×1, S6 ×1); 144 hits of the music's own drums left out
music: 2 pieces, 2 breaks

0.1–23.4   music    piece 1 (drums; bass 6.25–18.5; piano until 17.75; other 6.25–17.5, 18.5–23.25 · 103 BPM), fades from 20.4
0.9–4.5    voice    (no transcript)  voice -16 LUFS, music -23 LUFS: voice 7 dB over music
1.0        effect   (drums, S1): mid, attack 53 ms, tail 0.0 s, peak -11 dBFS, +12 dB over music
4.5–5.8    pause    1.3 s; during it: music 4.5–5.8
5.8–10.6   voice    (no transcript)  falling end  voice -17 LUFS, music -22 LUFS: voice 5 dB over music
6.2        effect   (drums, S2): mid, attack 58 ms, tail 0.0 s, peak -10 dBFS, +18 dB over music
10.6–11.2  pause    0.6 s; during it: music 10.6–11.2
11.2–13.9  voice    (no transcript)  voice -17 LUFS, music -22 LUFS: voice 5 dB over music
13.9–14.4  pause    0.5 s; during it: music 13.9–14.4
14.4–17.3  voice    (no transcript)  falling end  voice -16 LUFS, music -22 LUFS: voice 6 dB over music
15.0       effect   (drums, S3): mid, attack 38 ms, tail 0.1 s, peak -9 dBFS, +10 dB over music
17.3–18.1  pause    0.8 s; during it: 1 effect, music 17.3–18.1
17.3       effect   (drums, S4): mid, attack 60 ms, tail 0.4 s, peak -12 dBFS, +8 dB over music, 0.0 s into the pause
18.1–23.2  voice    (no transcript)  voice -16 LUFS, music -23 LUFS: voice 7 dB over music
23.2–23.9  pause    0.7 s; during it: music 23.2–23.4
23.4–24.7  music    break 1.3 s
23.9–27.1  voice    (no transcript)  pitch 99 Hz (median 121)  falling end  voice -19 LUFS, music -24 LUFS: voice 5 dB over music
24.7–29.4  music    piece 2 (drums; other), first appearance after a break
27.1–27.8  pause    0.7 s; during it: music 27.1–27.8
27.8–29.9  voice    (no transcript)  pitch 96 Hz (median 121)  voice -18 LUFS, music -26 LUFS: voice 8 dB over music
29.5–30.7  music    break 1.2 s
29.7       effect   (drums, S5): mid, attack 30 ms, tail 0.0 s, peak -11 dBFS, +7 dB over what played before
29.9–30.6  pause    0.7 s; during it: 1 effect, sound continues at -21 dBFS
30.3       effect   (drums, S6): mid, attack 16 ms, tail 0.4 s, peak -11 dBFS, +22 dB over what played before, 0.4 s into the pause
30.6–31.9  voice    (no transcript)  rising end  voice -16 LUFS, music -26 LUFS: voice 10 dB over music
30.8–37.6  music    piece 1 (drums; bass from 33.75; piano until 36.75; other until 36.5 · 103 BPM), returns, fades from 36.7
31.9–32.4  pause    0.5 s; during it: music 31.9–32.4
32.4–35.3  voice    (no transcript)  pitch 364 Hz (median 121)  voice -18 LUFS, music -23 LUFS: voice 5 dB over music
33.9       effect   (drums, S7): low, attack 43 ms, tail 0.2 s, peak -10 dBFS, +16 dB over music

! no transcript: voice lines carry no words; run hyperframes transcribe rv2-read-audio-verification-1102/assets/thats-framer-reference.mp4 and pass --transcript
! stems not described: no HeyGen credential: set HEYGEN_API_KEY or run `hyperframes auth login --api-key`

whole recording: /home/ubuntu/rv2-read-audio-verification-1102/.hyperframes/read-audio/thats-framer-reference-370f836c4de8.txt

— Jerrai

@jerrai-bot-heygen

Copy link
Copy Markdown
Contributor Author

Live audio --read verification passed in a development environment using only a HeyGen CLI sign-in, with no Google or Gemini key. Local project paths and the reference filename are anonymized; the measured output is otherwise unchanged.

  • Requests: 6 × HTTP 200 (five stem descriptions and one overall summary).
  • Model: gemini-4-argon.
  • Per-call tokens (input/output, in response order): 1147/119, 1147/121, 1148/137, 1147/87, 1147/168, 1168/430.
<project>/assets/reference.mp4 · 37.6 s · 103 BPM
overall: A clear, conversational male voiceover runs from 0.75 to 4.5 seconds and 5.75 to 35.25 seconds over a quirky, mysterious hip-hop and dance fusion track at 103 BPM. The music opens with a syncopated acoustic piano riff and Middle Eastern hand percussion, then builds around 6.25 seconds as a punchy electronic kick, pulsing sub-bass, bold staccato brass, and shouted vocal chops join in. Around 18 seconds, the piano, bass, and brass drop out, leaving a heavy electronic beat paired with a playful, bell-like keyboard melody that pauses for brief musical breaks at 23.4–24.7 and 29.5–30.7 seconds. After a filtered piano and percussion breakdown at 30.75 seconds, the full energetic arrangement of bright piano, sub-bass, brass, and vocal chops returns around 33.75 seconds to close the track.
voice-free mix: .hyperframes/read-audio/stems/370f836c4de8/no-vocals.wav
stems: .hyperframes/read-audio/stems/370f836c4de8/

vocals  -18 dB · 0.75–4.5, 5.75–35.25
  The stem primarily features a clear, conversational male voiceover delivering an informative pitch with a steady, measured cadence from start to finish. Around 0:06, a distant, shouted vocal sample saying "Hey!" enters the background, followed by rhythmic, percussive vocal chops and a muffled "Woah!" around 0:18. These background vocal samples drop out around 0:20, leaving the dry spoken narration completely isolated for the middle section. Finally, at 0:34, the "Hey!" shout and rhythmic vocal chops return in the background, continuing briefly after the main speaker finishes at 0:35 before fading out.
bass    -22 dB · 6.25–18.5, 33.75–37.5
  After an initial silence, a deep, sub-bass synth enters at 0:06, playing a slow, rhythmic, pulsing pattern that resembles a muffled heartbeat. This steady, low-frequency groove continues until 0:18, where the stem falls completely silent. At 0:34, the same deep, pulsing sub-bass pattern returns and plays through to the end of the track.
drums   -25 dB · 0–37.25
  The drums stem opens with a syncopated Middle Eastern hand percussion groove featuring crisp claps, snaps, and resonant hand drums. At 00:05, a punchy electronic kick drum and bright shakers join in, locking into an upbeat, driving dance rhythm. A rising white-noise sweep builds tension from 00:16 to 00:18, leading into a heavier, stomping beat at 00:18 driven by a booming kick and sharp layered claps. This heavy electronic groove continues until 00:30, when the kick drops out for a brief breakdown featuring filtered hand percussion and a subtle metallic chime. The full, energetic beat returns at 00:33 with the punchy kick and hand drums carrying the rhythm to the end.
piano   -30 dB · 0–17.75, 30.75–36.75
  An acoustic piano opens with a syncopated, jazzy riff in a quirky, mysterious style, combining a walking bassline with staccato right-hand chords. The performance cuts out completely at 00:18, leaving a long stretch of silence until 00:31. When the piano returns at 00:31, it plays the same rhythmic pattern but sounds heavily muffled and low-pass filtered. By 00:34, the filter opens up, restoring the piano's bright, clear tone for the remainder of the clip.
other   -32 dB · 6.25–17.5, 18.5–23.25, 24.75–29.5, 30.75–36.5
  The track starts in silence until 0:04, when a bold, staccato brass section enters playing a repetitive, minor-key hip-hop motif with an aggressive feel. At 0:18, the brass cuts out, replaced by a high-pitched, bell-like keyboard playing the same melody in a softer, more playful tone, though with brief pauses at 0:23 and 0:29. Finally, at 0:33, the brass section returns to layer back over the keyboard for the remainder of the clip.
(descriptions are a model listening to each stem: what the sound is and what its effects sound like. Their times are approximate; the measured spans above and the timed lines below are exact.)

bgm prompt: An upbeat, quirky hip-hop and dance fusion track with Middle Eastern influences at about 103 BPM. It opens with a syncopated, jazzy acoustic piano riff over crisp hand percussion, snaps, and claps. Soon, the groove builds as a punchy electronic kick, shakers, a deep pulsing sub-bass, bold staccato brass, and rhythmic vocal shouts enter. A white-noise sweep leads into a stripped-back middle section where the piano, sub-bass, and brass drop out, replaced by a heavier stomping beat and a softer, playful bell-like keyboard playing the main motif with two brief pauses. Following the second pause, the kick drops out for a short breakdown featuring low-pass filtered piano and hand percussion. Finally, the filter opens up and the full, energetic beat returns with the bright piano, pulsing sub-bass, bold brass layered over the bells, and vocal chops carrying the groove to the end.

voice: 9 lines, 8 pauses, median pitch 121 Hz
effects: 7 in 7 sounds (S1 ×1, S2 ×1, S3 ×1, S4 ×1, S5 ×1, S6 ×1); 144 hits of the music's own drums left out
music: 2 pieces, 2 breaks

0.1–23.4   music    piece 1 (drums; bass 6.25–18.5; piano until 17.75; other 6.25–17.5, 18.5–23.25 · 103 BPM), fades from 20.4
0.9–4.5    voice    (no transcript)  voice -16 LUFS, music -23 LUFS: voice 7 dB over music
1.0        effect   (drums, S1): mid, attack 53 ms, tail 0.0 s, peak -11 dBFS, +12 dB over music
4.5–5.8    pause    1.3 s; during it: music 4.5–5.8
5.8–10.6   voice    (no transcript)  falling end  voice -17 LUFS, music -22 LUFS: voice 5 dB over music
6.2        effect   (drums, S2): mid, attack 58 ms, tail 0.0 s, peak -10 dBFS, +18 dB over music
10.6–11.2  pause    0.6 s; during it: music 10.6–11.2
11.2–13.9  voice    (no transcript)  voice -17 LUFS, music -22 LUFS: voice 5 dB over music
13.9–14.4  pause    0.5 s; during it: music 13.9–14.4
14.4–17.3  voice    (no transcript)  falling end  voice -16 LUFS, music -22 LUFS: voice 6 dB over music
15.0       effect   (drums, S3): mid, attack 38 ms, tail 0.1 s, peak -9 dBFS, +10 dB over music
17.3–18.1  pause    0.8 s; during it: 1 effect, music 17.3–18.1
17.3       effect   (drums, S4): mid, attack 60 ms, tail 0.4 s, peak -12 dBFS, +8 dB over music, 0.0 s into the pause
18.1–23.2  voice    (no transcript)  voice -16 LUFS, music -23 LUFS: voice 7 dB over music
23.2–23.9  pause    0.7 s; during it: music 23.2–23.4
23.4–24.7  music    break 1.3 s
23.9–27.1  voice    (no transcript)  pitch 99 Hz (median 121)  falling end  voice -19 LUFS, music -24 LUFS: voice 5 dB over music
24.7–29.4  music    piece 2 (drums; other), first appearance after a break
27.1–27.8  pause    0.7 s; during it: music 27.1–27.8
27.8–29.9  voice    (no transcript)  pitch 96 Hz (median 121)  voice -18 LUFS, music -26 LUFS: voice 8 dB over music
29.5–30.7  music    break 1.2 s
29.7       effect   (drums, S5): mid, attack 30 ms, tail 0.0 s, peak -11 dBFS, +7 dB over what played before
29.9–30.6  pause    0.7 s; during it: 1 effect, sound continues at -21 dBFS
30.3       effect   (drums, S6): mid, attack 16 ms, tail 0.4 s, peak -11 dBFS, +22 dB over what played before, 0.4 s into the pause
30.6–31.9  voice    (no transcript)  rising end  voice -16 LUFS, music -26 LUFS: voice 10 dB over music
30.8–37.6  music    piece 1 (drums; bass from 33.75; piano until 36.75; other until 36.5 · 103 BPM), returns, fades from 36.7
31.9–32.4  pause    0.5 s; during it: music 31.9–32.4
32.4–35.3  voice    (no transcript)  pitch 364 Hz (median 121)  voice -18 LUFS, music -23 LUFS: voice 5 dB over music
33.9       effect   (drums, S7): low, attack 43 ms, tail 0.2 s, peak -10 dBFS, +16 dB over music

! no transcript: voice lines carry no words; run hyperframes transcribe <project>/assets/reference.mp4 and pass --transcript

whole recording: <project>/.hyperframes/read-audio/reference-370f836c4de8.txt
CLI_EXIT_CODE: 0

Use portable stem path assertions and simplify response validation.
Keep auth-derived URLs out of cache hashes and trim redundant comments.

— Jerrai

@heygengenesis heygengenesis Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE · 0 blocker · 0 important · 2 nits

No blockers. CI at this head is green (both CI runs, CodeQL, Windows render, regression); the remaining BLOCKED state is the review gate. The description cache key no longer includes the endpoint URL, and the two remaining CodeQL notes are explained in the body. Nits are inline.

Scope

Read end-to-end: describe.ts, read.ts, effects.ts, music.ts, format.ts, types.ts, the providers/shared.ts change, and both docs pages. Ran src/audio/read/ locally at this head: 7 files, 86 tests passed. Skimmed the tests. No prior human reviews on the PR.

— Claude (Genesis V2)

entry.analysis.separation === "stems" &&
!entry.analysis.description &&
quality !== "fast" &&
typeof (await describeAccess()) !== "string"

@heygengenesis heygengenesis Bot Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: for a signed-in user, this skips the cache whenever a stems reading has no description. Some readings can never get one: when no stem passes heardLongEnough (any clip under 2 s, or a near-silent one), describeStems returns early with description: null and no warning. Every later --read of that file then reruns the full analysis and returns cached: false. Gating on readings that have stems to describe fixes it:

Suggested change
typeof (await describeAccess()) !== "string"
entry.analysis.stems.length > 0 &&
typeof (await describeAccess()) !== "string"

Comment thread docs/packages/cli.mdx
before the effect (after it, when the music starts with it), `+12 dB over what
played before` against the recording's median level in the half second
before, or `out of silence`. A sound ends where the next one starts. Quick
runs of one sound are a single line with a count; hits on the music's beat

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: since musicHits landed, the left-out drum hits also include sounds that recur in the drum stem while music plays, not only hits on the beat. The types.ts comment and the summary line (hits of the music's own drums left out) already say this; this sentence still describes only the old on-beat rule.

@jerrai-bot-heygen

Copy link
Copy Markdown
Contributor Author

Lane sign-off (cutroom-dev:dsh) at head 631b21d.

  • Genesis approved this exact head and all required CI is green.
  • Live verification PASS in a development environment (5 stem descriptions + overall summary, 6x HTTP 200, HeyGen CLI sign-in only); production check is the first post-release run. CI fixes: Windows path assertion, Fallow complexity, comment ratio, cache key without endpoint URL. No asserts removed.

@jerrai-bot-heygen
jerrai-bot-heygen added this pull request to the merge queue Nov 2, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 2, 2026
@jerrai-bot-heygen
jerrai-bot-heygen added this pull request to the merge queue Nov 2, 2026
Merged via the queue into main with commit acd5c30 Nov 2, 2026
118 of 119 checks passed
@jerrai-bot-heygen
jerrai-bot-heygen deleted the jerrai/read-audio-by-stem-11022026 branch November 2, 2026 19:00

This branch was successfully deployed

1 active deployment
staging - docs — 631b21d9 Deployed Nov 2, 2026 by mintlify[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants