Produce multi-scene AI videos with automated QA. This skill handles the production pipeline — generation, speech verification, visual QA, assembly, and voice swap. It works with any format by converting the format's recording brief or prompt template into a vidlang spec.
The process is always the same:
- Pick a format (talking-head, ugc-b2c, ugc-yapper, etc.)
- Write a vidlang spec using that format's structure
- Run the production pipeline below
Step 0: Choose a Format
The format determines the scene structure, setting, and tone. The production pipeline stays the same regardless of format.
| Format skill | Use when | Spec adaption |
|---|---|---|
| talking-head | One person speaking to camera | Single character, varied settings per scene |
| podcast | Conversation at a desk with mic | Two characters or solo with mic visible |
| ugc-b2c | Product demos, unboxings, reviews | Character interacts with product, lofi feel |
| ugc-dtc | DTC brand rituals, textures | Close-ups, tactile moments, lifestyle settings |
| ugc-fashion | OOTDs, try-ons, styling | Full-body or mirror shots, outfit changes |
| ugc-skincare | Routines, textures, shelfies | Bathroom/vanity setting, product application |
| ugc-supplements | Morning stacks, gym bag dumps | Kitchen/gym setting, product display |
| ugc-saas | Desk tours, tool rants, wins | Desk/office setting, laptop visible |
| ugc-mobile | Phone reactions, app moments | Phone in hand, reaction shots |
| ugc-yapper | Car rants, raw monologues | Messy settings, imperfect framing, raw energy |
| ugc-lifestyle-broll | Ambient b-roll, no dialogue | Cinematic, no character speech |
| custom | Anything else | Write the spec from scratch |
Take the format's Recording Brief or Prompt Template and use it as the prompt field in your vidlang spec. The character, voice, and scene structure come from the format. The production rules (VL001-VL013) apply universally.
Step 1: Write the Spec
Use the vidlang skill to write and lint a video spec. The spec defines character, voice, scenes, and dialogue.
The scenes JSON must include for each scene:
{
"prompt": "full generation prompt — adapted from your chosen format's recording brief",
"dialogue": "the exact intended dialogue for speech verification",
"sceneImageUrl": "starting frame image URL",
"prosody": "natural speech rhythm instructions"
}
Step 2: Lint Rules
Run all VidLang rules plus these production-specific rules:
VL009 — Expression Continuity
Every scene after the first must specify startExpression matching the previous scene's ending expression.
VL010 — Audio Normalization
Multi-scene specs must include audio normalization in post-production.
VL011 — Prosody Control
Every scene must include a prosody field with natural speech rhythm instructions. Must contain anti-robot instructions: "no dramatic emphasis", "casual pace", "conversational". Without it, AI over-emphasizes keywords.
- FAIL: No prosody field
- PASS:
"prosody": "casual pace, don't stress any single word, conversational like talking to a friend"
VL012 — Anti-Emphasis
Dialogue must NOT contain words in ALL CAPS or formatting that implies emphasis. AI models interpret emphasis cues as shouting.
- FAIL: "TWELVE" or "typed, NOT filmed"
- PASS: All natural casing
VL013 — Talking Head Stillness
No motion instructions in prompts. No "leans forward", "sits back", "gestures", "nods". The character sits still and talks. Movement causes pose jumps between cuts.
- FAIL: "leans forward on final word, gestures toward own face"
- PASS: "sitting still at desk"
Step 3: Generate with QA Gates
For each scene (max 5 retries):
Gate 1 — Watch Visual Check
- Generate the scene clip (Kling 3.0 or Veo 3.1)
- Run watch on the clip:
POST /v1/watch { "mediaUrl": "[CLIP_URL]", "prompt": "Check this video for: face consistency, spatial anatomy, artifacts, motion quality, audio sync. Score 1-10. List issues with severity." } - Auto-reject if:
- Score < 8/10
- Any major/critical issues (excluding
text_renderingcategory — AI always garbles t-shirt text) - Face morphing, warping, or structural drift
- Eye contact breaks
Gate 2 — Transcribe Speech Verification
- Transcribe the clip:
POST /v1/transcribe { "mediaUrl": "[CLIP_URL]" } - Compare transcript word-by-word against intended
dialogue - Auto-reject if:
- Missing or wrong words
- Repeated phrases (e.g., same 3+ word sequence appears consecutively)
- Audio events during speech (laughs, sighs, clicks)
- Peripheral noise (before first word / after last word) is logged but non-blocking
- Numbers normalized: "8" matches "eight", "12" matches "twelve"
Gate 3 (optional) — Extract for Frame Inspection
If watch flags issues but you need to see specific frames before rejecting:
POST /v1/extract {
"mediaUrl": "[CLIP_URL]",
"frames": "auto"
}
Agent inspects the returned frame URLs to confirm or dismiss flagged issues.
Frame Chaining
After a scene passes all gates:
- Extract the last frame:
POST /v1/extract { "mediaUrl": "[CLIP_URL]", "frames": "last" } - Use the returned frame URL as the starting frame for the next scene (Kling 3.0 supports 2 images in
image_urlsfor first/last frame control)
Step 4: Post-Production
After all scenes pass QA:
- Concat — FFmpeg concat demuxer, hard cuts (no crossfades)
- Loudnorm — Two-pass FFmpeg loudnorm at -16 LUFS, normalizes volume across all scenes
- Save pre-STS — Keep a copy before voice swap for comparison
- STS Voice Swap — Single-pass ElevenLabs Speech-to-Speech on the full concatenated audio (NOT per-scene). Uses the character's
voiceIdfromcharacter.json - STT Final Check — Transcribe the final video via
POST /v1/transcribeto catch any STS artifacts
Step 5: Edit Instructions
The pipeline outputs an edit report with:
- Silence gaps > 0.5s with timestamps
- Audio events detected in final video
- Specific trim/cut instructions
The agent executes these edits with FFmpeg:
- Trim dead air at start/end
- Shorten long silence gaps to 0.3s
- Mute any audio artifacts at specific timestamps
After editing, run POST /v1/transcribe one final time to verify the edited video is clean.
Step 6: Final Watch
Run watch on the edited final video with a comprehensive prompt:
POST /v1/watch {
"mediaUrl": "[FINAL_VIDEO_URL]",
"prompt": "Analyze this video for: natural speech cadence and prosody, scene-to-scene transition quality, overall flow — does it feel like one conversation? Score 1-10. List issues."
}
Report issues and propose fixes for the next iteration.
Key Behaviors
- Transcribe is the hard gate for speech. Watch is unreliable for word-level audio QA — use it for visual checks only.
- Single-pass STS produces cleaner results than per-scene voice swap. Always do STS as the final step on the concatenated video.
- Ignore t-shirt text — AI models always garble graphic tee text. It's cosmetic and viewers don't notice at mobile resolution.
- Peripheral noise is non-blocking — sighs/clicks before the first word or after the last word are trimmed in post, not worth rejecting a generation.
- Frame chaining via extract helps pose continuity but doesn't guarantee expression matching. Remove motion cues from prompts (VL013) to minimize pose jumps.
- Save the pre-STS version — if STS introduces artifacts, you can re-swap with a different voice or fall back to native voice.