Repository navigation
feat(cli): check catches audio the render would lose or play as silence - #6439
Conversation
check gains an Audio section, read from the media list the render mixes: - error: a clip's source has no audio the render can read (its mix fails, the film ships without sound) - warning: a clip starts past the end of its file, or the part it plays is silent - info: the film has no sound at all The bundle and media list are now built once and shared with the HDR inspection; the audio pass runs while the browser pass does. Fixes #2775
…dles it A source with no audio track is refused by render's own media-type rule, now exported from the producer and called by check; a source that does not decode as audio fails the mix and stops the render.
…l of it for silence Sound at any spot ends the decode; a clip is only called silent after its whole played part is read.
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
Edit accuracy: accurate 271 (base branch 271), smooth 166 of thoseThe gate passes. Quarantined, measured but not gated (0) Unstable (1)
|
There was a problem hiding this comment.
Verdict: APPROVE · 0 blocker · 0 important · 2 nits · head faf489da
- nit —
Comments(not required) fails: the comment share incheckFindings.tsrose from 2/42 to 3/61 becausefindingAtRootmoved there with its doc line. - nit —
checkPipeline.tsinspectProjectMedia: if the browser pass throws, the outer catch returns without awaitingaudio. The probes and decodes keep running after the failure report until they finish. That's harmless (the promise has a.catch), but it can hold the process open for a moment.
Scope
Read all 13 files and checked the claims against render. compileStage preflights compiled.audios, video -audio tracks included, with mediaProfileMatchesElementType("audio"), so audio_source_rejected matches render. An audio_processing_failed warning fails the render (renderOrchestrator.ts:838), which matches audio_source_unreadable. Locally: cli check, checkAudio, hdrPromotion and checkPipeline tests pass 200/200. I ran a built-CLI check on a fixture: a silent clip and a start past the file's end were flagged; a clip with sound only near its end, and a sounding clip, were not. CI is green apart from Comments.
Merge 2 more upstream commits (7d6c02f..acd0bc3: heygen-com#5366, heygen-com#3943). Regenerate skills-manifest.json for the media-use hash conflict. Record the 10 open PRs heygen-com#6430-heygen-com#6439 in docs/DECISIONS.md (none adopted; heygen-com#6436 cannot be copied because the fork wraps authored scripts in Function()) and advance the commit watermark to acd0bc3 and the PR watermark to heygen-com#6439. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Merge 20 more upstream commits (acd0bc3..ad4d3fa, v0.8.205: heygen-com#6403, heygen-com#6363, heygen-com#6209, heygen-com#6395, heygen-com#6424, heygen-com#6426, heygen-com#6442, heygen-com#6430, heygen-com#6402, heygen-com#6435, heygen-com#6439, heygen-com#6449, heygen-com#5436, heygen-com#6455 and docs). No conflicts. Record the 11 open PRs heygen-com#6440-heygen-com#6458 and issue heygen-com#6443 in docs/DECISIONS.md (none adopted), re-check the earlier open PRs, and advance the commit watermark to ad4d3fa, the PR watermark to heygen-com#6458 and the issue watermark to heygen-com#6443. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
What
hyperframes checkhad no audio section, so a film whose sound the render drops, refuses or plays as silence passed with 0 errors (#2775). It now reads every clip the render mixes, from the same media list the render builds, and reports:audio_source_rejectedaudio_source_unreadableaudio_starts_past_source_enddata-media-startis at or past the end of the fileaudio_clip_silentaudio_noneFindings carry the clip's
#id, the composition file it was written in, and its time on the film. A 3-scene film with one defect per scene, on main and on this branch:Design
hyperframes audioreports them), overlap across tracks (music under a voice is normal; same-track overlap is already lint'sduplicate_audio_track).One owner per decision: the bundle and render media list are built once and shared by the HDR inspection and the audio pass (the HDR inspection now takes that list instead of bundling its own); the media-type rule is render's own
mediaProfileMatchesElementType, now exported from the producer; the probe is the engine's cachedextractAudioMetadatathat render uses; the decode and silence measure are the oneshyperframes audiouses.Timing
check --jsonwall time, built CLI, CPU-only Linux VM (shared, so each main/branch pair runs back to back after the load drops), 3-composition 15 s film and a 6-scene 6-minute film, each with a music bed and one voice per scene.9 pairs per fixture, every run exit 0, branch reports carry an
audiosection with no findings (the fixtures' clips all sound). A first version that decoded every clip in full measured +695 ms (+11.5%) on the 6-minute film, over budget; that is what the spot sampling fixes.Tests
checkAudio.test.ts(10): real WAV and PNG files through the real probe, render's media-type rule, decoder and silence measure: a sounding clip passes; rejected source; unreadable source; start past the end; silent played part (only that clip, only the part it plays, playback rate respected); a long clip is only called silent after a full read; composition file named; video sound counted.check.test.ts(+3): an audio error fails the check and lands in its own section; audio is still checked when lint errors skip the browser; an audio pass that throws becomes an info finding, not a failed check.checkAudio.test.tscannot import. One deliberate break per check turns exactly its test red. 3 green runs in a row.Fixes #2775