render-narrated-ugc-wardrobe-stitch
Assemble a narrated-UGC "stitch reply" ad from a config — a single spoken VO carries a verbatim testimonial while ~30 per-cut i2v clips (one creator across ~5 wardrobes in ~3 worlds, plus product B-roll) are each trimmed to their EDL window built from the VO's Whisper word bounda
Install
npx skills add https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/render-narrated-ugc-wardrobe-stitch
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install gooseworks-ai-goose-skills@llmmart
git clone https://github.com/gooseworks-ai/goose-skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole gooseworks-ai/goose-skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
render-narrated-ugc-wardrobe-stitch
Assemble a narrated-UGC "stitch reply" ad from a config: a fast-cut vertical testimonial where a single spoken VO carries a verbatim ~13-sentence reversal-hook monologue over ONE creator across ~5 wardrobe changes in ~3 micro-worlds, interspersed with product B-roll (capsule macro, unboxing, a landing-page scroll), ~30 hard cuts on the VO cadence, closing on a brand end card. This capability is the FREE, deterministic assembly — trim-to-EDL, hard-concat, the VO+music mix, the karaoke-pop caption burn, the landing-page zoompan, and the end-card append.
scripts/config.example.json is the worked example (Bioma "Do NOT buy Bioma Probiotics", ~37s
1080×1920 9:16, ~30 body cuts + a ~2s 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 stage — it spends nothing. The paid inputs are
separate capabilities — the spoken VO (create-vo-elevenlabs) Whisper-aligned so the WORD
BOUNDARIES set the cut grid; one locked creator (create-image-gpt-image-fal anchor + ~5 wardrobe
edits chained off the anchor) + 3 world wides + per-cut start-frames (create-image-fal product
composites); and one Veo/Seedance i2v clip per cut (create-video-fal). Given the VO +
vo-final.words.json + edl.json + one clip per cut + a Playwright landing-page PNG + the brand
end-card PNG, render-narrated-ugc-wardrobe-stitch trims each clip to its EDL window, hard-concats
on the VO cadence, mixes the VO over the ducked bed, burns the karaoke-pop captions, appends the
end card → the master. Re-cuts reuse the existing VO / start-frames / clips and cost $0.
Contract (the free assembly)
- The spoken VO carries the narrative — lock it FIRST. The VO IS the narration bed; the whole ad is cut to it. Never plan the cut grid before the VO is locked and Whisper-aligned.
- Build the EDL from the VO's Whisper word boundaries. ~30 role-tagged cuts (
hook,feature,reaction-insert,payoff-hold,b-roll-insert,landing-page); snap every cut window to the word boundaries. The payoff line gets a HELDpayoff-holdbeat (~3× mean shot length). - Hard cuts via
filter_complex concat, not the demuxer. Trim each clip to its EDL window and hard-concat withfilter_complex concat— the-f concatdemuxer drops the audio when a drawtext/scale step shaves a clip a few ms below its window. No dissolves. - Karaoke-pop captions on every word, throughout. From the VO's
vo-final.words.json(VEED Whisper preset, bold yellow), on every word; re-spell brand tokens Whisper mishears against the locked script ("synbiotic" over "symbiotic"; keep "I'ma" verbatim) — never edit the script to match Whisper. Captions are suppressed over the end card. If VEED mis-captions a brand token, hand-patch that sentence with local ASS karaoke. - Product B-roll breaks up the talking head. Capsule macro, unboxing, and a landing-page scroll are interspersed with the creator cuts. The landing-page scroll is FFmpeg zoompan over a Playwright-rendered PNG — not an i2v clip (i2v hallucinates the UI).
- VO over a ducked bed. Mix the optional instrumental bed sidechain-ducked UNDER the VO (−20dB, 20:1) so the VO stays clearly on top; the bed can drop in on the payoff beat.
- End card via the brand's real PNG — never AI-render brand text. Append the brand's real end-card PNG (~2s) on the tail, captions suppressed. A diffusion model garbles a wordmark.
- FFmpeg composite, deterministic, FREE. Trim-to-EDL,
filter_complex concat, VO+music mix, caption burn, landing-page zoompan, end-card append,loudnorm I=-14→ a 1080×1920 h264+aac master (~37s). No paid calls, no keys.
Files (goose-skills)
-
scripts
-
config.example.json 11.6 KB
{ "_comment": "Bioma 'Do NOT buy Bioma Probiotics' narrated-ugc-wardrobe-stitch — THE WORKED EXAMPLE. Copy to config.json and edit. A ~37s (34.8s body + ~2s end card) fast-cut narrated UGC 'stitch reply' where a single synthetic VO carries a verbatim ~13-sentence testimonial (the 'don't buy X... here's why you SHOULD' reversal hook) across ONE creator in 5 wardrobes + ~3 rooms, interspersed with product B-roll (capsule macro, unboxing, landing-page scroll). Pipeline: (1) lock the VO FIRST (ElevenLabs v3 + Whisper word-align — the word boundaries set the cut grid); (2) build a ~30-cut role-tagged EDL from the word boundaries; (3) lock the creator (gpt-image-2 anchor + 5 wardrobe edits chained off the anchor) + 3 world wides; (4) one start-frame per cut (gpt-image-2 creator + product composites + a Playwright landing-page); (5) one Veo 3.1 i2v clip per cut (verb-led, ~4s); (6) trim + filter_complex concat, VO+music sidechain-ducked mix, karaoke-pop captions throughout, brand end-card append. Master 1080x1920 h264+aac, ~36.8s. See scripts/PIPELINE.md for the source scripts.", "brand_name": "Bioma", "campaign": "Do NOT buy (recreation)", "title": "Do NOT buy Bioma Probiotics", "width": 1080, "height": 1920, "fps": 30, "aspect_ratio": "9:16", "duration_sec": 36.8, "body_end_s": 34.8, "end_card_hold_s": 2.0, "vo": { "_comment": "Locked FIRST — the VO + its Whisper WORD BOUNDARIES set the cut grid. Verbatim Whisper transcript of source/source-ad.mp4, locked 2026-06-02. ElevenLabs v3 (Professional Speaker) reads slow; atempo ~1.24x clamps to ~32s. Kept 'I'ma' verbatim (creator-native); locked 'synbiotic' over Whisper's 'symbiotic' homophone. Payoff line 'and just look at my belly.' lands the payoff-hold beat.", "provider": "elevenlabs", "model": "eleven_v3", "voice_id": "Fc5CaIGWKvLHapoOSM2K", "script_md": "script/script-locked.md", "hook_line": "Do not buy Bioma Probiotics.", "payoff_line": "and just look at my belly.", "target_duration_s": 30, "target_wpm": 180, "atempo_expected": 1.24, "settings": { "stability": 0.35, "similarity_boost": 0.75, "style": 0.55, "use_speaker_boost": true }, "outputs": { "audio": "audio/vo-final.mp3", "word_timings": "audio/vo-final.words.json" }, "sentences": [ { "n": "S01", "t_in": 0.0, "t_out": 1.8, "role": "hook · pattern-interrupt", "text": "Do not buy Bioma Probiotics." }, { "n": "S02", "t_in": 1.8, "t_out": 4.8, "role": "feature", "text": "They said it would reduce bloating and improve digestion." }, { "n": "S03", "t_in": 4.8, "t_out": 7.4, "role": "feature", "text": "Okay, but they did not warn me how fast it would work." }, { "n": "S04", "t_in": 7.4, "t_out": 10.5, "role": "feature · b-roll-insert", "text": "I've been taking these little capsules daily for only one week," }, { "n": "S05", "t_in": 10.5, "t_out": 12.8, "role": "payoff-hold", "text": "and just look at my belly." }, { "n": "S06", "t_in": 12.8, "t_out": 14.8, "role": "reaction-insert", "text": "Plus the puffiness in my face is gone." }, { "n": "S07", "t_in": 14.8, "t_out": 18.0, "role": "feature · b-roll-insert", "text": "The targeted synbiotic formula in here works like magic." }, { "n": "S08", "t_in": 18.0, "t_out": 20.5, "role": "feature", "text": "And I thought it was going to take at least three months," }, { "n": "S09", "t_in": 20.5, "t_out": 22.5, "role": "feature", "text": "but I started seeing changes after week one." }, { "n": "S10", "t_in": 22.5, "t_out": 25.5, "role": "reaction-insert", "text": "Y'all keep doing your crunches," }, { "n": "S11", "t_in": 25.5, "t_out": 26.5, "role": "feature", "text": "I'ma keep taking my Bioma." }, { "n": "S12", "t_in": 26.5, "t_out": 30.0, "role": "b-roll-insert · landing-page", "text": "Oh, and they're running a huge sale with free shipping and free gifts with your first order." }, { "n": "S13", "t_in": 30.0, "t_out": 32.5, "role": "feature · multi-bottle unboxing", "text": "I put the link below — go grab yours now before they're sold out again." } ] }, "character": { "_comment": "ONE recurring UGC creator, locked once. `descriptor` threads VERBATIM (byte-identical block) into every creator start-frame; the anchor is passed as the ref (--anchor) on EVERY wardrobe/pose edit so identity holds across all 5 wardrobe changes. Chain every wardrobe off the CLEAN anchor.", "name": "hailey", "method": "anchor-ref", "max_drift": 0.05, "descriptor": "28-year-old white-European woman, fit athletic build, 5'6, long blonde beach-wave hair center-parted at mid-back length, natural un-retouched skin with visible pores and subtle freckling, slightly asymmetrical features, natural full brows, minimal makeup. Small turquoise athletic wristband on right wrist.", "framing": "iPhone 14 front-cam selfie video still, slightly grainy and slightly soft, handheld with slight natural motion blur, real iPhone color science, slight wide-angle edge distortion, warm natural light, NOT sharp NOT studio NOT glam, photojournalistic UGC.", "anchor": "generated/character-lock/anchor-portrait.png", "wardrobes": [ "generated/character-lock/wardrobes/w1.png", "generated/character-lock/wardrobes/w2.png", "generated/character-lock/wardrobes/w3.png", "generated/character-lock/wardrobes/w4.png", "generated/character-lock/wardrobes/w5.png" ], "wardrobe_count": 5, "_note_w2": "W2 (gray tee + sweats, midriff MS, hem-lift pose) is the payoff-hold belly-reveal wardrobe (cut s11)." }, "worlds": { "_comment": "3 world wides, NO creator — the establishing rooms the creator start-frames composite into.", "count": 3, "briefs": ["bedroom / mirror room", "kitchen counter", "bathroom / vanity"], "outputs": [ "generated/world-lock/world1/world1-1-establishing.png", "generated/world-lock/world2/world2-1-establishing.png", "generated/world-lock/world3/world3-1-establishing.png" ] }, "product": { "_comment": "The real Bioma bottle hero drives the B-roll composites (capsule pile macro, single-capsule, label, unboxing flatlay). Ground on the real hero — never an AI-hallucinated bottle.", "hero_png": "../../brand-assets/product-photos/bioma-probiotics-bottle.png", "unboxing_ref": "../../brand-assets/product-photos/bioma-multi-bottle-unboxing.png" }, "landing_page": { "_comment": "The sale/CTA scroll cuts (s24-s26) are a Playwright render of the real Bioma landing page (2160x3840 @ 2x DSR) -> FFmpeg zoompan. NOT i2v. Zoom targets: wide -> Best Value $26.14 card -> Order-now button.", "url": "https://www.bioma.health/", "render_png": "assets/overlays/landing-page.png", "method": "playwright + ffmpeg-zoompan" }, "keyframe_engine": { "creator_model": "gpt-image-2", "broll_model": "nano-banana", "provider": "fal", "aspect_ratio": "9:16", "batch_size": 3, "character_ref": "pass the locked anchor + the matching wardrobe as media refs on every creator start-frame" }, "clip_engine": { "provider": "fal", "model": "veo3_1", "alternative": "seedance_2_0", "duration_sec": 4, "resolution": "1080p", "batch_size": 3, "motion_opener": "VERB-LED (never camera-led): the creator/product does a specific action, THEN any secondary motion. Stable start pose, action in the prompt. NO camera 'slow push-in' opener (reads static), NO morphing, single person only.", "_note": "Veo 3.1 via FAL @1080p, ~4s/clip. Cuts 24-26 (landing-page scroll) are FFmpeg zoompan, not i2v. gen_veo_retries.sh re-rolls any drifted clip off its clean start-frame." }, "edl": { "_comment": "30 role-tagged cuts built from the VO word boundaries (build_edl.py -> edl.json). archetype reaction-montage-explainer, caption_family karaoke-pop, pacing_profile front-load-hold-decelerate. The payoff-hold (s11) is the held reveal beat (~3x mean shot length). A representative subset is inlined here; the full 30-cut grid is edl.json.", "schema_version": "1.0", "cut_count": 30, "hook_type": "claim-caption", "caption_family": "karaoke-pop", "pacing_profile": "front-load-hold-decelerate", "payoff_hold_id": "s11-payoff-belly-reveal", "source": "edl.json", "timeline_sample": [ { "id": "s01-hook-bottle-mcu", "role": "hook", "t_in": 0.03, "t_out": 0.39, "source": "generate", "image_refs": ["anchor", "world1-establishing", "product-hero"] }, { "id": "s02-hook-hand-bottle-ecu", "role": "hook", "t_in": 0.39, "t_out": 2.27, "source": "generate", "image_refs": ["product-hero"] }, { "id": "s05-they-said-w4-hands", "role": "feature", "t_in": 3.99, "t_out": 5.29, "source": "generate", "image_refs": ["anchor", "w4", "world2-establishing"] }, { "id": "s08-capsule-pile-ecu", "role": "b-roll-insert", "t_in": 10.73, "t_out": 11.37, "source": "generate", "image_refs": ["product-hero"] }, { "id": "s11-payoff-belly-reveal", "role": "payoff-hold", "t_in": 14.21, "t_out": 15.65, "source": "generate", "image_refs": ["anchor", "w2", "world1-establishing"] }, { "id": "s21-changes-mirror-3q", "role": "feature", "t_in": 25.95, "t_out": 28.27, "source": "generate", "image_refs": ["anchor", "w3", "world1-establishing"] }, { "id": "s24-sale-landingpage-ws", "role": "landing-page", "t_in": 31.49, "t_out": 33.03, "source": "landing-page", "image_refs": ["landing-page-png"] }, { "id": "s25-sale-bestvalue-zoom", "role": "landing-page", "t_in": 33.03, "t_out": 34.69, "source": "landing-page", "image_refs": ["landing-page-png"] }, { "id": "s27-link-unboxing-flatlay", "role": "b-roll-insert", "t_in": 36.81, "t_out": 37.53, "source": "generate", "image_refs": ["unboxing-ref"] } ] }, "captions": { "_comment": "Karaoke-pop captions on EVERY word, throughout (VEED Whisper preset, bold yellow). Built from vo-final.words.json. Re-spell brand tokens Whisper mishears against the locked script: 'synbiotic' (not 'symbiotic'/'cymbiotic'); keep 'I'ma' verbatim. If VEED falls back to a wrong spelling on S07, hand-patch that sentence with local ASS karaoke.", "style": "karaoke-pop", "preset": "veed-whisper", "position": "center", "base_color": "#FFFFFF", "accent_color": "#FFE800", "font": "bold", "source": "audio/vo-final.words.json", "on_every_word": true, "throughout": true, "respell_tokens": { "symbiotic": "synbiotic", "cymbiotic": "synbiotic" } }, "audio_mix": { "_comment": "The VO is the narration bed; the whole ad is cut to it. An instrumental music bed is sidechain-ducked UNDER the VO (-20dB, 20:1), dropping in at 14.21s (the payoff-hold). VO stays clearly on top. End card appended after the body.", "vo": "audio/vo-final.mp3", "music": "audio/music/bed.mp3", "music_optional": true, "ducking": "sidechain-20:1", "music_gain_db": -20, "music_drop_s": 14.21, "loudness_lufs": -14 }, "end_card": { "_comment": "The real Bioma end-card PNG appended ~2s on the tail — NEVER AI-rendered text. Captions suppressed over the card.", "brand_png": "../../brand-assets/bioma-end-card.png", "hold_sec": 2.0, "suppress_captions": true }, "post_production": { "vo": { "default": "on", "note": "the synthetic VO IS the narration; the whole ad is cut to its word timings" }, "music": { "default": "on", "note": "instrumental bed sidechain-ducked under the VO (-20dB, 20:1), VO clearly on top" }, "captions": { "default": "on", "note": "karaoke-pop captions on every word, throughout, re-spelled against the locked script" }, "end_card": { "default": "on", "note": "the real Bioma end-card PNG appended ~2s on the tail, captions suppressed, never AI-rendered" } } } -
PIPELINE.md 6.1 KB
# Pipeline — narrated-ugc-wardrobe-stitch How `config.example.json` maps to the real production steps. This capability is the FREE assembly; the worked example (Bioma "Do NOT buy Bioma Probiotics") was produced by the video-orchestrator's per-state steps plus per-project drivers that live in `clients/bioma/ad-runs/run-12-narrated-do-not-buy-recreation/working/` (`render_and_align_vo.sh`, `build_edl.py`, `gen_anchors_and_worlds.sh`, `gen_wardrobe_variants.sh`, `gen_startframes_*.sh`, `gen_veo_*.sh`, `stitch_full_master.sh`). Reference those directly, or drive the whole run via `video-orchestrator-with-control-plane`. The seven steps run **in order** because each depends on the last: the VO sets the timeline (via its Whisper word boundaries), the word boundaries build the EDL, the EDL drives the cut count, the locked creator + worlds drive the wardrobe edits, the wardrobes + worlds seed the per-cut start-frames, the start-frames seed the i2v clips, and assembly stitches all of it with the VO, captions, and end card. ## Field → source-script map | Config field | Phase | Source step / script (in the run) | Paid? | |---|---|---|---| | `vo.script_md`, `vo.voice_id`, `vo.settings`, `vo.model` | 1 VO | ElevenLabs v3 render of the locked testimonial | **PAID** | | `vo.outputs.word_timings` | 1 VO | Whisper word-align (`transcribe-audio-fal`) → `audio/vo-final.words.json` | ~$0.10 (Whisper) | | `edl.*`, `edl.timeline[].t_in/t_out/role/source` | 2 EDL | `working/build_edl.py` from the VO word boundaries → `edl.json` (~30 cuts) | free | | `character.descriptor`, `character.anchor`, `worlds[]` | 3 Creator/Worlds | `working/gen_anchors_and_worlds.sh` → gpt-image-2 anchor + 3 world wides | **PAID** | | `character.wardrobes` | 3 Creator | `working/gen_wardrobe_variants.sh` → 5 wardrobe edits chained off the anchor | **PAID** | | `edl.timeline[].source` start-frames, `keyframe_engine` | 4 Start-frames | `working/gen_startframes_*.sh` → gpt-image-2 (creator) + product composites | **PAID** | | `landing_page.render_png`, `landing_page.method` | 4 Start-frames | Playwright render of the real page → `assets/overlays/landing-page.png` | free (no gen atom) | | `clip_engine` | 5 Clips | `working/gen_veo_*.sh` → Veo 3.1 i2v @1080p → `clips/scene-NN.mp4` | **PAID** | | `captions` | 6 Captions | karaoke-pop from `vo-final.words.json` (VEED Whisper preset), re-spelled against the locked script | free (paid VEED burn) | | `landing_page` scroll cuts | 6 Assembly | `working/stitch_full_master.sh` FFmpeg zoompan over `landing-page.png` (NOT i2v) | free | | `audio_mix`, `end_card`, `edl.timeline[].t_in/t_out` | 6 Assembly | `working/stitch_full_master.sh` (trim + `filter_complex concat`, VO+music mix, caption burn, end-card append) → `edits/master-final-v4.mp4` | free | ## 1. VO → ElevenLabs v3 + Whisper word-align (config: `vo`) [PAID] **Lock the VO FIRST — it sets the timeline.** Render the verbatim ~13-sentence testimonial with ElevenLabs v3 (`vo.voice_id` + `vo.settings`), atempo-clamp to the target pace (~1.24× → ~30–32s), then Whisper word-align → `audio/vo-final.mp3` + `audio/vo-final.words.json`. The word boundaries set the cut grid. Keep the testimonial verbatim ("I'ma" kept; "synbiotic" locked over Whisper's "symbiotic"). ## 2. EDL → `working/build_edl.py` (config: `edl`) [FREE] From the VO word boundaries, build ~30 role-tagged cuts → `edl.json` (`hook`, `feature`, `reaction-insert`, `payoff-hold`, `b-roll-insert`, `landing-page`). The payoff line gets a HELD `payoff-hold` beat. Each cut binds its start-frame `source` + `image_refs`. ## 3. Creator + worlds → gpt-image-2 anchor + wardrobes + world wides (config: `character`, `worlds`) [PAID] `gen_anchors_and_worlds.sh` fires the gpt-image-2 anchor with the verbatim `character.descriptor` + 3 world wides (no creator). `gen_wardrobe_variants.sh` chains 5 wardrobe edits off the anchor (`--anchor` on every call so identity locks). Re-roll off the CLEAN anchor on any drift. ## 4. Per-cut start-frames → gpt-image-2 + product composites + Playwright (config: `edl.timeline[].source`, `keyframe_engine`, `landing_page`) [PAID] Per cut, one start-frame. Creator cuts = gpt-image-2/edit off the matching wardrobe + world wide. Product B-roll = capsule/unboxing composites grounded on the real `product.hero_png`. Landing-page cuts = a Playwright render → `assets/overlays/landing-page.png` (the scroll is FFmpeg zoompan in assembly — NOT i2v). Review before step 5. ## 5. Clips → Veo 3.1 i2v (config: `clip_engine`) [PAID] Per start-frame, prompt = `clip_engine.motion_opener` + the cut's action; Veo 3.1 via FAL i2v, ~4s, 9:16, 1080p, off the clean start-frame → `clips/scene-NN.mp4`. **Lead with the VERB, not the camera** — camera-led openers read static; use STABLE-POSE start-frames + put the action in the prompt (mid-action keyframes freeze). The landing-page-scroll cuts are FFmpeg zoompan, NOT i2v. ## 6. Captions + end card + assembly → `working/stitch_full_master.sh` (config: `captions`, `audio_mix`, `end_card`) - Captions — karaoke-pop from `vo-final.words.json` (VEED Whisper preset, bold yellow), on every word, throughout. Re-spell brand tokens Whisper mishears against the locked script; suppress over the end card. If the host ffmpeg lacks libass, render the cues as timed PIL PNG overlays composited with ffmpeg `overlay=…:enable='between(t,st,en)'` — same placement, no libass dependency. - Assembly (`stitch_full_master.sh`) — trim each clip to its EDL window, build the landing-page scroll cuts via FFmpeg zoompan over `landing-page.png`, **`filter_complex concat`** all ~30 trimmed cuts (NOT the demuxer — it drops audio on a duration mismatch), mix the VO with an optional sidechain-ducked instrumental bed (−20dB, 20:1, `music_drop_s` 14.21) so the VO stays on top, burn the caption ASS, append the brand's real end-card PNG (~2s), `loudnorm I=-14` → `edits/master-final.mp4` (1080×1920, 30fps, h264+aac, ~36.8s). Re-cuts (new caption timing, re-timed windows, an end-card swap) reuse the existing VO/start-frames/clips and cost **$0** — only steps 1, 3, 4, 5 spend. -
README.md 3.8 KB
# render-narrated-ugc-wardrobe-stitch scripts — the FREE assembly `render-narrated-ugc-wardrobe-stitch` is the **deterministic, $0 assembly stage** of the narrated-UGC "stitch reply" format. The paid stages (the spoken VO, the creator lock, the ~5 wardrobe edits + 3 world wides, the ~30 per-cut start-frames, the ~30 Veo/Seedance i2v clips) are separate capabilities — `create-vo-elevenlabs`, `create-image-gpt-image-fal`, `create-image-fal`, `create-video-fal`. This capability spends nothing — it takes the VO + `vo-final.words.json` + `edl.json` + one clip per cut + a Playwright landing-page PNG + the brand end-card PNG and stitches the finished master. Re-cuts (new caption timing, re-timed windows, an end-card swap) reuse the existing VO / start-frames / clips and cost **$0**. `config.example.json` is the worked example (Bioma "Do NOT buy Bioma Probiotics", ~37s 1080×1920). `PIPELINE.md` maps every config block to its source step. This README documents the FREE assembly pieces that `render-narrated-ugc-wardrobe-stitch` owns. ## 1. Build the EDL from the VO's word boundaries The VO is Whisper word-aligned (`vo-final.words.json`), and `build_edl.py` builds ~30 role-tagged cuts from those word boundaries → `edl.json`. Roles — `hook`, `feature`, `reaction-insert`, `payoff-hold`, `b-roll-insert`, `landing-page`. The payoff line gets a HELD `payoff-hold` beat (~3× mean shot length). One shot per cut; snap every cut window to the word boundaries so every hard cut lands on the narration cadence. ## 2. Trim-to-EDL + hard-concat via `filter_complex concat` Assembly trims each body clip to its EDL window and hard-concats **on the VO cadence** with `filter_complex concat` — **never the `-f concat` demuxer**, which drops the audio when a drawtext/scale step shaves a clip a few ms below its window. No dissolves. The payoff clip is timed so the payoff line lands on the held reveal beat. ## 3. Product B-roll — landing-page scroll is zoompan, not i2v Capsule macro, unboxing, and a landing-page scroll break up the talking-head cuts the way a real stitch reply does. The landing-page scroll is FFmpeg **zoompan** over a Playwright-rendered PNG (the Bioma run rendered `landing-page.png` at 2160×3840 and zoomed wide → best-value card → order button) — it is **not** an i2v clip, because i2v hallucinates the UI. The capsule/unboxing composites come from the paid start-frame stage grounded on the real product hero. ## 4. Karaoke-pop captions — from the VO word timings, re-spelled against the locked script Captions come from the VO's `vo-final.words.json` (VEED Whisper preset, bold yellow), on every word, throughout. Re-spell brand tokens Whisper mishears against the locked script ("synbiotic" over "symbiotic"; keep "I'ma" verbatim) — never edit the script to match Whisper. Captions are suppressed over the end card. If the host ffmpeg lacks libass (no `subtitles`/`ass` filter), render the cues as timed PIL PNG overlays composited with ffmpeg `overlay=…:enable='between(t,st,en)'` instead — same placement, no libass dependency. ## 5. VO + music mix + end card + composite - **Audio:** the VO IS the narration bed (the whole ad is cut to it). Mix the VO over an optional instrumental bed sidechain-ducked UNDER the VO (−20dB, 20:1) so the VO stays clearly on top; the bed can drop in on the payoff beat. - **End card:** append the brand's real end-card PNG (~2s) on the tail, captions suppressed. The brand text is **never** AI-rendered — a diffusion model garbles a wordmark. - **Composite:** FFmpeg trims each cut to its window, builds the landing-page zoompan cuts, `filter_complex concat`s all ~30 cuts, mixes the VO + bed, burns the caption ASS, appends the end card, and `loudnorm I=-14` → a 1080×1920 h264 + aac master (~37s). Deterministic, no paid calls, no keys.
-
-
tests
-
smoke-test.md 1.6 KB
# Smoke Test Given the spoken VO (mp3 + Whisper word timings), a ~30-cut role-tagged EDL built from those word boundaries, one i2v clip per cut (ONE recurring locked creator across ~5 wardrobes in ~3 worlds, plus product B-roll), a Playwright landing-page PNG, and the brand end-card PNG, `render-narrated-ugc-wardrobe-stitch` assembles the master: trim each clip to its EDL window, hard-concat on the VO cadence via `filter_complex concat`, burn karaoke-pop captions, mix the VO over the ducked bed, close on the brand end-card PNG → 1080×1920 h264+aac (~37s). Pass when the assembly runs to a valid MP4 and: - one shot per EDL cut, hard-cut on the VO cadence via `filter_complex concat` (no crossfades, no demuxer — the demuxer drops audio on a duration mismatch); the ONE locked creator holds across all ~5 wardrobes; - the payoff line lands on the held `payoff-hold` beat; - captions are karaoke-pop on every word, throughout, re-spelled against the locked script ("synbiotic" over "symbiotic"), suppressed over the end card; - the product B-roll reads — capsule macro, unboxing, and a landing-page scroll rendered as FFmpeg zoompan over the Playwright PNG (not i2v); - the VO plays clearly on top of the optional sidechain-ducked instrumental bed (−20dB, 20:1) — VO not buried; - the end card is the brand's real PNG (never AI-rendered text), song/VO carrying to the tail with no silent tail; - **no paid call is made** — the VO, creator, start-frames, and clips come from the paid capabilities (create-vo-elevenlabs / create-image-gpt-image-fal / create-image-fal / create-video-fal); this assembly is $0 and a re-cut reuses the existing assets.
-
-
SKILL.md 4.9 KB
--- name: render-narrated-ugc-wardrobe-stitch description: Assemble a narrated-UGC "stitch reply" ad from a config — a single spoken VO carries a verbatim testimonial while ~30 per-cut i2v clips (one creator across ~5 wardrobes in ~3 worlds, plus product B-roll) are each trimmed to their EDL window built from the VO's Whisper word boundaries and hard-concatenated via filter_complex concat (never the demuxer, which drops audio on a duration mismatch), the VO mixed over an optional sidechain-ducked instrumental bed (−20dB, 20 to 1) so the VO stays on top, karaoke-pop captions burned on every word throughout (VEED Whisper preset, re-spelled against the locked script), a landing-page scroll rendered as FFmpeg zoompan over a Playwright PNG (not i2v), and closed on the brand's real end-card PNG — never AI-rendered text. This is the FREE deterministic assembly stage (trim-to-EDL + filter_complex concat + VO and music mix + karaoke captions + landing-page zoompan + end-card append); the VO, creator, start-frames, and clips come from create-vo-elevenlabs / create-image-gpt-image-fal / create-image-fal / create-video-fal. Use for the narrated-ugc-wardrobe-stitch format. status: active --- # render-narrated-ugc-wardrobe-stitch Assemble a **narrated-UGC "stitch reply"** ad from a config: a fast-cut vertical testimonial where a single spoken VO carries a verbatim ~13-sentence reversal-hook monologue over ONE creator across ~5 wardrobe changes in ~3 micro-worlds, interspersed with product B-roll (capsule macro, unboxing, a landing-page scroll), ~30 hard cuts on the VO cadence, closing on a brand end card. This capability is the **FREE, deterministic assembly** — trim-to-EDL, hard-concat, the VO+music mix, the karaoke-pop caption burn, the landing-page zoompan, and the end-card append. `scripts/config.example.json` is the worked example (Bioma "Do NOT buy Bioma Probiotics", ~37s 1080×1920 9:16, ~30 body cuts + a ~2s 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 stage — it spends nothing. The paid inputs are separate capabilities — the spoken VO (`create-vo-elevenlabs`) Whisper-aligned so the WORD BOUNDARIES set the cut grid; one locked creator (`create-image-gpt-image-fal` anchor + ~5 wardrobe edits chained off the anchor) + 3 world wides + per-cut start-frames (`create-image-fal` product composites); and one Veo/Seedance i2v clip per cut (`create-video-fal`). Given the VO + `vo-final.words.json` + `edl.json` + one clip per cut + a Playwright landing-page PNG + the brand end-card PNG, `render-narrated-ugc-wardrobe-stitch` trims each clip to its EDL window, hard-concats on the VO cadence, mixes the VO over the ducked bed, burns the karaoke-pop captions, appends the end card → the master. Re-cuts reuse the existing VO / start-frames / clips and cost **$0**. ## Contract (the free assembly) - **The spoken VO carries the narrative — lock it FIRST.** The VO IS the narration bed; the whole ad is cut to it. Never plan the cut grid before the VO is locked and Whisper-aligned. - **Build the EDL from the VO's Whisper word boundaries.** ~30 role-tagged cuts (`hook`, `feature`, `reaction-insert`, `payoff-hold`, `b-roll-insert`, `landing-page`); snap every cut window to the word boundaries. The payoff line gets a HELD `payoff-hold` beat (~3× mean shot length). - **Hard cuts via `filter_complex concat`, not the demuxer.** Trim each clip to its EDL window and hard-concat with `filter_complex concat` — the `-f concat` demuxer drops the audio when a drawtext/scale step shaves a clip a few ms below its window. No dissolves. - **Karaoke-pop captions on every word, throughout.** From the VO's `vo-final.words.json` (VEED Whisper preset, bold yellow), on every word; re-spell brand tokens Whisper mishears against the locked script ("synbiotic" over "symbiotic"; keep "I'ma" verbatim) — never edit the script to match Whisper. Captions are suppressed over the end card. If VEED mis-captions a brand token, hand-patch that sentence with local ASS karaoke. - **Product B-roll breaks up the talking head.** Capsule macro, unboxing, and a landing-page scroll are interspersed with the creator cuts. The landing-page scroll is FFmpeg **zoompan** over a Playwright-rendered PNG — **not** an i2v clip (i2v hallucinates the UI). - **VO over a ducked bed.** Mix the optional instrumental bed sidechain-ducked UNDER the VO (−20dB, 20:1) so the VO stays clearly on top; the bed can drop in on the payoff beat. - **End card via the brand's real PNG — never AI-render brand text.** Append the brand's real end-card PNG (~2s) on the tail, captions suppressed. A diffusion model garbles a wordmark. - **FFmpeg composite, deterministic, FREE.** Trim-to-EDL, `filter_complex concat`, VO+music mix, caption burn, landing-page zoompan, end-card append, `loudnorm I=-14` → a 1080×1920 h264+aac master (~37s). No paid calls, no keys. -
skill.meta.json 347 B
{ "slug": "render-narrated-ugc-wardrobe-stitch", "category": "capabilities", "domain": "ads", "tags": [ "ads" ], "installation": { "base_command": "npx goose-skills install render-narrated-ugc-wardrobe-stitch", "supports": [ "claude", "cursor", "codex" ] }, "requires_skills": [ "watch" ] }
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.