B-roll Generator
Generate short, hyper-realistic complementary B-roll clips with Pruna's p-video model on Replicate. The clips show only the people / objects / environments you describe — the main presenter/avatar never appears — so they can play under an avatar voice-over in a final composite (like the inserts used in the original lolo reels).
This is the visual counterpart to the avatar-talking-video skill: that one renders the talking head, this one renders the cutaways that reinforce what's being said.
Setup
Uses the same Replicate token as the other Replicate-based skills (avatar-talking-video, voice-clone, gpt-image-2, ...). If any of those is configured, this skill finds the token automatically.
pip3 install -r ~/.cursor/skills/broll-generator/scripts/requirements.txt
# Only if no sibling skill has a token yet:
python3 ~/.cursor/skills/broll-generator/scripts/setup_key.py YOUR_REPLICATE_API_TOKEN
ffmpeg/ffprobe are used to normalize to the exact length and strip audio (recommended, but the skill degrades gracefully without them).
Quick start
python3 ~/.cursor/skills/broll-generator/scripts/generate_broll.py \
"manos sosteniendo un smartphone en penumbra, revisando el Instagram de un ex de noche, primer plano, foco selectivo" \
--duration 6 --camera push_in --avatar-dir /Users/.../virtual-avatar/lolo
Output: <avatar>/broll/<NNN>_<slug>.mp4 plus a manifest.json entry. A JSON summary (saved path + metadata) is printed to stdout for use by an orchestrating skill.
How it works
- Prompt wrapping — your scene description is wrapped in a photoreal/cinematic style block, a camera move (
--camera) plus a "whole frame stays in motion" clause, and an explicit "the presenter does NOT appear / no on-screen text" instruction (skip with--raw-prompt). This fights the static/frozen-background look that makes AI B-roll feel fake.p-videohas no negative-prompt field, so these constraints live in the positive prompt. - Generate —
prunaai/p-videorenders text-to-video at the exact requested duration (1–20s), 720p/1080p.save_audiois off for clean B-roll. - Normalize — the clip is trimmed to the exact duration and audio stripped via ffmpeg (best-effort).
- Manifest — every clip is recorded with its description, prompt, camera, model, dimensions and seed.
Making B-roll look believable
The biggest realism win is camera motion — without it, p-video tends to animate only the subject over a static background. Always pick a --camera:
push_in/pull_out— classic reel inserts; the whole frame travels.pan_left/pan_right— good for landscapes, windows, walking subjects.orbit— wraps around a subject (objects, a person at a table).handheld(default) — organic drift + micro-shake for documentary feel.static— only when you genuinely want a locked tripod (scene still kept alive).
Describe subject + action + framing + lighting/mood, one concrete situation per clip (Spanish works well). Avoid naming the presenter or any real person.
Avoid the "mannequin" look (people who don't move/talk). Text-to-video freezes people into stiff poses unless you give them explicit, continuous performance. For any clip with people interacting, pass --action with vivid verbs — gestures, who points/turns/steps, and (for conversations) that their mouths move as they speak:
python3 .../generate_broll.py \
"una mujer y un hombre discutiendo en la sala de una casa, luz natural fría, plano medio" \
--duration 6 --camera handheld \
--action "ambos discuten hablando con vehemencia, las bocas se mueven al hablar; ella gesticula con las manos, señala y sacude la cabeza; él levanta las manos y se gira; intercambian miradas de enojo, postura tensa en movimiento constante"
Key options
| Flag | Default | Notes |
|---|---|---|
--duration N |
6 |
Exact seconds (1–20; use 3 or 6 for inserts). |
--aspect-ratio |
9:16 |
16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 1:1. |
--resolution |
720p |
720p or 1080p. |
--fps |
24 |
24 or 48. |
--camera |
handheld |
handheld, push_in, pull_out, pan_left, pan_right, orbit, static. |
--action TEXT |
– | Explicit performance for people (gestures, talking, reactions). Fixes the "mannequin" look. |
--seed N |
– | Reproducible generations. |
--draft |
off | Fast, lower-quality preview for iterating on the prompt. |
--no-upsample |
off | Disable p-video prompt upsampling (honor the prompt verbatim). |
--keep-audio |
off | Keep generated audio (stripped by default for clean B-roll). |
--raw-prompt |
off | Use the description verbatim (no realism/camera wrapper). |
--avatar-dir PATH |
– | Save to <avatar>/broll/. |
--out-dir PATH |
./broll |
Explicit output folder. |
Typical workflow (reel composite)
- Analyze a reference reel with
video-scene-analysisto get the per-scene focus, emotion and B-roll descriptions. - For each B-roll scene, write a scene description + camera move and call this skill (match the scene's
--duration). - Render the talking-head segments with
avatar-talking-video. - A higher-level composite skill stitches talking-head + B-roll under the avatar voice-over.
Notes
p-videosupports any 1–20s duration, so 3s and 6s are produced natively (no padding/retiming).- Audio is stripped by default so clips are clean for the avatar voice-over; pass
--keep-audioto keep it. - Use
--draftto iterate cheaply on a prompt, then re-run without it for the final clip. - Generation is a long-running operation (~30s–2min per clip).