First question: does the viewer need the spoken words, key messages, or both? Use the brief, listening context and brand tone to choose. When the viewer needs speech as text, provide captions; a title giving the gist does not replace them. When only key messages need emphasis, designed titles may suffice. Ads can need either or both.
Choose the caption treatment for readability and tone: a karaoke pill adds emphasis,
calm words settle in, and seam chunks suit a split layout. The spoken-caption routes
use captions() in hn4a-compositor-in-scene-titles (mode=), cued from word times
(python-read-word-timings); titles and lyrics use their own leaves below.
Routes
| Route | Pick it when | Cost and time | What you get | Leaves |
|---|---|---|---|---|
| Karaoke pill | Social explainers, screen walkthroughs, creator and podcast clips: viewers read along | Free; two layers a word | Each phrase builds word by word, the spoken word on the accent pill, bouncing | hn4a-compositor-in-scene-titles (mode="karaoke") |
| Calm word by word | Story pieces, animated shorts, anything a pill would make "too bouncy" | Free; one layer a word | Each word rises in as it is said, key words in a lighter accent | hn4a-compositor-in-scene-titles (mode="calm") |
| Seam chunks | Split-screen shorts: face in one half, screen in the other | Free; one layer a chunk | 2–3 big words at a time on the seam, a keyword colour, a hard stroke | hn4a-compositor-in-scene-titles (mode="chunks") |
| Designed titles | The brief needs selected messages emphasized; combine with captions when the spoken words are also needed | Free; hand-written phrases | The gist in the brand's type | hn4a-compositor-motion-graphics, guide-add-titles-and-motion-graphics |
| Kinetic lyrics | Music videos | Free | Lyrics as type that lands on the sung syllables and acts out its words | hn4a-compositor-kinetic-lyrics |
Captions that lie on a surface in the scene (along a floor, on a wall, tilted into the
set, running off into the distance) are any of these routes inside a plane group:
hn4a-compositor-perspective-planes.
The numbers that worked
| Route | Aspect | Type | Phrase | Where |
|---|---|---|---|---|
| Karaoke | 16:9 walkthrough | brand sans 800, 54 px, a 4 px ink outline | sentence ends, pauses over 0.32 s, 6 words or 30 characters | a box above the bottom edge, clear of the presenter bubble |
| Karaoke | 16:9 creator clip | the brand's caption face; active word in the accent | sentence ends, pauses over 0.3 s, 5 words or 26 characters | following the chin, outside any camera shake |
| Karaoke | 9:16 | 900, about 68 px, uppercase | 4 words or 22 characters | a 960 × 230 box at x 60, y 1330, clear of the platform's buttons |
| Calm | 9:16 | 700, about 66 px, near-white, a soft dark shadow | 6 words or 30 characters, a 0.45 s pause ends one | y ≈ 1400 |
| Chunks | 9:16 split screen | condensed caps, about 92 px, a 10 px black stroke under the fill | 2–3 words; after 2 when the second is long | centred on the seam, over a 6 px accent seam line |
Calm captions rise 14 px over 0.22 s from 0.05 s before the word, hold until 0.05 s
before the next phrase and fade in 0.15 s, key words in a lightened brand accent.
Chunks pop in 0.18 s. Captions styled to a generated look (and the cards that share
the frame with them), from a paper-cut short: references/paper-cut-cards.md.
Choosing
- Pill or calm: a karaoke pill on a paper-cut story short read as "too bouncy"; calm words fixed it. On a screen walkthrough the pill is what reads.
- Avoid competing text treatments: karaoke captions on one 20 s claymation ad competed with its designed titles and were dropped. When both are required, separate their placement or timing, and prove readability in the first look.
- Phrase length is a feel: 4 words or 22 characters on a story short left single words alone on screen; 6 or 30 read as phrases.
- Outline over light screens: plain white captions vanished over a white UI; a 4 px
ink outline (
stroke=) reads on light and dark. - Captions with a chyron: the lower third takes the bottom of a 16:9 frame; move the
captions above it, or drop them while a strap is up (
hn4a-compositor-chyron). - Captions behind a person are titles like any other: check them
(
python-check-title-occlusion).
Process
- Word times of the exact track the spec plays (
python-read-word-timings); for recorded speech, a transcript (whisper-cli-transcribe-with-word-times) checked by ear for names. - Respell for the screen, not the voice: uppercase first, then map words to what
to show (
upper=True,shown={"2030S": "2030s"}), so a TTS respelling or a unit reads right. - Coordinate captions with titles. When a title supplies the same words, its span
can use
skip; end a phrase at the skip boundary to avoid a collision. If the title only gives the gist and the spoken words are needed, keep the captions and move or retime the title. - Clip each caption's end to the next one's start: two overlapping for a frame
reads as a flicker.
captions()does it. - Gate: the caption style is part of the first look
(
guide-add-titles-and-motion-graphics, Process 1): the person sees it move before the rest is built. Then the live spec (hn4a-compositor, Live spec, then render).
Avoid
- Captions baked into a generated image or video: composite them.
- Captions over the platform's buttons or under a chyron.
- Typed times: re-cue from a new transcript after any re-cut or re-take.
- A transcript's spelling on screen unchecked: numbers come back as digits and names misspelled.
Related
guide-add-titles-and-motion-graphics: titles and graphics around the captions.hn4a-compositor-chyron: news straps and tickers that share the frame.


