旁白版竖屏短剧工作流
Generate a complete, editable 9:16 short-drama episode in narration mode: AI-generated
video clips + story-voice narration + background music + hand-written Motion Graphics + serif-band
subtitles, assembled into a ChatCut timeline and exported as 1080p H.264. Every step lands in a
real, re-editable ChatCut project (never a flattened local file).
When to use
- User wants an episode built the way the first three 《重生2026》 episodes were (旁白驱动).
- User says "按前三集模式生成", "生成旁白版", "做下一集", or picks a character photo and says "用这个生成下一集".
- Do not use for dialogue-driven / character-locked / no-narration requests — route those to
reborn2026-dialogue-modeinstead.
Prerequisites (verify before starting)
- ChatCut MCP tools are reachable via
DeferExecuteToolunder themcp__chatcut__prefix
(e.g.mcp__chatcut__create_project). If a call returns "not found in the deferred tools index",
runToolSearchwith the exact tool name, then retry — the index intermittently drops. VideoGen/ImageGenare reachable viaDeferExecuteTool.- Local media upload helper exists at:
~/.workbuddy/plugins/marketplaces/experts/plugins/chatcut-video-editor/skills/asset-import/scripts/upload-media.mjs
(or follow theasset-importskill). It needs ffmpeg/ffprobe binaries and a ChatCut import token. - ffmpeg/ffprobe binaries (win32-x64) live under
~/.workbuddy/binaries/node/workspace/node_modules/@ffmpeg-installerand@ffprobe-installer. Pass their absolute Windows paths (C:/...) to the uploader.
Workflow (high level)
- Confirm the story. If no script exists, draft a narration script (one section per clip,
~80–110s total, ~430 Chinese chars of pure narration) and confirm with the user. Reuse prior
episode scripts for tone/format. Save it as a.mdfile. - Generate 6 video clips with
VideoGen(text-to-video for establishing/insert shots;
image-to-video with a character reference PNG to lock the face for that character's shots).
- 720P, 5s,enable_audio:false,watermark:false.
- Portrait trap: text-to-video often outputs 1280×720 landscape even when the prompt says
"9:16". Always passaspect_ratio:"9:16"for text-to-video. Image-to-video must NOT pass
aspect_ratio(it inherits the reference image's 2:3 ratio).
- Rename outputs toepN-segK-*.mp4and verify with ffprobe (width,height,duration). - Generate narration via
mcp__chatcut__submit_voice(providerdoubao, voiceId
qingcang,emotion:"storytelling",emotionScale:3, aperformancePromptfor story-telling
tone). Generate music viamcp__chatcut__submit_music(Mureka-style prompt: piano + strings,
emotional, loopable). Bind both to the project withprojectId. Wait with
mcp__chatcut__track_progress{action:"wait", target:"generation", jobIds:"..."}. - Create project + upload videos.
mcp__chatcut__create_project
(compositionWidth:1080, compositionHeight:1920, fps:30). Get an import token via
mcp__chatcut__import_media{action:"create_session", projectId}(token valid ~30 min), then
upload the 6 clips in batches of ≤4 with the upload helper. Capture each returnedassetId. - Author 4 Motion Graphics via
mcp__chatcut__create_motion_graphic_from_code. Free (no
credits). Use inline JSX with Remotion globals; root element MUST be a div with style={rootStyle}
(NOT AbsoluteFill — validation fails). Noto Serif SC font. Typical set: opening title /
character-name reveal / key-quote emphasis / ending freeze. - Assemble the timeline with a single
mcp__chatcut__edit_itemcall (see critical gotcha
below). Read tracks first withmcp__chatcut__read_project{view:"timeline"}. - Transcribe + subtitles. Generated voice is NOT auto-transcribed. Kick ASR with
mcp__chatcut__manage_transcript{action:"retry_transcription", asset:"(narration asset id)"},
wait ~35s, thenmcp__chatcut__edit_captions{action:"enable", preset:"serif-band"}and
{action:"source_set", json:{"sources":[{"trackId":"A1"}]}}to lock subtitles to the narration
track. Fix ASR name-mishearing withedit_captions{action:"display_text", json:{overrides:[...]}}. - Export via
mcp__chatcut__submit_export{format:"video", codec:"h264", resolution:"1080p", fps:30}and wait withmcp__chatcut__track_export. Download the S3 URL and verify with ffprobe.
CRITICAL gotchas (learned the hard way)
edit_itemauto-track-shuffle (severe): when updating/adding an item withouttrackId, the
tool may auto-move it to a new track to avoid same-track overlap, scattering the timeline. Always
passtrackIdon every add. Prefer one bigadds:[...]call with all 12 items (6 videos + 4 MG +
2 audio), each carrying itstrackId.- No cross-dissolve on slow-stretched clips: stretching a 5s clip to cover ~7s leaves no extra
handle at the ends, so cross-dissolve reports "seam has 0 feasible visual transition frames". Use
hard cuts (segments meet end-to-end) for narration-mode episodes. - Track roles: A1 =
role:"anchor"(narration), A2 =role:"follower"(music) → automatic
ducking. Create them explicitly withmcp__chatcut__edit_track. - ASR mishears names: narration TTS "紫日"→"子日", "白露"→"白鹿", "怔住"→"正住". Fix with
edit_captionsdisplay_textoverrides (read word keys viaread_captions{words:true}). This
edits only the displayed text, not the audio. - submit_video needs Pro: native ChatCut video generation requires a Pro plan. Use
VideoGen
(DeferExecuteTool) + the upload helper instead. - Upload path pitfall: the upload helper runs under node — pass Windows-style absolute paths
(C:/Users/...), not Git-Bash/c/...(node mangles/c/intoC:\c\). - Index flakiness:
edit_track/edit_item/track_progressoccasionally drop from the
deferred index mid-session. On "not found",ToolSearchthe name and retry.
Verification
read_project{view:"timeline"}: confirm 4 tracks, 12 items, durations add up, no stray tracks.read_captions{fullText:true}: confirm subtitle text is complete and names are correct.- After export:
ffprobethe downloaded file — expect H.264, 1080×1920, 30fps, duration ≈ narration
length, size ~38–45 MB.
References
See references/workflow.md for the full per-step parameter recipes (exact JSON shapes, frame math
for slow-stretch, and the serif-band caption fix).