Install
openclaw skills install @tobewin/make-motion-comicopenclaw skills install @tobewin/make-motion-comicProduce a complete motion-comic episode from a script while keeping image identity, voice quality, motion smoothness, and source assets independently editable.
imagegen skill for character sheets, keyframes, image corrections, and covers. Follow that skill's reference-image and save-path rules.say for a final deliverable unless the user explicitly chooses its offline quality tradeoff.scripts/preflight.sh before producing media. Report missing required dependencies before continuing.Edge TTS uses an unofficial client for Microsoft's online speech endpoint. It is free in normal use but needs network access and has no service guarantee. Retry transient failures; do not silently substitute a worse voice.
Use these defaults when the user says “开始”“直接做” or otherwise authorizes an autonomous first pass:
Read references/story-and-shots.md before writing a new episode. Read references/image-consistency.md before generating images.
Create a project-local working folder and a user-facing output folder. Preserve:
Keep temporary render fragments outside the user-facing output folder.
Write narration and dialogue before generating images. Assign every spoken line to a shot. Prefer two or three recurring characters and a small number of reusable locations. Use visual reveals, poses, props, lighting changes, and cuts rather than animation-dependent action.
Use the structure and duration guidance in references/story-and-shots.md.
Generate one production visual bible with neutral full-body views, face closeups, signature clothing/accessories, and a world inset. Treat it as the identity source of truth.
For every keyframe:
Do not build a pure A→B→C reference chain. It accumulates identity drift. Follow references/image-consistency.md.
Generate each distinct shot with a separate built-in image call. Save final selected images into the project. Inspect full-size images and a contact sheet for:
Regenerate a failed shot with one targeted correction. Never continue from a visibly drifted reference.
Create a JSON TTS manifest from assets/templates/tts-script.json. Give recurring characters stable voices and stable rate/pitch settings. Use scripts/synthesize_edge_tts.py to generate one file per line with retries and resumability.
For Mandarin, start with:
zh-CN-XiaoxiaoNeural: warm narrator;zh-CN-XiaoyiNeural: adult woman or a lightly raised-pitch child;zh-CN-YunyangNeural: controlled or authoritative man;zh-CN-YunxiNeural: younger, urgent man.Punctuation controls acting. Use commas and ellipses sparingly; excessive ellipses make an episode drag. Read references/audio-and-tts.md before casting voices or mixing.
Measure generated voice files with ffprobe; voice duration overrides estimates. Build subtitle and shot timing from those durations plus deliberate pauses. Retiming must update all of:
Never hardcode subtitle timing from the draft script.
Use scripts/build_timeline.py to create voice.wav, subtitles.srt, and timeline.json from the same TTS manifest:
python3 scripts/build_timeline.py \
--manifest tts-script.json \
--audio-dir audio/lines \
--out timeline
Use motion only when it supports attention or emotion:
Do not add camera shake as a generic “dynamic” effect. Do not run low-resolution zoompan directly at delivery size.
Render still-image motion with scripts/render_still_clip.sh. It uses an oversized working canvas, eased movement, Lanczos downsampling, and 30 fps defaults to prevent integer-coordinate stepping and line-art shimmer. Read references/motion-and-qc.md before implementing motion or diagnosing jitter.
Keep captions separate from generated art. Use a stable bottom safe area, high contrast, and at most two short lines. Do not cover faces or required props.
Mix voice first, then ambience, transitions, and music. Duck beds under dialogue. Target approximately:
Use synthesized ambience/SFX or media with explicit reusable licensing. Record provenance for downloaded audio.
Run all applicable checks:
ffprobe -v error -show_entries format=duration:stream=codec_name,width,height,r_frame_rate,sample_rate,channels -of json final.mp4
ffmpeg -v error -i final.mp4 -f null -
ffmpeg -hide_banner -i final.mp4 -vf blackdetect=d=0.3:pix_th=0.05 -an -f null -
ffmpeg -hide_banner -i final.mp4 -af loudnorm=I=-16:LRA=9:TP=-1.5:print_format=summary -f null -
Extract and inspect snapshots from the hook, each major reversal, the last spoken line, and the final card. Confirm the last subtitle does not overlap the final card.
Deliver the final video plus cover, script/shot list, subtitles, character bible, prompt set, keyframes/contact sheet, and reusable audio mix.
Do not call the episode complete when any of these remain: