Animate first frames into A-roll talking head clips
Animate (A-Roll)

Animate first frames into A-roll talking head clips. Uses Sora 2 via fal.ai (primary) with Kling 3 auto-fallback when Sora is unavailable or sunset.
---
name: scrollclaw-animate
description: "Animate first frames into A-roll talking head clips. Uses Sora 2 via fal.ai (primary) with Kling 3 auto-fallback when Sora is unavailable or sunset."
metadata:
openclaw:
emoji: "🎥"
user-invocable: true
triggers:
- "animate clip"
- "sora animate"
- "generate clip"
- "a-roll"
- "talking head clip"
- "sora video"
- "kling animate"
- "kling a-roll"
---
Overview
Turns first frames into talking head clips with synced lip movement and audio. Image-to-video is the default — text-to-video is the fallback.
What you get
- Producesone A-roll clip per [A-ROLL] segment plus append-only generation logs
- FormatMP4 files in workspace/campaigns/<slug>/clips/ and rows in output-log.md
- Default behavioruse Sora image-to-video with the approved first frame; use text-to-video only as a fallback when no usable frame exists
- Downstream use/b-roll and /assemble
Manual install (npx, ZIP)
npx skills add TheMattBerman/scrollclaw --skill scrollclaw-animate -g -a claude-codemkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/TheMattBerman/scrollclaw/tar.gz/ea175d4b62fd \
| tar -xz -C ~/.claude/skills --strip-components=1 scrollclaw-ea175d4b62fd/animateNew-Item -ItemType Directory -Force "$HOME\.claude\skills" | Out-Null; Invoke-WebRequest "https://m.agentalley.io/zip/a593426c263190b511ae/animate.zip" -OutFile "$env:TEMP\animate.zip"; Expand-Archive "$env:TEMP\animate.zip" -DestinationPath "$HOME\.claude\skills" -ForceConnects with Agent Alley MCP · agentalley.io/mcp
Files included
SKILL.md6.5 KBreferences/2 files · 19.7 KB
Read the files here
TheMattBerman/
Shared references1SKILL.md reads these from elsewhere in the repo. Not in the ZIP.
Get them on GitHub ↗Show the full text160 lines
Animate (A-Roll)
Turns first frames into talking head clips with synced lip movement and audio. Image-to-video is the default — text-to-video is the fallback.
Fallback chain: Sora 2 (fal.ai) -> Kling 3 (fal.ai) -> Kling 3 (Replicate). Use --provider kling to skip Sora entirely (for when Sora is sunset).
Prerequisites
- First frame approved (from
/first-frame) - Script with
[A-ROLL]segments tagged (from/persona)
Motion Prompting
Read references/motion-prompting.md for the structured prompt format. Use labeled fields — not prose paragraphs:
- Camera — handheld energy, micro-shake, slight reframe
- Subject — keep generic (first frame defines appearance). Detailed facial descriptions trigger content safety filters
- Dialogue — include actual script lines. Sora generates synced lip movement + audio
- Audio — describe the RESULT not the gear. "Clean natural podcast audio, voice close and present, subtle room tone" works. Naming specific mics doesn't.
- Environment & light — practical light, deep focus, real-world setting
- Style & mood — iPhone selfie-camera realism, not cinematic
Generation
USE THE SCRIPTS. DO NOT construct API calls manually. Scripts handle provider routing, field names, polling, downloading, and error handling.
# Image-to-video (RECOMMENDED — first frame locks the face)
bash scripts/generate-clip.sh \
--provider fal \
--image workspace/campaigns/<slug>/frames/frame1.png \
--prompt-file workspace/campaigns/<slug>/motion-prompt.txt \
--output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
--log-file workspace/campaigns/<slug>/output-log.md \
--label a-roll-01 \
--seconds 8 --aspect-ratio portrait
# Text-to-video (fallback — no first frame)
bash scripts/generate-clip.sh \
--provider fal \
--prompt-file workspace/campaigns/<slug>/scene-prompt.txt \
--output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
--log-file workspace/campaigns/<slug>/output-log.md \
--label a-roll-01 \
--seconds 8 --aspect-ratio portrait
# Kling direct (skip Sora — use when Sora is sunset)
bash scripts/generate-clip.sh \
--provider kling \
--image workspace/campaigns/<slug>/frames/frame1.png \
--prompt-file workspace/campaigns/<slug>/motion-prompt.txt \
--output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
--log-file workspace/campaigns/<slug>/output-log.md \
--label a-roll-01 \
--seconds 8 --aspect-ratio portrait
# Replicate Sora (legacy — may stop working when Sora is sunset)
bash scripts/generate-clip.sh \
--provider replicate \
--image workspace/campaigns/<slug>/frames/frame1.png \
--prompt-file workspace/campaigns/<slug>/motion-prompt.txt \
--output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
--log-file workspace/campaigns/<slug>/output-log.md \
--label a-roll-01 \
--seconds 8 --aspect-ratio portrait
API Reference
Read references/sora-api.md for endpoint details, queue workflow, field names, and duration options. Sora fal.ai supports 4/8/12/16/20s. Kling supports 3-15s (durations >15s are auto-clamped). Replicate Sora is limited to 4/8/12.
Content Filter Handling
Sora's content filter runs AFTER generation — can fail at 99%. If blocked:
- Soften the motion prompt (keep first frame)
- Remove any potentially sensitive descriptions
- Retry with adjusted prompt
- Or use
--provider kling— Kling has no content safety filter
Key Findings
- Include actual script in Dialogue field — Sora generates synced lip movement
- For podcast audio: describe the RESULT, not the gear
- Keep Subject descriptions generic — the first frame already defines appearance
- fal.ai is primary provider; Kling 3 is auto-fallback when Sora fails or is sunset
- Use
--provider klingto skip Sora entirely
Brand Memory Integration
Reads
| File | Purpose |
|---|---|
workspace/campaigns/<slug>/frames/frame1.png |
Canonical face — fed to Sora i2v to lock creator identity |
workspace/campaigns/<slug>/scripts/<format>-script.md |
A-roll segments, dialogue, shot timing |
workspace/campaigns/<slug>/creators/creator-<name>.md |
Creator energy/vibe reference for motion prompting |
workspace/creators/creator-<name>.md |
Fallback if no campaign-specific profile exists |
Writes
| File | Notes |
|---|---|
workspace/campaigns/<slug>/clips/a-roll-01.mp4 |
One file per A-roll segment |
workspace/campaigns/<slug>/output-log.md |
Motion prompt, model, duration, provider (append-only) |
Context loading
🎥 Animate context loaded:
✓ First frame: workspace/campaigns/ridge-q1/frames/frame1.png
✓ Script: talking-head (A-roll segments: 3)
✓ Creator: Maya
✓ Campaign: ridge-q1
Contract
Input
- Required: approved
frame1.pngplus a script with[A-ROLL]segments - Optional: creator profile details, alternate prompt file, fallback provider
- Format: workspace image and markdown files plus motion prompt text
- Source:
/first-frame,/persona, andreferences/motion-prompting.md
Output
- Produces: one A-roll clip per
[A-ROLL]segment plus append-only generation logs - Format: MP4 files in
workspace/campaigns/<slug>/clips/and rows inoutput-log.md - Default behavior: use Sora image-to-video with the approved first frame; use text-to-video only as a fallback when no usable frame exists
- Downstream use:
/b-rolland/assemble
Validation
- Pre-conditions: first frame is approved, script is tagged correctly, and the prompt includes the actual dialogue
- Post-conditions: local MP4 is saved, creator identity holds, and lip movement/audio feel believable enough to cut into a final video
- Failure checks: reroll or adjust the prompt if content filters fail, the hands/face break realism, or the clip is too synthetic to pass downstream
Output
- A-roll clips (MP4) in
workspace/campaigns/<slug>/clips/ - Each clip named
a-roll-<segment>.mp4corresponding to an[A-ROLL]script segment - Generation params logged to
workspace/campaigns/<slug>/output-log.md
Next Step
A-roll done → run /b-roll for environment shots, or /assemble if no B-roll needed.
| 1 | |
| 2 | name scrollclaw-animate |
| 3 | description "Animate first frames into A-roll talking head clips. Uses Sora 2 via fal.ai (primary) with Kling 3 auto-fallback when Sora is unavailable or sunset." |
| 4 | metadata |
| 5 | openclaw |
| 6 | emoji "🎥" |
| 7 | user-invocable true |
| 8 | triggers |
| 9 | - "animate clip" |
| 10 | - "sora animate" |
| 11 | - "generate clip" |
| 12 | - "a-roll" |
| 13 | - "talking head clip" |
| 14 | - "sora video" |
| 15 | - "kling animate" |
| 16 | - "kling a-roll" |
| 17 | |
| 18 | |
| 19 | # Animate (A-Roll) |
| 20 | |
| 21 | Turns first frames into talking head clips with synced lip movement and audio. Image-to-video is the default — text-to-video is the fallback. |
| 22 | |
| 23 | **Fallback chain:** Sora 2 (fal.ai) -> Kling 3 (fal.ai) -> Kling 3 (Replicate). Use `--provider kling` to skip Sora entirely (for when Sora is sunset). |
| 24 | |
| 25 | ## Prerequisites |
| 26 | |
| 27 | First frame approved (from `/first-frame`) |
| 28 | Script with `[A-ROLL]` segments tagged (from `/persona`) |
| 29 | |
| 30 | ## Motion Prompting |
| 31 | |
| 32 | Read `references/motion-prompting.md` for the structured prompt format. Use labeled fields — not prose paragraphs: |
| 33 | |
| 34 | **Camera** — handheld energy, micro-shake, slight reframe |
| 35 | **Subject** — keep generic (first frame defines appearance). Detailed facial descriptions trigger content safety filters |
| 36 | **Dialogue** — include actual script lines. Sora generates synced lip movement + audio |
| 37 | **Audio** — describe the RESULT not the gear. "Clean natural podcast audio, voice close and present, subtle room tone" works. Naming specific mics doesn't. |
| 38 | **Environment & light** — practical light, deep focus, real-world setting |
| 39 | **Style & mood** — iPhone selfie-camera realism, not cinematic |
| 40 | |
| 41 | ## Generation |
| 42 | |
| 43 | **USE THE SCRIPTS. DO NOT construct API calls manually.** Scripts handle provider routing, field names, polling, downloading, and error handling. |
| 44 | |
| 45 | |
| 46 | # Image-to-video (RECOMMENDED — first frame locks the face) |
| 47 | bash scripts/generate-clip.sh \ |
| 48 | --provider fal \ |
| 49 | --image workspace/campaigns/<slug>/frames/frame1.png \ |
| 50 | --prompt-file workspace/campaigns/<slug>/motion-prompt.txt \ |
| 51 | --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \ |
| 52 | --log-file workspace/campaigns/<slug>/output-log.md \ |
| 53 | --label a-roll-01 \ |
| 54 | --seconds 8 --aspect-ratio portrait |
| 55 | |
| 56 | # Text-to-video (fallback — no first frame) |
| 57 | bash scripts/generate-clip.sh \ |
| 58 | --provider fal \ |
| 59 | --prompt-file workspace/campaigns/<slug>/scene-prompt.txt \ |
| 60 | --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \ |
| 61 | --log-file workspace/campaigns/<slug>/output-log.md \ |
| 62 | --label a-roll-01 \ |
| 63 | --seconds 8 --aspect-ratio portrait |
| 64 | |
| 65 | # Kling direct (skip Sora — use when Sora is sunset) |
| 66 | bash scripts/generate-clip.sh \ |
| 67 | --provider kling \ |
| 68 | --image workspace/campaigns/<slug>/frames/frame1.png \ |
| 69 | --prompt-file workspace/campaigns/<slug>/motion-prompt.txt \ |
| 70 | --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \ |
| 71 | --log-file workspace/campaigns/<slug>/output-log.md \ |
| 72 | --label a-roll-01 \ |
| 73 | --seconds 8 --aspect-ratio portrait |
| 74 | |
| 75 | # Replicate Sora (legacy — may stop working when Sora is sunset) |
| 76 | bash scripts/generate-clip.sh \ |
| 77 | --provider replicate \ |
| 78 | --image workspace/campaigns/<slug>/frames/frame1.png \ |
| 79 | --prompt-file workspace/campaigns/<slug>/motion-prompt.txt \ |
| 80 | --output workspace/campaigns/<slug>/clips/a-roll-01.mp4 \ |
| 81 | --log-file workspace/campaigns/<slug>/output-log.md \ |
| 82 | --label a-roll-01 \ |
| 83 | --seconds 8 --aspect-ratio portrait |
| 84 | |
| 85 | |
| 86 | ## API Reference |
| 87 | |
| 88 | Read `references/sora-api.md` for endpoint details, queue workflow, field names, and duration options. Sora fal.ai supports 4/8/12/16/20s. Kling supports 3-15s (durations >15s are auto-clamped). Replicate Sora is limited to 4/8/12. |
| 89 | |
| 90 | ## Content Filter Handling |
| 91 | |
| 92 | Sora's content filter runs AFTER generation — can fail at 99%. If blocked: |
| 93 | Soften the motion prompt (keep first frame) |
| 94 | Remove any potentially sensitive descriptions |
| 95 | Retry with adjusted prompt |
| 96 | Or use `--provider kling` — Kling has no content safety filter |
| 97 | |
| 98 | ## Key Findings |
| 99 | |
| 100 | Include actual script in Dialogue field — Sora generates synced lip movement |
| 101 | For podcast audio: describe the RESULT, not the gear |
| 102 | Keep Subject descriptions generic — the first frame already defines appearance |
| 103 | fal.ai is primary provider; Kling 3 is auto-fallback when Sora fails or is sunset |
| 104 | Use `--provider kling` to skip Sora entirely |
| 105 | |
| 106 | ## Brand Memory Integration |
| 107 | |
| 108 | ### Reads |
| 109 | | File | Purpose | |
| 110 | |------|---------| |
| 111 | | `workspace/campaigns/<slug>/frames/frame1.png` | Canonical face — fed to Sora i2v to lock creator identity | |
| 112 | | `workspace/campaigns/<slug>/scripts/<format>-script.md` | A-roll segments, dialogue, shot timing | |
| 113 | | `workspace/campaigns/<slug>/creators/creator-<name>.md` | Creator energy/vibe reference for motion prompting | |
| 114 | | `workspace/creators/creator-<name>.md` | Fallback if no campaign-specific profile exists | |
| 115 | |
| 116 | ### Writes |
| 117 | | File | Notes | |
| 118 | |------|-------| |
| 119 | | `workspace/campaigns/<slug>/clips/a-roll-01.mp4` | One file per A-roll segment | |
| 120 | | `workspace/campaigns/<slug>/output-log.md` | Motion prompt, model, duration, provider (append-only) | |
| 121 | |
| 122 | ### Context loading |
| 123 | |
| 124 | |
| 125 | 🎥 Animate context loaded: |
| 126 | ✓ First frame: workspace/campaigns/ridge-q1/frames/frame1.png |
| 127 | ✓ Script: talking-head (A-roll segments: 3) |
| 128 | ✓ Creator: Maya |
| 129 | ✓ Campaign: ridge-q1 |
| 130 | |
| 131 | |
| 132 | ## Contract |
| 133 | |
| 134 | ### Input |
| 135 | Required: approved `frame1.png` plus a script with `[A-ROLL]` segments |
| 136 | Optional: creator profile details, alternate prompt file, fallback provider |
| 137 | Format: workspace image and markdown files plus motion prompt text |
| 138 | Source: `/first-frame`, `/persona`, and `references/motion-prompting.md` |
| 139 | |
| 140 | ### Output |
| 141 | Produces: one A-roll clip per `[A-ROLL]` segment plus append-only generation logs |
| 142 | Format: MP4 files in `workspace/campaigns/<slug>/clips/` and rows in `output-log.md` |
| 143 | Default behavior: use Sora image-to-video with the approved first frame; use text-to-video only as a fallback when no usable frame exists |
| 144 | Downstream use: `/b-roll` and `/assemble` |
| 145 | |
| 146 | ### Validation |
| 147 | Pre-conditions: first frame is approved, script is tagged correctly, and the prompt includes the actual dialogue |
| 148 | Post-conditions: local MP4 is saved, creator identity holds, and lip movement/audio feel believable enough to cut into a final video |
| 149 | Failure checks: reroll or adjust the prompt if content filters fail, the hands/face break realism, or the clip is too synthetic to pass downstream |
| 150 | |
| 151 | ## Output |
| 152 | |
| 153 | A-roll clips (MP4) in `workspace/campaigns/<slug>/clips/` |
| 154 | Each clip named `a-roll-<segment>.mp4` corresponding to an `[A-ROLL]` script segment |
| 155 | Generation params logged to `workspace/campaigns/<slug>/output-log.md` |
| 156 | |
| 157 | ## Next Step |
| 158 | |
| 159 | A-roll done → run `/b-roll` for environment shots, or `/assemble` if no B-roll needed. |
| 160 |
Details
- Updated
- Mar 27, 2026
- License
- MIT
- Stars on the repo
- ★ 71
- Checked
- Source
- TheMattBerman/scrollclaw ↗
- Creator
- TheMattBerman · 6 listings
Similar skills
See all →
SkillMake a polished video of an app or a featureMake a demo video with OpenScreen
SkillVideo and audio processing with FFmpegFFmpeg for Video Production
SkillTurn static SCREENSHOTS into a simulated screen recordingfake-screencast — screenshots → simulated screen recording
SkillA Khan Academy style explainer videoKhan explainer
SkillPick the output format that makes an explanation easiestUnderstanding ladder
SkillGenerate B-roll environment and product shots with Kling 3B-Roll (Kling 3)More from TheMattBerman
SkillGenerate B-roll environment and product shots with Kling 3B-Roll (Kling 3)
SkillStart of the UGC pipeline for persona researchPersona & Script
SkillRouter and orchestrator for AI UGC video productionScrollClaw
SkillScrollClaw system — core doctrine, format selection
SkillScore UGC videos for virality before publishingVirality Scoring