Claude Skill

render-split-screen-creator

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

LLM Mart · 0 points · 3 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download gooseworks-ai-goose-skills-skills_ads_capabilities_render-split-screen-creator-e1592ee.zip · 12 KB
Part of gooseworks-ai/goose-skills — 44 skills

Install

skills CLI npx skills add https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/render-split-screen-creator
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install gooseworks-ai-goose-skills@llmmart
Git 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-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.
Files (goose-skills)
  • scripts
    • config.example.json 9.3 KB
      {
        "_comment": "Perplexity concept-10 'Bloomberg terminal' split-screen creator ad — THE WORKED EXAMPLE. Copy to config.json and edit. A ~40s 9:16 two-zone ad where an AI creator anchor (VEED Fabric lip-sync) fills the bottom ~48% and real Perplexity Computer UI screen-recordings run uncropped in the top ~52%, a 3px brand-color divider between. The creator delivers the WHOLE VO cold-to-camera and each top clip PROVES its VO line's claim. Pipeline: (1) lock the script into 6 scenes + ElevenLabs eleven_v3 with-timestamps VO + per-scene timing.json; (2) gpt-image creator anchor + ONE VEED Fabric 1.0 @720p lip-sync take of the whole VO (~$5.90); (3) source 16:9 top clips + the scene-1 hook graphic; (4) assemble.py two-zone composite (contain-fit + blurred-cover fill + 3px divider + creator slice), hard-concat + end card; (5) transcribe the ASSEMBLED cut + burn serif-accent word captions. Master 1080x1920 h264+aac 30fps, ~40.37s. See scripts/PIPELINE.md + clients/perplexity/ads/concept-10-bloomberg-terminal/HOW_TO.md.",
        "brand_name": "Perplexity",
        "campaign": "Perplexity Computer",
        "title": "Perplexity Computer — the analyst that just does it",
        "width": 1080,
        "height": 1920,
        "fps": 30,
        "aspect_ratio": "9:16",
        "duration_sec": 40.37,
        "layout": {
          "_comment": "Two-zone split. TOP ~52% (top_height 998) runs the 16:9 UI screen-recording contain-fit + a darkened blurred cover-scale fill of the SAME clip (never black/charcoal bars — trap L3). Brand-color divider (keep stacked heights EVEN: 998+4+918=1920, or libx264 rejects the odd frame — trap L6). BOTTOM ~48% is the creator lip-sync framed head-to-shoulders: scale-to-width x a small ZOOM (~1.15-1.2) then crop with a DOWNWARD offset so the face is upper-middle and the shoulders enter (a plain crop-toward-top shows only the head and cuts the shoulders — trap L7). Requires a MEDIUM chest-up anchor (see creator._comment).",
          "canvas_w": 1080,
          "canvas_h": 1920,
          "top_height": 998,
          "top_pct": 0.52,
          "bottom_pct": 0.48,
          "divider_px": 3,
          "divider_color": "#20808D",
          "top_fill": "blurred-cover",
          "bottom_fit": "cover-crop-top"
        },
        "creator": {
          "_comment": "ONE AI-creator anchor lip-synced to the WHOLE VO in ONE VEED Fabric 1.0 take @ 720p (480p reads soft). THE ANCHOR MUST BE a PHOTOREAL, candid MEDIUM chest-up shot at natural webcam distance (whole head with headroom + shoulders + upper chest, real lived-in room, anti-AI skin cues) — NOT a plain-background close-up headshot (reads as AI) and NOT a phone-selfie / arm-extended pose copied from another format (wrong for a fixed talking-head, and too-close can't be reframed). Watch the source video and match its creator distance. gpt-image-2, quality high, 1024x1536. VEED handles photoreal fine. VEED Fabric is a NO-ATOM paid step: image_url = the anchor, audio_url = voiceover/vo-arlo.mp3; ~$0.15/sec (~$5.90 for the 39s VO). Run its calls SEQUENTIALLY with sleep 3 — veed/fabric-1.0 storage-auth 403s under parallel load (trap L1). The example explored a 2nd voice (Brad) which DOUBLED the lip-sync spend (~+$6) — lock the voice first. Re-run VEED only when the anchor IMAGE changes; a crop/zoom tweak is a free re-assemble.",
          "anchor": "avatar/creator-anchor.png",
          "anchor_model": "gpt-image-2",
          "anchor_shot": "medium chest-up, natural webcam distance, headroom + shoulders — not a tight close-up, not a phone selfie",
          "lipsync_engine": "veed/fabric-1.0",
          "lipsync_resolution": "720p",
          "lipsync_provider": "fal",
          "lipsync_output": "avatar/concept-10-bloomberg-terminal-creator-arlo.mp4",
          "voice": "arlo",
          "voice_locked": true
        },
        "voiceover": {
          "_comment": "The creator delivers the ENTIRE VO cold-to-camera — the VO IS the audio bed (no music). ElevenLabs eleven_v3 with-timestamps -> voiceover/vo-arlo.mp3 + timestamp JSON. Per-scene start/end sliced from the char timestamps into voiceover/timing.json. speed 1.2 (creator-native VO reads ~1.15-1.2x).",
          "provider": "elevenlabs",
          "model": "eleven_v3",
          "endpoint": "with-timestamps",
          "speed": 1.2,
          "script_txt": "voiceover/script.txt",
          "outputs": {
            "audio": "voiceover/vo-arlo.mp3",
            "word_timings": "voiceover/vo-arlo.timestamps.json",
            "timing": "voiceover/timing.json"
          }
        },
        "scenes": [
          {
            "id": "S01",
            "role": "HOOK",
            "start": 0.0,
            "end": 5.602,
            "uses_top_clip": false,
            "vo": "Okay, this used to need a twenty-five-thousand-dollar-a-year terminal and an actual analyst to run it. Watch this.",
            "top_visual": "Scene-1 hook graphic — a kinetic '$25,000/year terminal + an analyst' stat title-card (HTML-rendered, NOT a demo clip).",
            "top_clip": "assets/scene-01-graphic.png",
            "top_start": 0.0,
            "top_end": 5.602,
            "notes": "Scene 1 is the designed hook graphic, not a product clip."
          },
          {
            "id": "S02",
            "role": "DEMO",
            "start": 6.105,
            "end": 14.725,
            "uses_top_clip": true,
            "vo": "I gave Perplexity Computer one prompt — basically, is NVIDIA undervalued, pull the comps, build the model, make it visual. And it just went.",
            "top_visual": "Perplexity Computer taking the one prompt and kicking off — the UI accepts the request and starts working.",
            "top_clip": "assets/scene-02-clip.mp4",
            "top_start": 0.0,
            "top_end": 8.6,
            "notes": "The clip shows the exact prompt going in and the tool starting."
          },
          {
            "id": "S03",
            "role": "DEMO",
            "start": 15.093,
            "end": 20.82,
            "uses_top_clip": true,
            "vo": "It spun up this whole team of little agents, pulling live market data across, like, nineteen AI models at the same time.",
            "top_visual": "The agents spinning up, live market data pulling across ~19 models simultaneously.",
            "top_clip": "assets/scene-03-clip.mp4",
            "top_start": 0.0,
            "top_end": 5.7,
            "notes": "Set top_start/top_end to the on-message window — never loop a short clip (trap L5)."
          },
          {
            "id": "S04",
            "role": "DEMO",
            "start": 21.092,
            "end": 27.244,
            "uses_top_clip": true,
            "vo": "And in a few minutes, it literally built a full valuation model AND deployed an interactive dashboard I can actually click around in.",
            "top_visual": "The full valuation model building + the interactive dashboard being clicked around in.",
            "top_clip": "assets/scene-04-clip.mp4",
            "top_start": 0.0,
            "top_end": 6.1,
            "notes": "The clip proves the model + dashboard claim as it is said."
          },
          {
            "id": "S05",
            "role": "DEMO",
            "start": 27.825,
            "end": 31.23,
            "uses_top_clip": true,
            "vo": "Oh — and it set itself to re-run automatically every time earnings drop.",
            "top_visual": "The automation / auto-re-run-on-earnings setting being enabled in the UI.",
            "top_clip": "assets/scene-05-clip.mp4",
            "top_start": 0.0,
            "top_end": 3.4,
            "notes": "One feature, shown."
          },
          {
            "id": "S06",
            "role": "PAYOFF_ENDCARD",
            "start": 31.55,
            "end": 39.358,
            "uses_top_clip": true,
            "vo": "Like, look at that. It didn't explain how I could do the analysis. It didn't give me steps. It just did the whole thing. That's Perplexity Computer.",
            "top_visual": "The finished dashboard into the Perplexity Computer end card (held on the last SHARP frame ~3s).",
            "top_clip": "assets/scene-06-clip.mp4",
            "top_start": 0.0,
            "top_end": 7.8,
            "endcard_clip_end": 7.8,
            "notes": "Note the last SHARP second before any fade-to-black as endcard.clip_end (trap L4)."
          }
        ],
        "endcard": {
          "_comment": "The Perplexity Computer end card held on the last SHARP frame ~3s. If the end-card clip fades to black, hold the last sharp second (clip_end), NOT the black tail (trap L4).",
          "clip": "assets/scene-06-clip.mp4",
          "clip_end": 7.8,
          "hold_sec": 3.0
        },
        "captions": {
          "_comment": "Word-level captions burned from the ASSEMBLED cut (transcribe master-precaption.mp4 with local faster-whisper, NOT vo-arlo.mp3 — concat drops inter-scene silence so the ad timeline != the VO timeline; trap L2). Sentence-aware chunking. concept-10 shipped serif-accent (after a kinetic-pop pass). Kept: master-precaption cut + captions/serif-accent.ass sidecar for restyle without re-render.",
          "source": "assembled-cut",
          "engine": "faster-whisper",
          "style": "serif-accent",
          "chunk": "sentence-aware word-level",
          "ass_sidecar": "captions/serif-accent.ass",
          "keep_precaption": true,
          "keep_ass_sidecar": true
        },
        "audio_mix": {
          "_comment": "The creator VO is the entire audio bed — no separate music to duck under. Body audio = the concatenated creator VO slices; the end card holds under the VO tail.",
          "duck_under_music": false,
          "loudness_lufs": -14,
          "bed": "creator_vo"
        },
        "post_production": {
          "vo": { "default": "on", "note": "the creator's ElevenLabs VO IS the audio bed; the lip-sync drives the mouth (no music)" },
          "captions": { "default": "on", "note": "word-level captions burned from the ASSEMBLED cut (serif-accent), tracking the ad timeline not the raw VO" },
          "divider": { "default": "on", "note": "a 3px brand-color divider between the two zones" },
          "endcard": { "default": "on", "note": "the Perplexity Computer end card held on the last sharp frame ~3s" }
        }
      }
      
    • PIPELINE.md 5.8 KB
      # Pipeline — split-screen creator
      
      How `config.example.json` maps to the real production steps. This capability
      ships a **config + this map** — the FREE assembly + captions stage. The worked
      example (Perplexity concept-10 "Bloomberg terminal") was produced by the per-scene
      paid steps plus the split-screen assembler + the caption burn.
      
      The steps run **in order** because each depends on the last: the script sets the
      scene count, the VO + its per-scene timing drive the bottom-zone slices, the
      locked voice + anchor drive the ONE VEED Fabric lip-sync take, the brand clips
      fill the top zone, assembly stitches the two zones, and captions come from the
      ASSEMBLED cut (not the raw VO).
      
      ## Field → source-step map
      
      | Config field | Phase | Source step | Paid? |
      |---|---|---|---|
      | `voiceover.*`, `scenes[].vo` | 1 VO | ElevenLabs `eleven_v3` with-timestamps (`create-vo-elevenlabs`) → vo mp3 + timestamp JSON | **PAID** (~$0.06) |
      | `scenes[].start/end`, `voiceover.outputs.timing` | 1 VO | slice per-scene start/end from the char timestamps → `timing.json` | free |
      | `creator.anchor` | 2 Creator | photoreal MEDIUM chest-up anchor, `gpt-image-2` (`create-image-gpt-image-fal`) | **PAID** (~$0.10) |
      | `creator.lipsync_*` | 2 Creator | **VEED Fabric 1.0 @ 720p — a NO-ATOM paid step** (`image_url` = anchor, `audio_url` = vo mp3) → creator lip-sync mp4 | **PAID** (~$5.90 / 39s) |
      | `scenes[].top_clip` + `top_start/top_end` | 3 Top | brand-owned 16:9 UI screen-recordings (S02–SN) + the scene-1 hook graphic | (brand-supplied) |
      | `layout.*`, `endcard.*`, assembly | 4 Assembly | the split-screen assembler — two-zone composite + hard-concat + end card → `master-precaption.mp4` | free |
      | `captions.*` | 5 Captions | transcribe the ASSEMBLED cut (local `faster-whisper`) → word-level ASS burn → `concept-<n>-final-ad.mp4` | free |
      
      ## 1. Voiceover (config `voiceover`, `scenes[].vo`) — PAID
      
      **Lock the script first** — ~6 scenes, one VO sentence per scene, each naming one
      claim. Call ElevenLabs `eleven_v3` on the **with-timestamps** endpoint → the vo
      mp3 + character-level timestamps. Slice per-scene start/end boundaries into
      `timing.json` (`{"scenes":[{"scene":N,"start":s,"end":e}]}`). Creator-native VO
      reads ~1.15–1.2×; apply `atempo` if it runs fast. **Lock the voice here** — a
      second voice doubles the VEED spend downstream. This is upstream of the capability.
      
      ## 2. Creator anchor + lip-sync (config `creator`) — PAID, no-atom VEED step
      
      A **photoreal MEDIUM chest-up** `gpt-image-2` anchor at a natural webcam distance —
      whole head with headroom, shoulders + upper chest, real lived-in room, anti-AI skin
      cues — **not** a plain-background close-up headshot and **not** a phone-selfie pose
      (borrow another format's realism, never its arm-extended framing). Watch the source
      video first and match its creator distance; get the anchor framing right BEFORE the
      lip-sync, since a too-close image can't be reframed in the composite. Then the
      **whole VO** lip-synced in **one VEED Fabric 1.0 take @ 720p** (`veed/fabric-1.0`,
      `image_url` = the portrait, `audio_url` = the vo mp3) → the creator lip-sync mp4.
      **VEED Fabric is a no-atom paid step** — there is no `create-lipsync-*` atom; it's
      an external FAL call (~$0.15/sec, ~$5.90 for a 39s VO). Always 720p — 480p reads
      soft in the bottom zone. Run the lip-sync call(s) **sequentially with a `sleep`** —
      `veed/fabric-1.0` storage-auths 403 under parallel load. Upstream of the capability;
      the lip-sync take is a supplied input.
      
      ## 3. Top-zone clips + hook graphic (config `scenes[].top_clip`)
      
      One brand-owned 16:9 UI screen-recording per demo scene (≥1920×1080), each showing
      exactly what its VO line says (the #1 quality lever). Render the scene-1 hook
      graphic (kinetic title-card / stat claim) separately. Confirm the end-card clip;
      note the last **sharp** second before any fade-to-black as `endcard.clip_end`.
      
      ## 4. Ad-spec + assembly (config `layout`, `scenes[].top_*`, `endcard`) — FREE
      
      Author the ad-spec (canvas 1080×1920, `top_height` ~998, `divider_color`, per-scene
      `top_clip` + `top_start`/`top_end`, `endcard.clip` + `clip_end`) and run the
      split-screen assembler. Per scene: TOP zone = the clip **contain-fit** + a darkened
      **blurred cover-scale of the same clip** filling the letterbox margins (never
      charcoal/black bars); a 3px brand-color divider (keep stacked heights EVEN, e.g.
      998+4+918=1920, or libx264 rejects the odd frame); BOTTOM zone = the creator lip-sync
      framed head-to-shoulders (scale-to-width × ZOOM ~1.15–1.2, then crop with a downward
      offset so the face is upper-middle and the shoulders enter — NOT a plain crop-toward-top,
      which cuts the shoulders). Tune zoom/offset visually (free re-assemble). **Never loop a
      short clip** — window it and the assembler speed-fits it. Hard-concat the scenes; body audio =
      the concatenated creator VO slices; append the end card holding the last sharp frame
      ~3s → `master-precaption.mp4`. Deterministic, $0.
      
      ## 5. Captions (config `captions`) — FREE
      
      **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 `master-precaption.mp4` with local `faster-whisper`, build
      word-level cues (sentence-aware chunking), and burn the ASS in the chosen style
      (`serif-accent`, `kinetic-pop`, `neon-glow`, `clean-bubble`) → `concept-<n>-final-ad.mp4`.
      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 composited with ffmpeg `overlay=…:enable='between(t,st,en)'` instead.
      
      Re-cuts (re-timed windows, a swapped blurred-fill, new caption chunking, a restyle, a
      longer end-card hold) reuse the existing VO / lip-sync / clips and cost **$0** — only
      steps 1–2 spend.
      
    • README.md 3.7 KB
      # render-split-screen-creator scripts — the FREE assembly
      
      `render-split-screen-creator` is the **deterministic, $0 assembly + captions
      stage** of the split-screen creator format. The paid stages (the VO, the
      gpt-image creator anchor, and the VEED Fabric 1.0 whole-VO lip-sync) are separate,
      upstream steps — `create-vo-elevenlabs`, `create-image-gpt-image-fal`, and a
      paid **VEED Fabric lip-sync (a no-atom step)**. This capability spends nothing —
      it takes 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 and stitches the finished
      master. Re-cuts (re-timed windows, a swapped blurred-fill, new caption chunking, a
      restyle, a longer end-card hold) reuse the existing VO / lip-sync / clips and cost
      **$0**.
      
      `config.example.json` is the worked example (Perplexity concept-10 "Bloomberg
      terminal", ~40s 1080×1920). `PIPELINE.md` maps every config block to its source
      step. This README documents the FREE assembly pieces that
      `render-split-screen-creator` owns.
      
      ## 1. Two-zone composite — top ~52% product clip, bottom ~48% creator
      
      Per scene the assembler builds a 1080×1920 frame in two zones. The TOP zone
      (`top_height` ~998, ~52%) runs the real 16:9 product/demo clip **contain-fit**
      (uncropped) — its letterbox margins filled with a darkened **blurred cover-scale of
      the same clip** (never charcoal/black bars — a flat bar reads cheap). The BOTTOM
      zone (~48%) is the creator lip-sync framed **head-to-shoulders**: scale-to-width × a
      small **ZOOM** (~1.15–1.2) then crop with a **downward offset** so the face sits
      upper-middle and the shoulders enter (a plain crop-toward-top shows only the head and
      cuts the shoulders — and needs a **medium chest-up** anchor to begin with, not a tight
      close-up). A 3px brand-color divider separates the zones — keep stacked heights **even**
      (998 + 4 + 918 = 1920), or libx264 rejects the odd frame.
      
      ## 2. Windowing — one claim per scene, never loop a short clip
      
      Each top clip is windowed (`top_start`/`top_end`) to the on-message segment that
      proves its VO line. If a clip is shorter than its scene, **do NOT loop it** (that
      replays into a sparse/black tail) — set the window and the assembler **speed-fits**
      it to the scene length.
      
      ## 3. Hard-concat + end card — last sharp frame, no black tail
      
      The scenes are **hard-concatenated** (no dissolves). The body audio is the
      concatenated creator VO slices timed per `timing.json` — the sung/spoken creator VO
      IS the bed, no separate music. The end card is appended 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.
      
      ## 4. Captions — from the ASSEMBLED cut, never the raw VO
      
      Captions come from transcribing the **assembled** cut (`master-precaption.mp4`) with
      local Whisper — **never the raw `vo.mp3`**. Concat drops inter-scene silence, so the
      ad timeline ≠ the VO timeline; only the final cut's audio yields correct caption
      timing. Build word-level cues (sentence-aware chunking) and burn the ASS in the
      chosen style (`serif-accent`, `kinetic-pop`, `neon-glow`, `clean-bubble`). 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
      composited with ffmpeg `overlay=…:enable='between(t,st,en)'` instead.
      
      ## 5. FFmpeg composite
      
      FFmpeg stitches the master — the two-zone composite per scene (contain-fit +
      blurred-cover fill + 3px divider + creator slice), hard-concat, append the end card
      holding ~3s, mux the creator VO, and `loudnorm I=-14`. Output is a 1080×1920 h264 +
      aac master. Deterministic, no paid calls, no keys — the VEED Fabric lip-sync is a
      supplied input, produced upstream.
      
  • tests
    • smoke-test.md 1.4 KB
      # Smoke Test
      
      Given the creator lip-sync take (a supplied VEED Fabric mp4) + the per-scene VO
      timing, one 16:9 top clip per scene with the scene-1 hook graphic, and the
      end-card clip, `render-split-screen-creator` assembles the master — the two-zone
      composite (top ~52% product clip contain-fit + blurred-cover fill, bottom ~48%
      creator slice, 3px divider), hard-concat on the scene, an end card held on the
      last sharp frame ~3s, the creator VO muxed, then word-level captions burned from
      the ASSEMBLED cut → 1080×1920 h264+aac (~40s).
      
      Pass when the assembly runs to a valid MP4 and:
      - one two-zone scene per VO scene, hard-cut on the scene (no crossfades); the top
        clip is contain-fit with a darkened blurred-cover fill (no black bars); the 3px
        brand-color divider is present;
      - each top clip is windowed (never looped into a sparse/black tail); the bottom
        zone is the creator lip-sync slice per the per-scene timing;
      - captions are word-level, transcribed from the ASSEMBLED cut (not the raw VO —
        concat drops inter-scene silence), burned in the chosen style;
      - the end card is on the last sharp frame (no fade-to-black tail); the creator VO
        is the entire audio bed — no separate music;
      - **no paid call is made** — the VO, the anchor, and the VEED Fabric lip-sync take
        come from the paid upstream steps (create-vo-elevenlabs / create-image-gpt-image-fal
        / the no-atom VEED Fabric lip-sync); this assembly is $0 and a re-cut reuses the
        existing assets.
      
  • SKILL.md 6.2 KB
    ---
    name: render-split-screen-creator
    description: 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.
    status: active
    ---
    
    # 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.
    
  • skill.meta.json 331 B
    {
      "slug": "render-split-screen-creator",
      "category": "capabilities",
      "domain": "ads",
      "tags": [
        "ads"
      ],
      "installation": {
        "base_command": "npx goose-skills install render-split-screen-creator",
        "supports": [
          "claude",
          "cursor",
          "codex"
        ]
      },
      "requires_skills": [
        "watch"
      ]
    }
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related