animation-studio: 创意 → 脚本 → 声音 → 安全渲染 → MP4
此文件是一个路由。它负责询问四个关键问题、检查硬件,然后只加载任务所需的文件:
content/<pack>.md(编写和准确性规则) + styles/<style>.md(外观;其JSON块是引擎读取的预设) + engines/<engine>/README.md(如何渲染)。共享工具位于 shared/ 目录下。
找到技能文件夹(SKILL_DIR) = 包含此文件的文件夹。Claude Code将其显示为技能的基础目录;对于其他代理:则是你被告知读取的SKILL.md所在文件夹。始终使用 "$SKILL_DIR/shared/..."(带引号)来调用工具,因为路径通常包含空格。找到一个Python 3.10+(python3、python 或 py -3),并将其称为 PY。运行 setup_check.py --install 后,使用它打印出的venv python。
通过一个任务列表让用户随时了解进度。将每个交付物写入用户工作文件夹下的 videos/<slug>/(slug = 简短的小写连字符名称,如 my-demo)。用通俗易懂的语言解释。
当前版本支持的功能
| 部分 | 状态 |
|---|---|
| 内容包 | ✅ 圣经 (content/bible.md) · ✅ 技术 (content/tech.md) · ✅ 通用故事/广告 (content/general-story.md) · ✅ 数学/教育 (content/education-math.md) |
| 风格 | 引擎 A: ✅ 简笔画 · ✅ 扁平2D · ✅ 故事书 · ✅ 白板 · ✅ 现代矢量 — 引擎 B: ✅ Manim (+ 白板 / 现代矢量颜色) — 引擎 C: ✅ 卡通3D — 引擎 D: ✅ 电影级3D |
| 引擎 | ✅ A py2d (Python 2D) · ✅ B Manim (LaTeX 可选) · ✅ C 卡通3D (慢速: 按层级限制) · ✅ D Blender (Eevee 预览, Cycles 最终渲染在POWER层级) |
| 格式 | ✅ 9:16 · ✅ 16:9 · ✅ 1:1 · ✅ 4:5 |
| 字幕 | ✅ 始终生成 .srt 文件 + 带有高亮效果的样式化硬编码字幕 (shared/captions.py) |
| 声音 | ✅ 用户自己的录音 · ✅ Piper TTS (shared/voice.py, 免费, 离线) |
| 音乐/音效 | ✅ 合成 (shared/sound.py) · ✅ 用户自己授权的音乐文件 |
| 编辑器项目 | ✅ Kdenlive · ✅ Shotcut · ✅ DaVinci Resolve (FCPXML) · ✅ Blender VSE · 🧪 OpenShot (实验性) · ✅ 编辑器包 (CapCut, 任何编辑器) |
| 品牌套件 | ✅ 已保存的品牌 (用户文件夹), 水印, 底部三分栏, 品牌结尾卡, 任意风格使用品牌颜色 (shared/brand.py, docs/branding.md) |
| 软件安装 | ✅ 一个经过验证的注册表 (shared/tools.yaml),包含适用于 Windows、macOS 及各 Linux 发行版的命令;未经确认绝不安装 |
如果用户选择了 🚧 项目,请明确告知,提供最接近的 ✅ 选项,并仍然交付脚本包。
第一阶段:信息收集 (AskUserQuestion, 每次调用最多4个问题;跳过已回答的部分)
调用 1
- 内容: 圣经故事 · 技术/编程 · 数学/教育 · 通用故事/广告
- 风格: 首先为该内容提供默认风格 (圣经 → 故事书 · 技术 → 现代矢量 · 数学 → Manim · 通用 → 扁平2D), 然后提供 2-3 个其他选项。对于快速、轻量级的作品,可提及简笔画风格。
- 格式 (可多选): 9:16 1080x1920 (抖音/Reels/Shorts) · 16:9 1920x1080 (YouTube/投影仪) · 1:1 1080x1080 · 4:5 1080x1350。运行
PY shared/formats.py table可打印平台对应表。 - 质量: 预览 (快速, 720p) · 最终版 (1080p)。始终建议优先制作一个5秒的预览。
调用 2 (仅适用部分)
0. 品牌设定? 无 · 使用已保存的品牌 (从 PY "$SKILL_DIR/shared/brand.py" list 列表中选择) · 创建新品牌。创建新品牌: 一次只询问一个字段,所有字段均为可选 (名称, 标语, 网站, logo 文件, 电话, WhatsApp, 邮箱, 社交媒体, 颜色, OFL 字体, CTA),并使用 brand.py set 保存 (它会验证电话/邮箱/URL/颜色格式);logo 通过 brand.py logo 设置,字体通过 brand.py font 设置。切勿自行编造联系信息:只使用用户提供的信息 (或用户从其自己网站上确认的信息)。然后是选项,默认值来自 docs/branding.md: 水印 (广告/推广类 ON;圣经、技术和数学类 OFF), 位置/大小/透明度/logo 或 logo+名称 · 底部三分栏 (何时显示,显示多久) · 包含 CTA 和联系方式的结尾卡 (广告/推广类 ON) 及其时长 · 是否将风格重新着色为品牌颜色 (是/否)。
5. 主题/故事和时长 (30 秒 · 60 秒 · 90 秒 · 2–3 分钟;其他时长通过“其他”选项设定)。内容包可能增加自己的问题 (圣经: 观众群体)。
6. 声音: 我自己的录音 (默认) · Piper TTS (免费,离线;默认语音 en_US-ljspeech-medium, 使用公有领域数据)。Piper 需要一次性安装 (setup_check.py --tts --install) 和语音包下载 (voice.py --download, 约 60 MB): 请先征得同意。
7. 是否硬编码字幕? 对于 9:16 和 1:1 格式建议“是”(多数人静音观看),对于 16:9 则建议“否”。无论选择如何,始终会生成一个 .srt 文件。
8. 结尾卡 "使用 animation-studio 制作"? 默认关闭;仅限用户主动选择。切勿添加水印。
9. 输出: 完成的 MP4 · 编辑器项目文件 · 两者都要。
编辑器选择 (仅当输出包含项目文件时): 运行 PY "$SKILL_DIR/shared/tools.py" status --kind editor 并显示完整的编号列表 (✅ 已安装 + 版本 · ❌ 未安装 · ⚠️ 当前环境不支持, 例如在无图形界面的服务器上使用桌面编辑器)。用户精确选择一个 (AskUserQuestion: 最多 4 个选项,已安装的编辑器排前面;其余的可通过“其他”输入)。如果选择的是 ❌ 状态,则逐字显示 PY "$SKILL_DIR/shared/tools.py" flow <editor> (说明它是什么、针对当前操作系统/发行版/shell的安装命令、官方链接) 并询问: 现在安装 (我来运行) · 我自己安装,完成后说“done” · 选择另一个编辑器 · 跳过,给我 MP4 + 编辑器包。"现在安装" → tools.py install <editor> --yes (如果 Windows 会弹出权限提示,或者某个步骤需要 sudo,请提前说明;sudo 步骤交给用户以 ! sudo ... 形式运行)。安装或“done”后: 再次运行 status,确认 ✅,然后从断点处继续。CapCut 和不支持的编辑器将获得编辑器包。详情: docs/editors.md。
将答案记录在 videos/<slug>/brief.md 文件中。
第二阶段:硬件检查 (在任何渲染之前执行;切勿跳过)
运行 PY "$SKILL_DIR/shared/hwcheck.py",并用一条简短消息显示其表格和层级。它还会保存系统配置文件 (操作系统 + 版本、WSL、Apple Silicon、Linux 发行版及系列、包管理器、shell、显示器信息),后续所有步骤都会读取该文件。你显示或运行的每个安装命令都必须来自 PY "$SKILL_DIR/shared/tools.py" cmd <tool> (根据当前操作系统、发行版和 shell 匹配);切勿凭记忆输入。无显示器 (无图形界面) → 仅限渲染:无编辑器应用。
| 层级 | 规则 | 引擎 | 限制 |
|---|---|---|---|
| LITE | < 12 GB RAM 或 < 4 个 CPU 线程 | A, B | 仅限 720p;卡通3D 和 Blender 被阻止 (可提供静态图片) |
| STANDARD | 介于两者之间 | A, B 全功能;C 预览 ≤ 5 秒 (更长时间需确认 + 续播);D Eevee 在 720p、低采样下 ≤ 5 秒 | 1 个渲染任务;工作线程数 = 线程数 − 2 |
| POWER | ≥ 32 GB RAM + 独立 GPU ≥ 6 GB VRAM | 全部, Cycles 可在 GPU 上运行 | 工作线程数 = 线程数 − 1 |
如果笔记本在使用电池,在任何超过一分钟的渲染前发出警告。如果空闲 RAM 低于 25%,请用户关闭大应用程序。
第三阶段:选择引擎 (风格 → 引擎),然后加载文件
| 风格 | 引擎 | 加载 |
|---|---|---|
| 简笔画, 扁平2D, 故事书, 白板, 现代矢量 | A engines/py2d | styles/<style>.md, engines/py2d/README.md |
| Manim (数学, 算法, 图表); 白板/现代矢量颜色在这里也适用 | B engines/manim | styles/manim.md (或选择的风格), engines/manim/README.md |
| 卡通3D | C engines/toon3d (一个包含 story.js + world.js 的项目文件夹) | styles/toon-3d.md, engines/toon3d/README.md |
| 电影级3D | D engines/blender (scene.json, Z 轴朝上) | styles/cinematic-3d.md, engines/blender/README.md |
如果硬件层级阻止了引擎运行,请说明原因并提供替代方案:使用引擎 A 的风格讲述同一个故事,或者只提供几张静态图片。只有在发出明确警告后(“这可能导致您的计算机死机或过热;请先保存工作”),用户才能覆盖限制。
然后加载 content/<pack>.md 并遵循其研究和编写阶段。
第四阶段:脚本包 (内容包规则),然后停止
每个包交付的内容包括:一段可复制的旁白文本块 (除非内容包另有说明,否则语速约为 3.7 词/秒),附带字数统计和时长 → script.txt;一个镜头列表 → shotlist.md;包内附加内容 (圣经: 忠诚度表格、学习笔记、描述);以及文末的资料来源。切勿编造经文、引文、API、标志、版本或事实:要么获取,要么运行,否则标记为 未验证。
然后将画外音交给用户 (用户的录音:mp3/wav, 无伴奏音乐),并等待音频文件。如果用户只需要脚本,则在此停止。
第五阶段:生产
- 环境设置:
PY "$SKILL_DIR/shared/setup_check.py" --engine <engine>→ ✅/❌ 表格。缺少工具 (Blender, Manim, Node, LaTeX, Inkscape...) 时使用与编辑器相同的流程:显示tools.py flow <tool> --for engine,然后现在安装 · 我自己安装,完成后说“done” · 选择另一种风格 · 跳过 (仅获取脚本、镜头列表和参考资料);之后重新检查。Python 包仅安装到技能自己的.venv(--install, 需确认)。 - 声音 + 时间线。 Piper:
PY "$SKILL_DIR/shared/voice.py" script.txt voice.wav --timing work --speed 0.85(精确的短语时间,无需猜测)。用户录音:PY "$SKILL_DIR/shared/timing.py" voice.mp3 script.txt --out work。两者都会生成work/words.json+work/phrases.json。 - 场景: 引擎 A:
videos/<slug>/scene.json;引擎 B: 一个以from studio import *开头的 Manim.py场景文件;引擎 C:videos/<slug>/story.js+world.js;引擎 D: 一个 Blenderscene.json文件 (格式在引擎的 README 中)。每个短语一个镜头;保持面部、文字和关键道具在每种所选格式的安全区域内 (shared/formats.md)。 - 外观检查: 为每个格式渲染 3–6 帧 (
--frames 0,60,...),制作一个联系表 (PY "$SKILL_DIR/shared/sheet.py" sheet.jpg <dirs> --safe <fmt>),展示给用户,并根据内容包的规则检查 (圣经: 虔诚 + 无暴力)。在渲染前修复问题。 - 预估:
PY "$SKILL_DIR/shared/estimate.py" --engine <engine> scene.json --fmt <fmts> --quality <q>(Manim:--engine manim scene.py --name SceneName --timing work/phrases.json;卡通3D:--engine toon3d <project folder>;Blender:--engine blender scene.json) →DECISION: OK进行渲染 ·ASK告知用户“约需 X 分钟,Y GB 空间”并询问 (提供 5 秒预览选项) ·REFUSE磁盘空间不足 (需要预估空间的两倍):请用户释放空间。 - 渲染: 一次渲染一个格式 (切勿同时进行两个任务)。长时间渲染在后台运行;引擎以低优先级运行,如果重新运行,将从最后保存的帧继续;如果空闲 RAM 低于 15%,将自行暂停 (退出代码 4)。告知用户可以继续其他工作。
- 音频: 音乐
PY "$SKILL_DIR/shared/sound.py" music music.wav --seconds <视频长度> --mood warm|calm|tense|tech|playful, 音效... sfx sfx.wav --seconds <len> --cues cues.json(pop, whoosh, type, chime, success, swell, rain, soft thunder), 然后PY "$SKILL_DIR/shared/mix.py" voice.wav music.wav sfx.wav --music-db -12 --sfx-db -10 --seconds <len>(音乐音量绝不能超过旁白音量 −6 dB;对于旁白多或庄严的视频,设为 −9 到 −12)。用户提供的音乐文件将替换 music.wav:提醒用户一次他们必须拥有其权利。 7b. 品牌 (如果选择了):渲染前重新着色 (brand.py recolor <brand> --style <style> --out style_<brand>.md, 并将其用作场景风格); 渲染后,brand.py apply <brand> frames_<fmt> branded_<fmt> --fmt <fmt> [--watermark tr,9,90,logo] [--lower-third a,b] [--end-card 2.5 --cta "..."] [--captions]并用branded_<fmt>进行后续操作。如果有结尾卡,使用--seconds <新长度>来混合音频。 - 字幕 + 收尾 + 质量检查:
PY "$SKILL_DIR/shared/captions.py" work out/<Title> --style <style> --fmt <fmt> --quality <q>(→.srt+_<fmt>.ass), 然后PY "$SKILL_DIR/shared/finish.py" frames_<fmt> out/<Title>_<fmt>.mp4 --audio mix.wav --quality <q> [--ass out/<Title>_<fmt>.ass] --srt out/<Title>.srt [--end-card 仅当用户选择时]。检查质量保证行 (黑帧/静止帧跨度,约 -14 LUFS),并查看_qa.jpg图像。 - 编辑器项目 (如果选择了):
PY "$SKILL_DIR/shared/editors.py" prepare --frames frames_<fmt> --shots "<f0>-<f1>:<name>,..." --final out/<Title>_<fmt>.mp4 --voice voice.wav --music music.wav --sfx sfx.wav --srt out/<Title>.srt --out videos/<slug>/editor然后... export videos/<slug>/editor/timeline.json --editor <kdenlive|shotcut|openshot|resolve|blender-vse|pack>。显示其检查表 (时间轴必须与 MP4 匹配;Kdenlive/Shotcut 还会得到一个 2 秒的 melt 测试渲染)。告知用户如何打开它 (docs/tools/.md)。 - 交付 MP4 文件、.srt 文件、编辑器项目文件 (如有),以及一个描述每个镜头画面的清单。仅当用户选择时才添加可选的结尾卡。
安全规则 (始终遵守)
- 未完成第二阶段和第五步 (预估) 之前,绝不开始渲染。始终提议“先预览 5 秒”。
- 遵守硬件层级限制;只有在给出明确警告并获得“是”的确认后才能覆盖。
- 一次只执行一个重型任务。未经询问,绝不删除或覆盖用户的文件 (重新渲染到已有的帧文件夹是续播;
--force会覆盖,所以需询问)。 - 如果工具缺失或用户拒绝安装,仍然交付脚本、镜头列表和参考资料。
鸣谢与许可
代码:MIT 许可 (见 LICENSE)。捆绑的第三方代码在 THIRD_PARTY_NOTICES.md 中列出。该技能不捆绑任何字体、音乐或图像:它使用系统字体和合成声音。用户的视频归用户所有:无强制水印;结尾卡是选择加入的。