Install
openclaw skills install @tobewin/narrated-handdrawn-story-videoopenclaw skills install @tobewin/narrated-handdrawn-story-videoUse the installed story-to-handdrawn-video renderer for the picture track, then produce narration and the final mix. This is a quality-first workflow: never substitute one illustration across all story beats.
project.width and project.height from the storyboard before prompting for art; the current renderer defaults to 1080×1440 (3:4), not 9:16. Use contain only after the source image has been normalized to the same ratio.Write story.txt and a two-digit-keyed visual-plan.json. Split only at natural narrative turns; resolve pronouns and time jumps in the plan. Keep caption and narration identical for each scene.
Use the existing renderer wrapper to plan/generate/import the scene images. Set STORY_VIDEO_PROJECT to the cloned Remotion project when needed:
STORY_VIDEO_PROJECT=/absolute/project \
python3 /Users/bingo/.codex/skills/story-to-handdrawn-video/scripts/run_story_video.py \
--input /absolute/story.txt --title "故事标题" --visual-plan /absolute/visual-plan.json --mode generate
Generate images with the image-generation tool. Prompt for exact story action and setting; request no embedded text. Inspect the first crop from each batch before importing all scenes.
Produce the opening-poster image with the image-generation tool at exactly the storyboard's aspect ratio, then add project.opening_poster (asset, tag, title, synopsis, takeaway) to the storyboard. The renderer displays the complete cover at frame 0; do not fade in its text. Allocate the copy to a quiet third of the frame. If the generated file has another ratio, outpaint or extend it to the project ratio without stretching or cropping subjects, then resize to the exact project dimensions. Verify the image and video dimensions with scripts/check_cover_ratio.py and npm run check before rendering.
Generate each TTS segment with scripts/synthesize_qwen3.py using the local Qwen3-TTS model and a voice-plan JSON. Use one segment for exactly one subtitle; concatenate them in scene order, keeping a short leading and trailing pause in every segment. Update scene timing from measured audio duration and render the silent picture track. Do not fall back to online Edge TTS unless the user explicitly requests it.
Download/select an appropriate licensed BGM, trim/fade it, then run scripts/mix_story_audio.py to delay the voice for the poster and sidechain-duck the music.
Inspect a poster frame and several scene-boundary frames. Confirm each subtitle matches both the voice and shown action, then place only the final MP4 and BGM attribution in the requested output folder.
python3 scripts/mix_story_audio.py \
--video /absolute/picture_silent.mp4 \
--voice /absolute/narration.wav \
--bgm /absolute/music.ogg \
--output /absolute/final.mp4 \
--poster-seconds 3
The script preserves the video stream and creates AAC audio. It deliberately makes no license claim; create an attribution file yourself.
contain would create side or top bars, while cover can remove important artwork.