Install
openclaw skills install @tobewin/wechat-article-video-skillopenclaw skills install @tobewin/wechat-article-video-skillProduce a complete WeChat Channels package from an article and its images:
video.mp4: 1080x1920, 30 fps, H.264/AACcover.jpg: usable both as frame 0 and as the platform upload covervoiceover.mp3 and voiceover.srtstoryboard.json and timeline.jsonpublish-copy.mdqa-report.json and contact-sheet.jpgDefault to Chinese, 9:16, edge-tts, synchronized burned-in captions, and a visible cover beginning at frame 0. Preserve medical disclaimers and never expand claims beyond the supplied source.
Choose from the article's purpose, not its word count:
| Mode | Duration | Use |
|---|---|---|
brief | 15-25s | 招商快讯、活动提醒、单一行动 |
compact-standard | 30-40s | 企业/产品推荐的完整信息短版;视频号日更首选 |
standard | 40-75s | 企业入驻、产品推荐、平台宣传; default |
detail | 75-120s | 政策、专题或多产品解读 |
Default enterprise/product recommendations to compact-standard when the user wants a concise WeChat Channels video. Keep standard when the article needs more explanation or a calmer pace. Do not force an enterprise/product recommendation into 15 seconds.
For compact-standard, preserve the key-information matrix while compressing narration:
Use “core facts in voiceover + complete key points on screen.” Do not require every visible fact to be spoken. Target 34-38 seconds when an exact 30 seconds would require deleting key information or making text/voice unreadable.
Use one renderer per video. Both consume the same storyboard.json and timeline.json.
hyperframes, hyperframes-core, hyperframes-creative, hyperframes-animation, and hyperframes-cli skills before authoring. Read HyperFrames Creative's house-style.md and video-composition.md; they specifically prevent web-card/PPT-looking frames.remotion-best-practices and its rules/video-layout.md and rules/subtitles.md before editing Remotion code.Do not render a single composition through both engines. Do not claim a renderer is used unless the project source and render command actually use it.
Create a per-article project and preserve original files:
source/
article.md
images/
notes.md
production/
release/
Copy supplied assets into source/images/; never edit originals in place. Verify every copied file exists, then inspect it visually. Record its subject, crop safety, useful claim, and risks before writing the storyboard. Read references/content-and-compliance.md.
Treat missing or inaccessible supplied images as blocking. Ask the user to reattach them or use an already verified project copy. Do not create a renderable storyboard containing placeholder asset IDs, unverified candidate objects, or paths in temporary WeChat directories.
Extract:
Write production/content-brief.json. For medical/pharma content, factual traceability is mandatory.
Read references/storyboard-schema.md and references/layout-system.md. Use 6-8 purposeful scenes for compact-standard and 4-8 for standard. Each scene must define:
Use these layout templates:
covercompany-profileproduct-herofact-focusctaDo not repeat the same template for adjacent product scenes without changing composition, focal position, or information structure.
Validate before generating TTS:
python scripts/validate_storyboard.py \
--input production/storyboard.json \
--content-brief production/content-brief.json \
--project-root .
Do not continue when validation reports inaccessible assets, blocked source status, unknown source references, or invalid asset field types.
Write the complete spoken script to production/voiceover.txt. Keep punctuation deliberate because it controls cadence. Normalize symbols for speech while keeping display text faithful:
1999年 may be spoken as 一九九九年2ml may be spoken as 二毫升® normally stay on screen but are omitted from speechGenerate one continuous stream so voice, pacing, and loudness remain consistent:
python scripts/edge_tts_generate.py \
--text production/voiceover.txt \
--audio production/voiceover.mp3 \
--subtitles production/voiceover.srt \
--voice zh-CN-XiaoxiaoNeural \
--rate +5%
Use another Edge voice/rate only when the user asks or the article tone clearly requires it. Do not silently switch to a paid TTS provider.
For compact-standard, start between +12% and +20%. Do not exceed +20% merely to hit 30 seconds. If narration still exceeds 40 seconds, remove connective/repeated wording, move supporting facts to on-screen text, preserve all critical claims, and accept 35-38 seconds instead of rushed speech.
Map subtitle entries to scenes in production/scene-map.json, then build the shared timeline:
python scripts/subtitles_to_timeline.py \
--subtitles production/voiceover.srt \
--scene-map production/scene-map.json \
--offset 1.5 \
--tail 0.8 \
--output production/timeline.json
The default 1.5-second lead-in gives the cover a readable silent beat. Place the full voiceover at timeline.audio_start_sec; captions and narration scenes use the shifted timestamps from timeline.json. Never estimate caption timing by character count after real Edge boundaries exist.
Create the complete static end-state of every scene first. A frame must remain useful with all animation disabled. Then add restrained, seek-safe motion.
Hard layout rules:
HyperFrames: keep media as direct children of the composition root, start the voiceover at timeline.audio_start_sec, register one paused seekable timeline, use deterministic assets, and run npx hyperframes check.
Remotion: convert seconds to frames with the composition FPS; convert captions to Remotion's Caption type in milliseconds. Use frame-derived interpolate() animation, <Sequence> for timing, <Img>/<Audio> for media, and no CSS transitions or CSS animations.
Before final render, inspect at least the start, middle, and end of every scene. For HyperFrames use snapshots; for Remotion render stills. Build a contact sheet after rendering:
python scripts/make_contact_sheet.py \
--video release/video.mp4 \
--timeline production/timeline.json \
--output release/contact-sheet.jpg
Reject the layout when:
Read references/qa.md, then run:
python scripts/qa_video.py \
--video release/video.mp4 \
--timeline production/timeline.json \
--cover release/cover.jpg \
--report release/qa-report.json
QA must confirm:
critical_claim_id is represented in the storyboard and final contact sheetDo not prepend a still with stream-copy concat. If post-processing is unavoidable, fully re-encode and rerun first-frame QA.
storyboard.json.Return links to the MP4 and cover plus resolution, duration, renderer, voice, synchronization status, first-frame verification, and any compliance caveat. Keep editable project files with the release so the next daily article can reuse the design system.