B-roll Story (avatar doing an activity)
The action / demonstration counterpart of the broll skills. Where
broll-generator synthesizes presenter-free B-roll and broll-finder finds real
footage, broll-story puts OUR avatar on screen DOING something — a silent,
voice-over-ready clip where the focus is the action, not the dialogue (the
avatar may be speaking, but it's off-screen narration, so there is no
lip-sync). Think ALF grabbing the camcorder, or a full-body shot of the
presenter showing a place, taking calls and scheduling on screen, seen from
behind, cooking, building — optionally interacting with invented side-characters.
It is an orchestrator over two existing skills:
gpt-image-2 (one storyboard sheet) → seedance-2 (animate it) → muted clip.
Inputs (gather what's missing)
| Input |
Used for |
| Short script |
the beat/idea of the activity (the avatar's VO, added later) |
| Avatar reference image |
character DNA (--avatar-ref, 1–3 images) |
| Ratio |
9:16 (default) or 16:9 — sets the storyboard grid + the video ratio |
Prerequisites
- gpt-image-2 ready (shared Replicate token) — produces the sheet.
- higgsfield CLI installed + authenticated with credits (
higgsfield account status) — runs seedance.
- ffmpeg on PATH — mutes the clip.
Pipeline
short script + avatar ref + ratio
│
1 AGENT authors the Phase-1 storyboard prompt (6 panels) following gpt-image-2's
│ prompts/storyboard_framework.md — adapted to broll-story, NOT simplified
│ -> <slug>.board.txt
│
2 make_broll_story.py:
│ gpt-image-2 generate_image.py -> ONE 6-panel storyboard sheet (the ratio's grid)
│ seedance-2 (baseline storyboard→movie prompt via prompt_tools.py, verbatim)
│ -> 8s 720p video, same ratio
│ ffmpeg -an -> MUTED clip in <avatar>/broll/story/<NNN>_<slug>.mp4 + manifest.json
│
3 hand off to avatar-reel-composer as a broll scene (broll_source: existing)
Hard rules (do not break)
- 6 panels, ONE storyboard image. A single composite sheet for the requested
ratio (16:9 → 3 columns × 2 rows; 9:16 → 2 columns × 3 rows).
- Follow the baseline prompts verbatim, do NOT simplify them. Author the
storyboard image prompt by following gpt-image-2's storyboard framework
(
~/.cursor/skills/gpt-image-2/prompts/storyboard_framework.md, sections
A–H). The seedance animation prompt is the baseline
storyboard→movie one-liner produced by prompt_tools.py storyboard — the
script uses it as-is. "no simplifiques los baseline prompts."
- Do not tie the panels to 8 seconds. "no necesitas especificar en la imagen
del storyboard que los paneles deban calzar en 8 segundos, eso lo determina el
skill automáticamente … preocúpate que la historia esté bien representada en la
imagen y no de su duración especificada." The storyboard may carry the
framework's own timecodes (even 15s/30s); seedance compresses the whole board
into the requested 8s. Representing the story well in the 6 panels matters;
the storyboard's stated duration does not.
- Silent output, no audio requests. "No le pidas a seedance-2 sonidos ni
voces específicas porque el resultado estará muteado." The clip is muted; the
avatar's voice is laid on later as voice-over by
avatar-reel-composer.
- No lip-sync / no talking-head. Seedance cannot lip-sync without an audio
reference, and these segments are not about what is said — write panels around
what the avatar is DOING (action, blocking, camera changes), not dialogue.
Workflow
1 — Author the storyboard prompt (the creative step)
Follow gpt-image-2's storyboard framework (Phase 1, sections A–H), not
simplified, adapted to broll-story:
- Subject: the avatar performing ONE activity across 6 beats (setup → do the
thing → a small turn/interaction → result). Drive every panel with action,
not dialogue.
- Character DNA: describe the avatar from
--avatar-ref and demand identical
identity/wardrobe across all panels. Invented side-characters are welcome — give
each a distinct, consistent description.
- Shot variety (this is the point): first-person / POV, over-the-shoulder,
from behind, full-body wide showing the whole action, inserts/close-ups of what
the hands do, camera changes between panels. Never a centered talking-head.
- Grid for 6 panels:
16:9 → 3×2; 9:16 → 2×3 (flip the grid for vertical,
per the framework).
- Save the prompt to
<slug>.board.txt. See REFERENCE.md for a
broll-story Phase-1 template and worked examples.
2 — Generate + animate + mute (the mechanical step)
python3 .cursor/skills/broll-story/scripts/make_broll_story.py \
--prompt-file <slug>.board.txt \
--avatar-ref <avatar>/refs/<hero>.png \
--ratio 9:16 --slug <slug> --avatar-dir <avatar> \
--script "the short VO line for this beat (manifest only)"
It writes <avatar>/broll/story/<NNN>_<slug>.mp4 (muted) + a manifest.json
entry and prints a JSON summary. Useful flags: --sheet PATH (reuse an existing
sheet, skip image gen), --resolution, --duration (default 8), --panels 1-3
(animate a sub-range), --keep-audio (rare). QA the printed sheet before
trusting the clip; re-author the prompt and re-run if a panel is off.
3 — Hand off to avatar-reel-composer
Drop the clip into a storyboard broll scene; the composer lays the avatar's
single master narration over it in sync:
{ "id": "s3", "type": "broll", "broll_source": "existing",
"broll_clip": "doki-monster/broll/story/001_doki-show-office.mp4",
"text": "the contiguous slice of the narration spoken over this beat" }
Notes / troubleshooting
- Story longer than one clip? Seedance is ≤15s and best ≤8s. For a longer
beat, make ONE sheet and animate it once at 8s; if a sequence truly needs more
time, split the script into two broll-story calls (two sheets) rather than one
long clip.
ip_detected / blocked — a photoreal human face in the sheet can trip
seedance. Keep invented side-characters stylized to match the avatar; re-run.
Session expired / out of credits — higgsfield auth login / top up, then
re-run (the sheet is cached in the work folder; pass --sheet to skip image gen).
Additional resources
- broll-story Phase-1 template, per-ratio grids, examples: REFERENCE.md
- gpt-image-2 storyboard framework (verbatim baseline):
~/.cursor/skills/gpt-image-2/prompts/storyboard_framework.md
- seedance-2 storyboard→video framework + baseline one-liner:
~/.cursor/skills/seedance-2/prompts/storyboard_video_framework.md
- Consumer:
avatar-reel-composer (broll_source: existing). Siblings: broll-generator (synthetic, presenter-free), broll-finder (real footage).
1---2name: broll-story3description: Generate a SILENT B-roll clip of an existing avatar (and optional invented side-characters) DOING a demonstrative activity — not a talking head, no lip-sync — for an avatar reel. Given a short script, the avatar's reference image and the reel ratio (9:16 or 16:9), it authors ONE 6-panel storyboard sheet with the gpt-image-2 skill and animates that single sheet into an 8s 720p MUTED video with the seedance-2 skill. The avatar's voice is added later as voice-over by avatar-reel-composer (broll_source: existing), so these segments are intentionally silent and focus on what the avatar is DOING (POV, seen from behind, cooking, building, interacting with other characters), not on dialogue. Use when the user wants an avatar action/demonstration B-roll, a non-talking-head avatar scene, a "show don't tell" avatar sequence, or to animate the avatar doing an activity for a reel.4---56# B-roll Story (avatar doing an activity)78The **action / demonstration** counterpart of the broll skills. Where9`broll-generator` synthesizes presenter-free B-roll and `broll-finder` finds real10footage, **`broll-story` puts OUR avatar on screen DOING something** — a silent,11voice-over-ready clip where the focus is the *action*, not the dialogue (the12avatar may be speaking, but it's off-screen narration, so there is **no13lip-sync**). Think ALF grabbing the camcorder, or a full-body shot of the14presenter showing a place, taking calls and scheduling on screen, seen from15behind, cooking, building — optionally interacting with invented side-characters.1617It is an **orchestrator** over two existing skills:18`gpt-image-2` (one storyboard sheet) → `seedance-2` (animate it) → muted clip.1920## Inputs (gather what's missing)21| Input | Used for |22|---|---|23| **Short script** | the beat/idea of the activity (the avatar's VO, added later) |24| **Avatar reference image** | character DNA (`--avatar-ref`, 1–3 images) |25| **Ratio** | `9:16` (default) or `16:9` — sets the storyboard grid + the video ratio |2627## Prerequisites28- **gpt-image-2** ready (shared Replicate token) — produces the sheet.29- **higgsfield CLI** installed + authenticated with credits (`higgsfield account status`) — runs seedance.30- **ffmpeg** on PATH — mutes the clip.3132## Pipeline33```34short script + avatar ref + ratio35 │361 AGENT authors the Phase-1 storyboard prompt (6 panels) following gpt-image-2's37 │ prompts/storyboard_framework.md — adapted to broll-story, NOT simplified38 │ -> <slug>.board.txt39 │402 make_broll_story.py:41 │ gpt-image-2 generate_image.py -> ONE 6-panel storyboard sheet (the ratio's grid)42 │ seedance-2 (baseline storyboard→movie prompt via prompt_tools.py, verbatim)43 │ -> 8s 720p video, same ratio44 │ ffmpeg -an -> MUTED clip in <avatar>/broll/story/<NNN>_<slug>.mp4 + manifest.json45 │463 hand off to avatar-reel-composer as a broll scene (broll_source: existing)47```4849## Hard rules (do not break)50- **6 panels, ONE storyboard image.** A single composite sheet for the requested51 ratio (16:9 → 3 columns × 2 rows; 9:16 → 2 columns × 3 rows).52- **Follow the baseline prompts verbatim, do NOT simplify them.** Author the53 storyboard image prompt by following gpt-image-2's storyboard framework54 (`~/.cursor/skills/gpt-image-2/prompts/storyboard_framework.md`, sections55 A–H). The seedance animation prompt is the baseline56 storyboard→movie one-liner produced by `prompt_tools.py storyboard` — the57 script uses it as-is. *"no simplifiques los baseline prompts."*58- **Do not tie the panels to 8 seconds.** *"no necesitas especificar en la imagen59 del storyboard que los paneles deban calzar en 8 segundos, eso lo determina el60 skill automáticamente … preocúpate que la historia esté bien representada en la61 imagen y no de su duración especificada."* The storyboard may carry the62 framework's own timecodes (even 15s/30s); seedance compresses the whole board63 into the requested 8s. Representing the story well in the 6 panels matters;64 the storyboard's stated duration does not.65- **Silent output, no audio requests.** *"No le pidas a seedance-2 sonidos ni66 voces específicas porque el resultado estará muteado."* The clip is muted; the67 avatar's voice is laid on later as voice-over by `avatar-reel-composer`.68- **No lip-sync / no talking-head.** Seedance cannot lip-sync without an audio69 reference, and these segments are not about what is said — write panels around70 what the avatar is **DOING** (action, blocking, camera changes), not dialogue.7172## Workflow7374### 1 — Author the storyboard prompt (the creative step)75Follow gpt-image-2's storyboard framework (Phase 1, sections A–H), **not76simplified**, adapted to broll-story:77- **Subject:** the avatar performing ONE activity across 6 beats (setup → do the78 thing → a small turn/interaction → result). Drive every panel with **action**,79 not dialogue.80- **Character DNA:** describe the avatar from `--avatar-ref` and demand identical81 identity/wardrobe across all panels. Invented side-characters are welcome — give82 each a distinct, consistent description.83- **Shot variety (this is the point):** first-person / POV, over-the-shoulder,84 from behind, full-body wide showing the whole action, inserts/close-ups of what85 the hands do, camera changes between panels. Never a centered talking-head.86- **Grid for 6 panels:** `16:9` → 3×2; `9:16` → 2×3 (flip the grid for vertical,87 per the framework).88- Save the prompt to `<slug>.board.txt`. See [REFERENCE.md](REFERENCE.md) for a89 broll-story Phase-1 template and worked examples.9091### 2 — Generate + animate + mute (the mechanical step)92```bash93python3 .cursor/skills/broll-story/scripts/make_broll_story.py \94 --prompt-file <slug>.board.txt \95 --avatar-ref <avatar>/refs/<hero>.png \96 --ratio 9:16 --slug <slug> --avatar-dir <avatar> \97 --script "the short VO line for this beat (manifest only)"98```99It writes `<avatar>/broll/story/<NNN>_<slug>.mp4` (muted) + a `manifest.json`100entry and prints a JSON summary. Useful flags: `--sheet PATH` (reuse an existing101sheet, skip image gen), `--resolution`, `--duration` (default 8), `--panels 1-3`102(animate a sub-range), `--keep-audio` (rare). QA the printed `sheet` before103trusting the clip; re-author the prompt and re-run if a panel is off.104105### 3 — Hand off to avatar-reel-composer106Drop the clip into a storyboard `broll` scene; the composer lays the avatar's107single master narration over it in sync:108```json109{ "id": "s3", "type": "broll", "broll_source": "existing",110 "broll_clip": "doki-monster/broll/story/001_doki-show-office.mp4",111 "text": "the contiguous slice of the narration spoken over this beat" }112```113114## Notes / troubleshooting115- **Story longer than one clip?** Seedance is ≤15s and best ≤8s. For a longer116 beat, make ONE sheet and animate it once at 8s; if a sequence truly needs more117 time, split the script into two broll-story calls (two sheets) rather than one118 long clip.119- **`ip_detected` / blocked** — a photoreal human face in the sheet can trip120 seedance. Keep invented side-characters stylized to match the avatar; re-run.121- **`Session expired` / out of credits** — `higgsfield auth login` / top up, then122 re-run (the sheet is cached in the work folder; pass `--sheet` to skip image gen).123124## Additional resources125- broll-story Phase-1 template, per-ratio grids, examples: [REFERENCE.md](REFERENCE.md)126- gpt-image-2 storyboard framework (verbatim baseline): `~/.cursor/skills/gpt-image-2/prompts/storyboard_framework.md`127- seedance-2 storyboard→video framework + baseline one-liner: `~/.cursor/skills/seedance-2/prompts/storyboard_video_framework.md`128- Consumer: `avatar-reel-composer` (`broll_source: existing`). Siblings: `broll-generator` (synthetic, presenter-free), `broll-finder` (real footage).