关于 what-if-animation
用于制作 15–25 秒 What If 动画短片的 Skill,涵盖脚本、分镜、动画、声音到最终渲染的分阶段流程。它以 Claude 编写 SVG 画面并用 Remotion 渲染,语音和音效来自 ElevenLabs。
主要功能
- 01分阶段短片制作流程
- 02使用 Remotion 设计 SVG 镜头
- 03生成 ElevenLabs 语音与音效
- 04分镜和动画检查
- 05生成成本与渲染报告
适用场景
- 01根据主题制作短片
- 02动画制作前检查分镜
- 03检查节奏、混音和最终渲染
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ kelano86/ what-if-animation --skill what-if-animation安装后在 Claude Code 中输入/what-if-animation确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEREADME.md.gitignoreopencode/commands/what-if.mdreferences/look.mdformula.mdsound.mdtraps.mdkit.mdscripts/board.pymaster.pyplan.pysfx.pymotiongrid.pyvoice.pywi.pystills.mjsmixcheck.pystudio/.gitignorepackage-lock.jsonremotion.config.tspackage.jsonstudio/src/Root.tsxCastSheet.tsxstudio/src/engine/episode.tsxanim.tsfurnish.tsxindex.tsfonts.tskit.tsx详细介绍
假如动画
输入一行主题,产出一集 15-25 秒的成片。每一帧都是 Claude 编写的 SVG(由 Remotion 渲染);配音和音效来自 ElevenLabs。studio/src/episodes/ 中附有两个示例,都已准备好渲染:rewind(“假如你能倒回 10 秒?”——展示能力的片段:镜头倒放,体现这项能力)和 copy-paste(“假如你能复制粘贴任何东西?”——本技能的首次完整运行:全新的厨房布景、科学环节的示意图,以及悬念式黑屏)。开始前,请先阅读与主题最接近的示例。
| 文件 | 内容 |
|---|---|
references/formula.md | What If 的七拍公式、15-25 秒的节奏结构、脚本规则、如何选择主题 |
references/look.md | 经过校准的视觉风格、节奏、镜头词汇,以及分镜和动态效果检查清单 |
references/kit.md | 构建模块:引擎、角色、布景、房间套件、灯光、UI、视觉风格,以及如何添加每一项 |
references/sound.md | 编写声音事件、提示词、音量、电量成本 |
references/traps.md | 两集示例中所有耗费时间的问题 |
studio/ | Remotion 项目:复制一次,之后每集都在其中制作 |
scripts/ | 配音、计划、静帧、分镜、音效、混音检查、动态网格、成片(需要 Python 3.9+ 和 Node) |
规则
- 只能使用原创角色。 Pip(主角,视觉风格 B)和他的朋友 Mo 是我们的原创角色,妹妹、妈妈和机器装置上的西装角色也一样。绝不能使用某个频道自己的主角,也不能使用与知名卡通角色相似的角色:请在角色表上检查每个新造型(Mo 最初的帽子因设计过于相似而被弃用)。
- 故事必须原创。 公式可以共享,但这一集不能属于别人。不要重制某个频道的标题。
- 绝不要声称热门频道是用 Claude 或其他工具制作的。没人说过他们是怎么制作的。
- 只按名称处理密钥。
ELEVENLABS_API_KEY,从环境变量或 studio 上层目录中的.env文件读取。绝不打印、粘贴或硬编码密钥。 - 报告每次运行消耗的 ElevenLabs 点数: 脚本会将点数记录到
out/<slug>/costs.json,master.py会在report.json中汇总。配音的成本从账户历史记录中读取(精确值);音效片段不会显示在历史记录中,因此其成本来自账户计数器,该计数器可能有延迟:报告前请重新读取。交付剧集时要告知点数。copy-paste运行消耗了 152 点(配音 78 点,12 个新音效片段 74 点)。 - 先做分镜,再做动画。 静帧通过自检(步骤 5),且在有人参与审核的情况下由对方看过分镜前,不得渲染视频。
- 所有事实都必须真实。 脚本中的数字必须先在剧集的
science字段中计算并注明来源。
设置(每台机器只需一次)
需要 Node 18+、已加入 PATH 的 ffmpeg 和 ffprobe、装有 numpy 和 Pillow 的 Python 3.9+,以及 ElevenLabs 密钥。
cp -r <skill>/studio ./what-if-studio && cd what-if-studio && npm install
以下所有操作都在该 studio 文件夹中运行;<skill> 是本技能的文件夹。若要离线工作或使用自己的品牌字体,请将显示字体放入 public/fonts/,并在 src/studio.config.ts 中设置 titleFont(默认标题字体 Bricolage Grotesque 和 UI 字体会在渲染时从 Google Fonts 加载)。若要将现有 studio 更新到较新的引擎,请将 <skill>/studio/src/engine 复制到其 src/engine。
工作流程
按顺序完成以下步骤。每一步结束后都要先查看成果,再进行下一步。
1. 脚本
阅读 references/formula.md。先在 YouTube 上搜索这个设想:如果某个 What If 频道已经做过完全相同的一集,就更改能力或规则。根据主题行,确定能力的名称、规则、三个逐步升级的演示,以及转折点(一个带数字的真实事实)。编写 src/episodes/<slug>/episode.json,其中包含 id(PascalCase,即合成名称)、slug、topic、title(两行)、script(每拍一条)和 science(每项事实包含:论点、推算过程、来源)。共 45 到 65 个词。按节奏大声读出来:每句话都必须能让人脑海中浮现画面。
2. 配音
python <skill>/scripts/voice.py <slug>
用 ElevenLabs 生成一条带字符时间戳的配音(356 个字符的复制粘贴版本花了 78 个积分),然后剪辑停顿,让节奏符合该类型的步调:public/<slug>/voice.wav 和 src/episodes/<slug>/words.json。检查时长(15-25 s)和打印出的词语时间。用 episode.json 中的 gaps 调整停顿,然后重新运行:配音会缓存,因此这次免费。修改一个词就会再次调用 API。
3. 镜头列表
为脚本中的每张画面设计一个镜头(通常为 9 到 14 个),每次剪辑都变换景别和角度(远景、插入镜头、中景、特写、过肩镜头、俯拍、仰拍;参见 references/look.md)。添加到 episode.json:
shots:{ "id": "S1", "size": "medium", "set": "kitchen", "key": 14, "note": "what we see" }(key是分镜显示的该镜头自身时钟的帧)edit:每次剪辑对应一个{ "shot": "S1", "at": "cookie" },以剪辑落点所在的词作为提示(plan.py会列出提示形式;reverse、from、to和look用于改变镜头时钟的特殊效果)fx:单帧闪光和抖动,{ "at": "S3+2", "kind": "flash" }
python <skill>/scripts/plan.py <slug>
它会写入 timeline.json 和 out/<slug>/shotlist.md,并打印节奏。开场每分钟争取剪辑 27 次以上,且不要出现超过约 3 s 的静止镜头;在绘制任何内容前,先修正它标出的问题。
4. 分镜
阅读 references/kit.md 了解构建模块。编写 src/episodes/<slug>/shots.tsx,每个镜头对应一个组件,组件仅由其时钟 t 决定(复制两个示例中 shots.tsx 的模式);再编写 index.tsx(集数及其特殊效果风格),然后将该集添加到 src/episodes/index.ts。此时,每个镜头只需在其 key 帧上正确即可。如果某个主题需要的场景库里没有,就用房间套件构建,并将其添加到 src/engine/sets/(以及该技能的副本)中,以便下一集使用;复制粘贴的那次运行就添加了厨房和示意图。新增角色或服装时,先添加外观,再在角色表上检查(npx remotion still src/index.ts Cast out/cast.png)。
npx tsc --noEmit
node <skill>/scripts/stills.mjs <slug>
python <skill>/scripts/board.py <slug>
out/<slug>/storyboard.jpg:每个镜头一张带说明文字的静帧。
5. 自查静帧
查看分镜,然后以全尺寸打开 out/<slug>/board/ 中的每张静帧,并逐镜头如实执行 references/look.md 中的分镜检查清单。记下所有问题,修复后只重新渲染那些镜头(stills.mjs <slug> S3 S7),重新生成图页并再次检查。重复此过程,直到通过为止。遇到问题时,先查看 references/traps.md,再想办法解决。如果有人参与审核,现在就把图页给对方看,并在制作动画前记录对方的意见。
6. 动画
从关键姿势开始,让每个镜头动起来:用 poseAt 设置关键帧,加入预备动作、停顿和过冲;用 faceAt 设置表情;用 kf 设置摄像机运动;再加入特殊效果风格和 fx。然后渲染草稿并检查运动:
python <skill>/scripts/master.py <slug>
python <skill>/scripts/motiongrid.py <slug> S2 S5
node <skill>/scripts/stills.mjs <slug> --frames 120 240
对照 references/look.md 中的运动检查清单,把网格当作翻页动画来查看;修复并重新渲染,直到效果清晰易读。
7. 音效
阅读 references/sound.md。在 episode.json 中添加 sound:片段(提示词和时长)、每个可见动作对应一个按镜头提示的事件、每个地点的环境音、音乐底轨和音量。先检查库里已有的内容,再生成:
python <skill>/scripts/sfx.py <slug> --dry
python <skill>/scripts/sfx.py <slug>
它会打印所用积分,并在 timeline.json 中设置各音轨的音量。然后检查每个词是否都清晰可辨:
python <skill>/scripts/mixcheck.py <slug>
它会列出说话期间音效或音乐与人声相差不到 3 dB 的时刻。用于表现某个词的音效应落在该词之后紧接的停顿中,不能与词同时出现;关键台词下方的背景音(如嗡鸣或持续低音)要调低;如果大部分音轨都盖过人声,就调低 sfx_lu。重新运行 sfx.py 和检查,直到只剩有意为之的重叠(标题轰鸣、转场)。
8. 完成并交付
python <skill>/scripts/master.py <slug>
渲染视频,将混音调整到 -14 LUFS、峰值低于 -1 dBTP,并写入 out/<slug>/report.json(时长、响度、语速、积分)。戴上耳机,从头到尾完整听一遍最终文件。交付 out/<slug>/<slug>-final.mp4 和 out/<slug>/storyboard.jpg,并附上时长、使用的 ElevenLabs 积分,以及你认为仍可改进的地方。
单集文件存放位置
| 路径 | 内容 |
|---|---|
src/episodes/<slug>/episode.json | 你编写的所有内容:剧本、科学内容、镜头、剪辑、特效、声音 |
src/episodes/<slug>/shots.tsx, index.tsx | 绘图内容:每个镜头一个组件,以及超能力的视觉效果 |
src/episodes/<slug>/words.json, timeline.json | 由 voice.py 和 plan.py 写入(sfx.py 会添加音量) |
public/<slug>/ | voice.wav、sfx.wav、music.wav |
out/<slug>/ | 分镜静帧、storyboard.jpg、shotlist.md、动态网格、渲染文件、costs.json、report.json |
library/sfx/ | 每个生成的音效片段,供所有单集共用 |