vo-sync
Sync an animation, captions, or cues to a voiceover so visuals land on the spoken words, and pace the timeline tightly to the narration (no dead air). Use when you have (or will generate) a voiceover
SKILL.mdsource/skill/vo-sync/SKILL.md
GitHubVO Sync
Make the visuals follow the voice: each cue (a card raising, a caption, a sound) lands on the word that names it, and each scene lasts about as long as its narration — so the piece is tight with no silent stretches.
How it works
- Write VO that names things in appear-order, then generate it with word timestamps:
python3 scripts/elevenlabs.py tts script.json vo --voice <id>→ clips +vo/durations.json+vo/alignments.json(per-character start times). (script.json=[{"id":"scene1","text":"…"}, …].) - Compute timing: edit the
CONFIG(scene order + cue→keyword) inscripts/compute_timing.jsand run it →timing.json={ total, head, scenes:[{id,start,dur,cues:[{key,at}]}] }.durfollows the VO length;atishead + word time. - Feed your engine
timing.json(read it at boot via atiming.jswindow.__TIMING=…, orfetch): usedurfor scene length andatfor when each cue fires. - Build audio to the same timeline so SFX hit on the words (see the
audio-stemsskill: place each event atscene.start + at).
Key moves
- VO-driven durations (
dur = head + voLen + tail, clamped to fit the last cue/animation) → continuous narration, no dead air. - Anchor on words: a word spoken
wseconds into a clip → cueat = head + w. - Spread when you can't name every item: anchor named ones, interpolate the rest between anchors.
- Snap-to-instant: to make a whole list turn green the moment the VO says "auto-mapped," set those cues to the trigger word + tiny increments.
- Recompute + rebuild audio freely (cheap); only re-render the video once the visuals are locked — a one-word VO change shifts every downstream scene start.
See reference/VO_SYNC.md for the full workflow, the alignments.json lookup, lead/hero timing, and gotchas (spelled-out acronyms, regeneration). Other providers: any TTS works if you can get word/segment times; without timestamps, estimate at from word counts.