4.5 KiB
4.5 KiB
tags, updated
| tags | updated | ||
|---|---|---|---|
|
2026-10-15 |
Lessons Learned
Back to Video Stack - Overview
- A Kokoro-made reference makes Chatterbox clones flat with odd pauses. Use a real human reference (the user's recording worked well; leave more headroom, it peaked at -0.1 dBFS).
- Generate one sentence at a time (best of several seeds, ~200 ms gaps) to avoid strange pauses.
- Copywriting: short spoken sentences, numbers written as spoken words, ~105 words per 45 s, leave ~2 s spare. Number-heavy long lines made Prop 1 sound awkward.
- Gemini reads directions aloud unless they go in the style field.
- Music must add feel: civic_tension and piano B were rejected; option A (dark low strings, slow heartbeat pulse) chosen for Prop 1. If code-composed music misses twice, use a richer generator.
- ElevenLabs free tier was blocked for TTS ("unusual activity"); not retried.
- HyperFrames is easier for local models than Remotion (plain HTML per scene).
- Pick an authoritative male voice for political ads.
Prop 39 critique: lessons (2026-10-16)
Source: Hermes's "Yes on 39" 1:38 16:9 draft (C:\video\prop39). Length 1:38 was intended — not a defect.
1. Captions lost every space ("areyou?Many", "governmentissuedID")
Root cause: C:\video\prop39\build_hf.py line 35 built word spans separated by a space, but the .cap CSS rule (line 171) was display:flex;justify-content:center. In a flex container each <span> becomes a flex item and whitespace-only text between items is discarded, so the words render glued together.
.capisdisplay:block(never flex/grid). Center withtext-align:center.- Word spans joined with
' '.join(...)— real space text nodes. - Run
python scripts/qa/check_captions.py hf/ad/index.html vo/words.json— must printCAPTION CHECK OK. - Look at 3 stills with captions on screen and read them aloud.
2. Safe zones
- 16:9 1920x1080: title-safe 5% → 96px left/right, 54px top/bottom. Nothing (DRAFT tag, logos, header) outside it.
- Captions bottom edge ≥ 12% from the bottom (≥130px at 1080p), so player bars don't cover them.
- 9:16 1080x1920: top 250px, bottom 430px, right 90px are UI zones. Content and captions stay inside.
- Export stills of first scene, a caption-heavy scene and end card; check against the zones.
3. Voice was flat (uniform pauses)
- Political = Gemini Charon; business = Kore. Steer delivery in
--style, never in the text. - Natural punctuation, contractions ("it's", "don't"), mix short and long sentences.
- Vary gaps between sentences 150–400ms (longer before the big point, shorter in lists). Never one fixed gap.
- Listen to the whole VO once, start to finish, before building visuals.
4. Persuasive copy — pick the mode first
- Decide: neutral explainer or advocacy ad. Write it in the brief and stick to it.
- Advocacy ("Yes on X") argues from line 1. No hedges like "other access concerns remain debated" or "laws vary" — those belong only in neutral explainers.
- Lead with the strongest lines (e.g. "When the process feels loose, people stop trusting it", "A secure election is a fair election").
- Cut procedural scenes (e.g. "best-efforts" data/reporting) that kill momentum.
5. Pacing
- 10–12s static slides feel like a deck. Something visible changes every 3–5s: a build, kinetic number, highlight, camera push, or cut.
- No scene element is static >5s (check the timeline).
6. Facts and disclosure
- Every stat (e.g. "36 states", Gallup/Pew numbers) has a source URL in
vo_review.md/sources.md. - No chart labeled "illustrative" presented as data: use real numbers with citation, or remove.
- A real "Paid for by ..." line replaces any "sponsor disclosure pending" placeholder before publishing.
Pre-render QA checklist (Hermes must run all, every video)
- Captions:
check_captions.pypasses; 3 stills read correctly with spaces. - Safe zones: stills checked (16:9: 96/54px, captions ≥12% up; 9:16: 250/430/90).
- Voice: full listen; varied pauses; Whisper check has no misreads.
- Facts: every number/claim has a source in
vo_review.md; no "illustrative" data. - Mode: brief says neutral or advocacy; no copy contradicts it.
- Pacing: visual change every ≤5s.
- Disclosure: real "Paid for by" end card (political); DRAFT tag inside safe zone or removed for final. Report each item's result to the user before delivering.