render-split-screen-creator
Assemble a split-screen creator ad from a config: a two-zone vertical
(1080×1920, 9:16, ~40s) format where an AI creator talking-head anchors the
BOTTOM ~48% of the frame and real 16:9 product/demo clips run uncropped in
the TOP ~52%, a 3px brand-color divider between the zones. The creator delivers
the whole VO cold-to-camera and each top clip proves the claim its VO line makes.
This capability is the FREE, deterministic assembly + captions — the two-zone
composite (contain-fit + blurred-cover fill + divider + creator slice), the
hard-concat, the end card, and the word-level caption burn from the assembled cut.
scripts/config.example.json is the worked example (Perplexity concept-10
"Bloomberg terminal", ~40s 1080×1920 9:16, 6 scenes + an end card);
scripts/PIPELINE.md maps every config block to its source step and
scripts/README.md documents the free assembly.
Run
This is the FREE, deterministic assembly + captions stage — it spends
nothing. The paid inputs are separate steps — the VO (create-vo-elevenlabs,
ElevenLabs eleven_v3 with-timestamps, sliced into per-scene windows), the
photoreal MEDIUM chest-up AI-creator anchor (create-image-gpt-image-fal,
gpt-image-2) — shot at a natural webcam distance (headroom + shoulders, real
room), not a plain-background close-up headshot (see the anchor note below), and
the whole-VO lip-sync (a paid VEED Fabric 1.0 @ 720p take — a no-atom step,
image_url = the anchor, audio_url = the vo mp3, ~$0.15/sec, ~$5.90 for a 39s
VO; run its calls sequentially, veed/fabric-1.0 storage-auths 403 under
parallel load). Given the creator lip-sync take + the per-scene VO timing + one
16:9 top clip per scene + the scene-1 hook graphic + the end-card clip,
render-split-screen-creator composites the two zones, hard-concats the scenes,
appends the end card, transcribes the assembled cut, and burns the captions → the
master. Re-cuts reuse the existing VO / lip-sync / clips and cost $0.
Contract (the free assembly)
- Two-zone split, top ~52% / creator ~48%. The TOP zone runs the real 16:9
product/demo clip contain-fit (uncropped), the BOTTOM zone is the creator
lip-sync framed head-to-shoulders: scale-to-width × a small ZOOM (~1.15–1.2)
then crop the zone with a downward offset so the face sits upper-middle and the
shoulders enter the bottom. (A plain cover + crop-toward-top shows only the head and
cuts the shoulders — and it can't rescue an anchor that was shot too close; fix the
anchor distance first.) Tune zoom/offset visually against the source video's creator
framing — it's a FREE re-assemble, no VEED re-run. A 3px brand-color divider separates
the zones. Canvas 1080×1920,
top_height ~998. Keep every stacked height EVEN
(998 + 4 divider + 918 = 1920) — libx264 rejects odd dimensions.
- Anchor = photoreal MEDIUM shot, not a studio headshot. The lip-sync only looks as
good as the anchor. It must be photoreal/candid (real lived-in room, natural skin
cues), framed chest-up at a natural webcam distance (headroom + shoulders), not a
plain-background close-up and not a phone-selfie pose copied from another format
(e.g.
ugc-walk-and-talk). VEED Fabric handles photoreal fine (unlike Seedance).
- Blurred-cover fill, never black bars. The top clip's letterbox margins are
filled with a darkened blurred cover-scale of the same clip — a flat
charcoal/black bar reads cheap.
- One claim per scene, shown as it's said. Each top clip is windowed
(
top_start/top_end) to the on-message segment that proves its VO line.
Never loop a short clip — set the window and the assembler speed-fits it to
the scene (looping replays into a sparse/black tail).
- The creator VO is the entire audio bed — no separate music. Body audio =
the concatenated creator VO slices, timed per the per-scene
timing.json; the
lip-sync drives the mouth.
- Hard-concat the scenes; end card on the last SHARP frame. Hard-cut concat
(no dissolves); append the end card holding the last sharp frame ~3s. If the
end-card clip fades to black, hold the last sharp second (
endcard.clip_end),
not the black tail.
- Caption the ASSEMBLED cut, not the raw VO. Concat drops inter-scene
silence, so the ad timeline ≠ the VO timeline; only the final cut's audio
yields correct caption timing. Transcribe the assembled cut with local Whisper,
build word-level cues (sentence-aware chunking), burn the ASS in the chosen
style (
serif-accent, kinetic-pop, …). Keep the -precaption cut + the
.ass sidecar so captions restyle without re-rendering the composite. If the
host ffmpeg lacks libass, render the cues as timed PIL PNG overlays (ffmpeg
overlay=…:enable='between(t,st,en)') at the same placement.
- FFmpeg composite, deterministic, FREE. Two-zone composite per scene,
hard-concat, append the end card, mux the creator VO,
loudnorm I=-14 → a
1080×1920 h264+aac master. No paid calls, no keys — the VEED Fabric lip-sync is
a supplied input, produced upstream.
1---
2name: render-split-screen-creator
3description: Assemble a split-screen creator ad from a config — a two-zone vertical composite where a supplied AI-creator lip-sync take fills the BOTTOM ~48% while real 16:9 product/demo clips run uncropped in the TOP ~52%, each top clip contain-fit with a darkened blurred cover-scale fill of the same clip (never black bars), a 3px brand-color divider between the zones, the creator slice cover-fit per the per-scene VO timing, scenes hard-concatenated with the body audio being the concatenated creator VO slices, an end card held on the last sharp frame ~3s, then the ASSEMBLED cut transcribed with local Whisper (not the raw VO — concat drops inter-scene silence) and word-level captions burned in the chosen style. This is the FREE deterministic assembly + caption stage (two-zone composite + blurred fill + divider + hard-concat + end card + captions); the VO comes from create-vo-elevenlabs, the anchor from create-image-gpt-image-fal, and the whole-VO lip-sync from a paid VEED Fabric 1.0 take (a no-atom upstream input). Use for the split-screen-creator format.
4status: active
5---
6
7# render-split-screen-creator
8
9Assemble a **split-screen creator** ad from a config: a two-zone vertical
10(1080×1920, 9:16, ~40s) format where an **AI creator talking-head** anchors the
11BOTTOM ~48% of the frame and **real 16:9 product/demo clips** run uncropped in
12the TOP ~52%, a 3px brand-color divider between the zones. The creator delivers
13the whole VO cold-to-camera and each top clip proves the claim its VO line makes.
14This capability is the **FREE, deterministic assembly + captions** — the two-zone
15composite (contain-fit + blurred-cover fill + divider + creator slice), the
16hard-concat, the end card, and the word-level caption burn from the assembled cut.
17
18`scripts/config.example.json` is the worked example (Perplexity concept-10
19"Bloomberg terminal", ~40s 1080×1920 9:16, 6 scenes + an end card);
20`scripts/PIPELINE.md` maps every config block to its source step and
21`scripts/README.md` documents the free assembly.
22
23## Run
24
25This is the **FREE, deterministic** assembly + captions stage — it spends
26nothing. The paid inputs are separate steps — the VO (`create-vo-elevenlabs`,
27ElevenLabs `eleven_v3` with-timestamps, sliced into per-scene windows), the
28**photoreal MEDIUM chest-up** AI-creator anchor (`create-image-gpt-image-fal`,
29`gpt-image-2`) — shot at a natural webcam distance (headroom + shoulders, real
30room), **not** a plain-background close-up headshot (see the anchor note below), and
31the whole-VO lip-sync (a **paid VEED Fabric 1.0 @ 720p take — a no-atom step**,
32`image_url` = the anchor, `audio_url` = the vo mp3, ~$0.15/sec, ~$5.90 for a 39s
33VO; run its calls sequentially, `veed/fabric-1.0` storage-auths 403 under
34parallel load). Given the creator lip-sync take + the per-scene VO timing + one
3516:9 top clip per scene + the scene-1 hook graphic + the end-card clip,
36`render-split-screen-creator` composites the two zones, hard-concats the scenes,
37appends the end card, transcribes the assembled cut, and burns the captions → the
38master. Re-cuts reuse the existing VO / lip-sync / clips and cost **$0**.
39
40## Contract (the free assembly)
41
42- **Two-zone split, top ~52% / creator ~48%.** The TOP zone runs the real 16:9
43 product/demo clip **contain-fit** (uncropped), the BOTTOM zone is the creator
44 lip-sync framed **head-to-shoulders**: scale-to-width × a small **ZOOM** (~1.15–1.2)
45 then crop the zone with a **downward offset** so the face sits upper-middle and the
46 shoulders enter the bottom. (A plain cover + crop-toward-top shows only the head and
47 cuts the shoulders — and it can't rescue an anchor that was shot too close; fix the
48 anchor distance first.) Tune zoom/offset visually against the source video's creator
49 framing — it's a FREE re-assemble, no VEED re-run. A 3px brand-color divider separates
50 the zones. Canvas 1080×1920, `top_height` ~998. **Keep every stacked height EVEN**
51 (998 + 4 divider + 918 = 1920) — libx264 rejects odd dimensions.
52- **Anchor = photoreal MEDIUM shot, not a studio headshot.** The lip-sync only looks as
53 good as the anchor. It must be photoreal/candid (real lived-in room, natural skin
54 cues), framed chest-up at a natural webcam distance (headroom + shoulders), **not** a
55 plain-background close-up and **not** a phone-selfie pose copied from another format
56 (e.g. `ugc-walk-and-talk`). VEED Fabric handles photoreal fine (unlike Seedance).
57- **Blurred-cover fill, never black bars.** The top clip's letterbox margins are
58 filled with a darkened **blurred cover-scale of the same clip** — a flat
59 charcoal/black bar reads cheap.
60- **One claim per scene, shown as it's said.** Each top clip is windowed
61 (`top_start`/`top_end`) to the on-message segment that proves its VO line.
62 **Never loop a short clip** — set the window and the assembler speed-fits it to
63 the scene (looping replays into a sparse/black tail).
64- **The creator VO is the entire audio bed — no separate music.** Body audio =
65 the concatenated creator VO slices, timed per the per-scene `timing.json`; the
66 lip-sync drives the mouth.
67- **Hard-concat the scenes; end card on the last SHARP frame.** Hard-cut concat
68 (no dissolves); append the end card holding the last sharp frame ~3s. If the
69 end-card clip fades to black, hold the last sharp second (`endcard.clip_end`),
70 not the black tail.
71- **Caption the ASSEMBLED cut, not the raw VO.** Concat drops inter-scene
72 silence, so the ad timeline ≠ the VO timeline; only the final cut's audio
73 yields correct caption timing. Transcribe the assembled cut with local Whisper,
74 build word-level cues (sentence-aware chunking), burn the ASS in the chosen
75 style (`serif-accent`, `kinetic-pop`, …). Keep the `-precaption` cut + the
76 `.ass` sidecar so captions restyle without re-rendering the composite. If the
77 host ffmpeg lacks libass, render the cues as timed PIL PNG overlays (ffmpeg
78 `overlay=…:enable='between(t,st,en)'`) at the same placement.
79- **FFmpeg composite, deterministic, FREE.** Two-zone composite per scene,
80 hard-concat, append the end card, mux the creator VO, `loudnorm I=-14` → a
81 1080×1920 h264+aac master. No paid calls, no keys — the VEED Fabric lip-sync is
82 a supplied input, produced upstream.