Repository navigation
Fix the video Voice choice; tighten the VideoSpec after review - #209
Merged
Merged
Conversation
When a quote or code block arrived in a section with nothing to say, it took the section over (as the walk always has) and the section's own blocks went with it: the segment showed that picture, but no segment's source.block_ids named its block, so a re-sync would have offered it as new. The same happened to a repeated picture's section dropped next to a quote. Both now pass their blocks on, and a segment lists its blocks in document order. No shot changes; the spec's provenance only. Found by the adversarial parity review, which found no rendering difference. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PwaujUokXQAxnebBArpZuj
Spec: the `from` and `type` tags are required (the schema said optional
and compact dumps would not load back); dumps always use the spec's own
spelling ("from", "in"); transition, card-text and code-style settings
refuse unknown keys like the rest instead of dropping a typo; source
records when it was imported and whether it was a selection.
Importer: a heading that isn't read aloud keeps its block in its
section's provenance, and the silent beat that holds a picture before a
quote names that picture.
Compiler: a clip whose file has gone is skipped as its warning says,
instead of leaving a shot with no input that fails the render; an intro
or outro out of place, an audio file used as a picture and a non-image
watermark or background are refused; orphaned anchors are named.
Doc: §5.8 now states the rule Notes renders by (a scene is cut into
units at its overlaid beats), a wrong mapping line and stale citations
are fixed, and the review's design questions for GVC are open decisions.
No shot changes: the parity tests against the original walk still pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PwaujUokXQAxnebBArpZuj
The video dialog's Voice choice was saved in RenderOptions.voice and never read: the render worker always used the account's voice. It also only ever listed fal.ai voices, so on an account reading with Deepgram (the default once a Deepgram key is set) no choice could have mattered. - The dialog lists the voices of the engine that will read the video, mirroring the worker's provider resolution, and labels "Account default" with the voice it stands for. - The worker passes the choice on when it is a voice of that engine, and otherwise falls back to the account's voice (a choice saved under the other engine no longer becomes the model's first voice). - The speech core honours a Flux voice id for Deepgram; any other name, such as read-aloud's fal.ai voice, still means the account's. The shot cache keys on the narration audio itself, so a new voice is never served old shots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PwaujUokXQAxnebBArpZuj
davior
marked this pull request as ready for review
October 15, 2026 06:51
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR has two parts, in separate commits: the Voice dropdown fix, then the fixes from the VideoSpec review.
1. The video dialog's Voice choice now works (
731595f)The Voice dropdown in the video dialog saved
RenderOptions.voice, but nothing read it. Every render used the account's voice. The dropdown also only ever listed fal.ai voices. On an account with a Deepgram key, "auto" reads with Deepgram, so no choice in that list could have mattered.utils/renderVoices.ts, applies the same provider rule as the worker. "Account default" now names the voice it stands for, e.g. Account default (Haley — female, US (Flux)).video/worker.py:_render_voice) when it is a voice of the engine doing the reading. Otherwise the account's voice is used, so a choice saved under the other engine no longer turns into the model's first voice.routers/settings.py:synthesize_tts_bytes). Any other name still means the account's Deepgram voice. That includes read-aloud's fal.ai voice name, so read-aloud is unchanged.2. VideoSpec review fixes (
60c9d51,0058942)These fix what the adversarial review of the VideoSpec path confirmed. A separate skeptic reproduced every finding before I acted on it. Nothing that renders changes: the parity tests against the original walk still pass.
sourcerecordsimported_at, andselectionwhen only part of the note was imported.from/typetags are required, and compact dumps load back.from,in).heading_attaches(marked as planned), stale line citations and the Background type are corrected.title/shot_segmentsTest plan
tests/test_video_voice.py(14 tests): the worker's choice per engine, Deepgram honouring a Flux id, and a render pinned to each enginerenderVoices.test.ts(4 tests)mainand passes here.pytest -qfrombackend/: 1,314 passed, 1 skipped (that skip was already there).npm test(208 passed) andnpm run buildfromfrontend/.🤖 Generated with Claude Code
https://claude.ai/code/session_01PwaujUokXQAxnebBArpZuj