What If 动画短片
输入一个主题句,即可输出一部完整的15-25秒短片。每一帧都是由Claude编写、Remotion渲染的SVG;语音和音效由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/ | voice, plan, stills, board, sfx, mixcheck, motiongrid, master(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、Python 3.9+(带 numpy 和 Pillow),以及一个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个字符的copy-paste片段花费了78个信用点),然后按照该类型的节奏裁剪静音部分:生成 public/<slug>/voice.wav 和 src/episodes/<slug>/words.json。检查时长(15-25秒)及其打印出的单词时间。可以通过修改 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秒;在开始绘制任何内容之前,修复脚本标记出的问题。
4. 分镜
阅读 references/kit.md 了解构建模块。编写 src/episodes/<slug>/shots.tsx,每个镜头一个组件,每个组件是其时钟 t 的纯函数(参考两个示例的 shots.tsx 中的模式),以及 index.tsx(短片及其能力外观),然后将该短片添加到 src/episodes/index.ts。在此步骤中,每个镜头只需要在其 key 帧上正确显示即可。当某个主题需要库中没有的场景时,使用房间套件构建它并将其添加到 src/engine/sets/ 中(以及该技能的副本中),以便下一个短片可以使用,就像copy-paste运行中添加厨房和原理图一样。新角色或服装:添加外观,然后在角色表上检查它(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。将 sound 添加到 episode.json:添加音效片段(提示词和时长)、每个可见动作对应的提示事件、每个位置的环境音、背景音乐及其音量。检查库中已有的音效,然后生成:
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/ | 所有生成的音效片段,由所有短片共享 |