Install
openclaw skills install @tobewin/english-learning-animationProduce and quality-check animated English shorts with Qwen3-TTS.
openclaw skills install @tobewin/english-learning-animationCreate a coherent, original short-form English lesson. Prioritize a watchable scene over a slide deck with narration.
semantic_contract to script.json: topic, setting, visual brief, required scene tags, and stale terms that must never appear. Every scene needs semantic_tags. Give every voice segment a stable semantic owner such as customer, barista, or narrator; do not use gender as the long-term character identity.voice_profile and add line-specific performance direction.paper-collage-remotion; never animate a single flattened illustration as the whole video.Initialize a new project from the approved layered-animation baseline:
python <skill>/scripts/init_project.py <new-or-empty-project-directory>
Add the empty background plates and transparent cutouts at the asset paths declared in script.json; do not copy generated user content into the skill. Each speaking cutout should declare a speaker field matching the narration role id.
Generate role-separated audio with the bundled script:
python <skill>/scripts/generate_qwen3_voices.py voice-manifest.json \
--model <local-qwen3-tts-voicedesign-checkpoint>
Use voice-manifest.json as the editable voice contract. Every row needs a semantic role id, English line, stable voice_profile, and line-specific performance instruction. The generator remains compatible with the older combined voice_instruction field.
Keep the manifest's generation seed for reproducible auditions. Device selection is automatic (CUDA → MPS → CPU); override it only when necessary.
If the Qwen3 path is unknown, discover it first:
python <skill>/scripts/find_qwen3_voicedesign.py
The model finder respects HF_HOME; pass --cache-dir for a nonstandard cache.
Travel English · Speak Naturally; do not put the total runtime on the cover unless the user explicitly requests it. Any runtime claim must come from the final measured render.script.json under phrase_cards, keyed by narrator segment id. The renderer must read this data; never leave topic-specific cards hard-coded in video.tsx.Before delivery, verify the current render against references/quality-gates.md.
Run all pre-render gates with one command:
python <skill>/scripts/validate_project.py <project-directory>
This preflight also rejects missing topic/scene tags, stale prohibited terms, and hard-coded phrase-card logic. After rendering, inspect the generated cover and one review frame per segment against the semantic_contract; mechanical validation cannot decide whether an illustration truly depicts the requested setting.
After rendering, run the same acceptance pipeline with the final video. This also extracts the cover and one representative frame per spoken segment:
python <skill>/scripts/validate_project.py <project-directory> \
--video <final.mp4> \
--review-dir <review-frame-directory>
Use the individual gates below when diagnosing a failure.
Validate the lesson and voice contract:
python <skill>/scripts/validate_lesson.py voice-manifest.json
python <skill>/scripts/validate_contract.py voice-manifest.json script.json
Before rendering, validate that every declared character asset is a real opaque cutout rather than a flattened or ghosted plate:
python <skill>/scripts/validate_layers.py script.json public
After generating audio, check actual durations, declared scene windows, overlap, English-only captions, and speaker-to-layer ownership:
python <skill>/scripts/validate_timeline.py script.json public
After rendering, validate the stream and extract the cover plus one representative frame per spoken segment. Inspect all review frames before delivery:
python <skill>/scripts/validate_render.py out/final.mp4 --cover-frame work/cover-check.png
python <skill>/scripts/extract_review_frames.py \
out/final.mp4 script.json work/review-frames
paper-collage-remotion for cutout-layer animation and Remotion rendering.imagegen to create new bitmap background plates or cutouts.ffprobe to read actual audio/video duration and validate the final file.