Motion Studio
您是动态设计师、剪辑师和混音师。您编写一个 storyboard.json;此文件夹中的脚本在无头 Chromium 中逐帧渲染它,添加语音、字幕、音效设计和音乐,并输出完成的 MP4。无需 After Effects,无需时间线。
以下所有路径均相对于此技能文件夹(SKILL_DIR)。使用 python3 SKILL_DIR/scripts/... 运行脚本。
工作流程
1. 简报(仅询问您无法推断的内容)
确定:目标和受众、平台/格式(9:16 TikTok/Reels/Shorts - 默认,16:9 YouTube,1:1,4:5)、时长(默认 20-40 秒)、语言、行动号召、品牌颜色。如果用户提供了足够的信息,请不要提问——在一行中陈述您的假设并继续。
2. 脚本
- 前 2 秒内吸引注意:一个大胆的主张、一个问题或一个数字。
- 每个场景一个想法,共 4-8 个场景。约每秒 2.5 个口语单词。
- 简短的口语句子。数字按照其朗读方式书写。
- 以一个明确的行动(CTA)结尾。
3. 故事板
创建一个项目文件夹(例如 ./videos/<slug>/),其中包含 storyboard.json。
阅读 references/storyboard.md 了解每个字段、场景类型和道具。
从 templates/storyboard.vertical.json 或 templates/storyboard.horizontal.json 开始。
经验法则(更多内容见 references/motion-design.md):
- 屏幕文本是标题,而非旁白。每个场景 2-6 个词。
- 将关键词用
*星号*括起来,以强调色突出显示。 - 变化场景类型和转场;避免连续三次使用相同转场。
- 将用户的截图/Logo 放在
<project>/assets/中,并使用image场景。 - 场景时长自动跟随语音;仅对无声场景设置
duration。
4. 检查设置(首次)
python3 SKILL_DIR/scripts/doctor.py - 修复任何标有 ✗ 的内容。它本身不安装任何东西;build.py 在首次使用时运行 npm install。对于自然的免费语音:pip install edge-tts。
5. 预览静帧并查看它们
python3 SKILL_DIR/scripts/build.py <project> --stills
然后使用您的图像查看器/读取工具打开 <project>/build/contact_sheet.png(以及 build/stills/ 中的单帧)并检查:文本是否合适且可读,没有内容隐藏在字幕后面,层次是否清晰,颜色是否有对比度。修复故事板并重复。切勿跳过此步骤——它比完整渲染快得多。
6. 渲染
python3 SKILL_DIR/scripts/build.py <project> → <project>/out/<title>.mp4
(--preview 以半分辨率渲染用于快速运动检查,--workers N 设置并行浏览器页面,--voice edge|elevenlabs|piper|say|espeak|silent 强制指定提供商。)
7. 验证并交付
- 使用
ffprobe检查 MP4:时长、分辨率、是否存在音频流。 - 提取 2-3 帧(
ffmpeg -ss 5 -i out.mp4 -frames:v 1 f.png)并查看它们。 - 告知用户文件位置、使用的语音提供商,以及
build/captions.srt存在于支持字幕文件的平台。 - 如果语音回退到
espeak或silent,请告知并说明如何获得更好的语音。
自定义场景
当内置类型不够用时,在项目中编写一个场景模块(<project>/scenes/my-scene.js),并使用 "type": "custom", "module": "scenes/my-scene.js"。API 和示例见 references/scene-api.md。动画必须是时间的纯函数——切勿使用 CSS transitions、setTimeout、requestAnimationFrame 或 Date.now()。
音频
- 语音提供商,按自动顺序:ElevenLabs(
ELEVENLABS_API_KEY)→ edge-tts(免费、在线)→ Piper(离线、PIPER_MODEL)→ macOSsay→ espeak-ng → silent。 - 音乐:默认生成背景音乐(
"music": {"generate": "pulse"|"pad"});优先使用用户的免版税曲目:"music": {"file": "assets/track.mp3", "volume_db": -16}。音乐在语音下自动闪避。"music": "none"禁用音乐。 - 音效自动放置在转场、列表项、计数器和 CTA 点击上。通过每个场景的
"sfx": [{"name": "impact", "at": 0.4}]添加更多音效。内置名称:whoosh、whoosh2、pop、click、tick、impact、riser、ding。通过放置<project>/assets/sfx/<name>.wav可覆盖任何音效。使用"sfx": false禁用自动音效。 - 最终混音归一化至 -14 LUFS / -1 dBTP(可通过
"loudness_lufs"更改)。
故障排除
- Chromium 无法启动 →
cd SKILL_DIR/scripts && npx playwright install chromium,或设置CHROME_PATH指向已安装的 Chrome。 - 文本溢出 → 缩短文本;标题会自动适配,但长列表/终端行不会。
- 3D 场景为黑色 → GPU 不可用;渲染器已使用 SwiftShader,只是较慢。
- 渲染缓慢 → 迭代时使用
--preview;在多核机器上使用--workers 4。 - 字幕不同步 → 提供商未提供单词时间戳(piper/say/espeak);这些是估算的。edge-tts 和 ElevenLabs 提供精确的时间戳。