动画短片
你正根据一个故事制作一部卡通短片电影。用户提供一个故事、一句剧情梗概、场景列表或一个脚本。你将交付一个完成的 mp4 文件和一条 Instagram 帖子文案。你自行完成所有步骤,并且在此过程中不会停下来请求批准。
这个技能制作的电影看起来是手绘动画的:角色会挤压、拉伸、眨眼并做出反应,镜头永远不会静止,具有纸墨质感,画面与配音完美契合。它们绝不能看起来像是带有文字的静态图片幻灯片。这个技能中的一切都是为了可靠地实现这种效果而存在的,所以请按顺序执行步骤,并使用提供的工具包,而不是发明你自己的系统。
下面的 SK 指的是这个技能的文件夹:~/.claude/skills/animation-video。
工作原理(请阅读一次)
- 整部电影是一个你编写的 JavaScript 文件
film.js。它描述了在任何时间点t屏幕上显示的内容。一个脚本在无头 Chrome 浏览器中逐帧渲染,ffmpeg 生成 mp4。没有视频编辑器,也不进行图像生成。 - 配音是逐行先生成的。其实际的计时信息被写入
timeline.js。电影中的每一刻都是相对于配音定义的(例如,“第4行开始前0.2秒”),因此画面和声音永远不会不同步。 - 工具包为你准备好了困难的部分:一个引擎(缓动、镜头、场景、字幕)、两种完整的艺术风格(包含角色、姿态和道具),以及25个经过测试的动画配方。
- 你通过渲染静态帧并查看它们来检查你的工作。这不是可选的。你无法判断一部你从未看过的电影的质量。
步骤
根据这些步骤创建任务列表,并按顺序执行。
| # | 步骤 | 结果 |
|---|---|---|
| 0 | 预检 | 所有工具就绪,VoiceStudio 正在运行 |
| 1 | 阅读故事,选择风格 | 做出决定,创建项目文件夹 |
| 2 | 编写脚本 | vo/script.json,最多 130 个口语单词 |
| 3 | 生成配音 | 每行配音检查一个 wav 文件 |
| 4 | 构建时间线 | timeline.js,电影时长 35-45 秒 |
| 5 | 规划镜头 | 在 film.js 顶部添加一个镜头规划注释 |
| 6 | 编写电影 | film.js,逐个场景编写,边写边检查静帧 |
| 7 | 审查整部电影 | 查看联系表,修复缺陷 |
| 8 | 导出 | mp4 文件 |
| 9 | 交付 | mp4 + 带配音的脚本 + Instagram 文案 + 诚实的备注 |
步骤 0 - 预检
bash ~/.claude/skills/animation-video/scripts/preflight.sh
每行都必须显示 OK。如果 VoiceStudio 状态是 MISSING,请让用户打开 VoiceStudio 应用并等待;切勿替换为不同的语音或跳过配音。使用脚本打印出的命令修复任何其他问题。
步骤 1 - 阅读故事并选择风格
除非根本没有故事,否则不要向用户提问。自行做出以下决定:
- 风格。 有两种风格。查看
SK/references/characters-ink.jpg和characters-paper.jpg(使用读取工具查看图片)以了解它们。ink:粗而摇摆的墨水线条,粗体衬线标牌,温暖的复古卡通风格。最适合有反派、闹剧、店铺、街道、肢体笑话的故事。paper:剪纸拼贴风格,无轮廓,柔和阴影,优雅的衬线字体。最适合关于手机、应用、链接、自然,或更柔和、更现代氛围的故事。- 如果用户指定了风格,就使用它。否则,如果工作文件夹中已有早期的剧集,则使用另一种风格(运行
head -3 */style.js 2>/dev/null查看之前使用了哪种)。否则,根据故事选择。
- 演员表。 谁是英雄(小企业主或主角)?谁或什么是障碍(反派、困惑的顾客、迷宫)?两个主要角色就足够了。
- 项目文件夹。 从故事中取一个简短的名字,放在用户的工作文件夹中。
bash ~/.claude/skills/animation-video/scripts/new_project.sh "./film-<short-name>" ink # 或 paper
这将创建一个包含可工作的入门 film.js 的项目。现在就阅读那个入门文件:它很短,展示了你需要遵循的准确结构。
步骤 2 - 编写脚本
首先阅读 SK/references/story.md。它包含了结构、字数预算和示例。最重要的规则:
- 全部口语总字数最多 130 个单词。 配音大约每秒说 3.2 个单词,所以 130 个单词大约是 43 秒。如果用户的脚本更长,请自行缩减,保留他们最好的台词和故事的顺序。不要询问;在最后告诉他们你删减了什么。一部节奏紧凑的短片总是比一部拖沓的长片好。
- 一个节拍一行,每行 5-16 个单词,id 为
l01、l02……每一行成为一个音频片段,通常对应一个视觉想法。 - 为听觉而写:数字用单词表示(如“forty”,而不是“40”),没有表情符号,没有符号,品牌名称根据发音拼写(例如 SiteKeep 写成“Site Keep”)。
- 最后一行是一个号召观众评论的钩子(参见下面的默认品牌信息)。
将其写入 <project>/vo/script.json:
{"l01": "Meet Maya. She makes custom treats from scratch.",
"l02": "So she set up shop inside a giant online marketplace."}
步骤 3 - 生成配音
python3 ~/.claude/skills/animation-video/scripts/voice.py "./film-<short-name>"
每行大约需要 20 秒(一个完整的脚本大约 4-5 分钟):运行它,设置 10 分钟的超时。如果中途停止,再次运行相同的命令;已经配音的行会被保留。它使用用户的语音(配置文件 3a02464e,“ep1 D sample-locked”,英语,16 步,速度 1.0,无指令文本;这些是默认设置,除非用户另有说明,否则不要更改)生成每一行,再次听取,并为每一行打印 OK 或 DIFF 以及听到的内容。
阅读每一个 DIFF 行并做出判断:
- 可以接受: 相同单词的不同写法(“SiteKeep”/“Site Keep”,“40”/“forty”,“two”/“to”,标点符号)。
- 不可接受: 缺少、添加了单词,或者是一个不同的单词(“her menu”被听成“our menu”)。仅重新生成这些行:
voice.py <project> --only l05 l11。如果一行在再尝试两次后仍然失败,则在script.json中稍微修改该行措辞并重新生成它。
切勿交付包含遗漏、添加或错误单词的行。
步骤 4 - 构建时间线
python3 ~/.claude/skills/animation-video/scripts/audio.py timeline "./film-<short-name>"
它会打印总时长以及每行的开始时间和持续时间。然后在 <project>/film.json 中调整停顿并再次运行:
{"lead": 0.55, "gap": 0.4, "tail": 1.6, "gaps": {"l04": 0.7, "l09": 0.9}}
gap是一行之后的默认停顿。对于视觉上有较大发挥空间的行(如搞笑笑话、摔跤、大揭秘、故事转折),给出更长的停顿(0.6-0.9)。- 在同一想法内的行之间使用 0.25-0.35 秒的停顿。
tail是结束卡在最后一句话之后停留的时间(1.4-1.8 秒)。- 目标总时长:35-45 秒。超过 46 秒:从脚本中删减一行并为其重做步骤 3-4。
无论何时你后来重新配音某一行,都再次运行 audio.py timeline。因为每个提示都是相对于配音的,所以电影会自动重新同步。
步骤 5 - 规划镜头
阅读 SK/references/story.md 中的“从脚本到镜头”部分。然后将计划作为注释块写在 film.js 顶部(不要作为单独文档)。每个场景占一行:
/* 镜头规划
A l01-l02 街道, 白天 Maya 在她的摊位后弹出,挥手。镜头:慢推
B l03-l04 同一条街道 Landlord 的影子笼罩她,标牌砰地掉下(震动,尘土)。她跳起来。
C l05 地下室 活板门打开,她悬在空中,落下。镜头跟随向下。
...
Z l12 结束卡 圆形擦除。问题 + “在评论区说一个”。英雄窥视。
*/
一个好的规划包含:5-8 个场景;至少每 6 秒有一个不同的画面;每个场景中有一个清晰的视觉搞笑或惊喜;每一个抽象概念都转化为具体物理表现(费用变成收费站,算法变成活板门,令人困惑的链接变成丛林);情绪从困境转向找到解决方案后的解脱;以及一个结束卡。
步骤 6 - 编写电影
在开始编写之前,请阅读以下内容(它们很短,但却是制作一部好电影与一部失败电影的区别所在):
SK/references/engine.md- 你可以调用的所有函数。SK/references/kit-ink.md或kit-paper.md- 你选择的风格的角色、姿态、道具。SK/references/recipes.js- 25 个经过测试的动作,可以复制。也请查看recipes-<style>.jpg。SK/references/craft.md- 使其具有手绘感的计时数字和规则。
然后按照入门文件中的四个部分编写 film.js:设置、提示时间、声音提示、场景。
一次只编写一个场景。 编写场景 A,从中渲染两三张静帧,查看它们,修复,然后继续场景 B:
node ~/.claude/skills/animation-video/scripts/render.mjs "./film-<short-name>" stills 1.2 3.5 6.0
然后使用读取工具打开 <project>/check/sheet-1.jpg。如果命令打印 PAGE ERROR,则电影有 JavaScript 错误:修复第一个打印出的错误并再次运行。
film.js 的十条规则(每一条都防止了实际发生过的失败):
- 只编辑
film.js(如需可编辑style.js中的颜色)。切勿编辑engine.js或index.html。 - 切勿直接写入原始时间。每个提示都基于配音构建:
L('l04')(行开始)、E('l04')(行结束)、wt('l04', 'three rival')(口语短语的开始时间),加上或减去一个小偏移量。给每个提示起个名字:const tSlam = L('l04') + 0.25;。 - 在词语说出前 0.1-0.3 秒 开始一个动作,使其正好落在词语上。
- 姿态和对象使用
q(时间步进为每秒 12 次:产生手绘动画的感觉)。镜头、震动和擦除使用t(平滑)。 - 在提示触发之前,任何东西都不可见。使用
pop(...)或if (q < tCue) ...使对象在配音提到它们时才出现,而不是之前。 - 没有
Math.random(),没有Date,没有 CSS 动画,没有setTimeout。使用h(n)获取随机性。对于相同的t,电影必须每次都给出相同的画面。 - 背景的绘制要比屏幕大得多(例如 x 从 -1000 到 2080),这样镜头的移动和震动永远不会显示空的边缘。
- 绘制顺序由深度决定:后绘制的东西在更前面。先背景,然后是远处对象、角色、近处对象,最后是效果。
- 将重要内容保持在 x 70-1010 和 y 180-1400 范围内。字幕位于 y 1420-1560,Instagram 自己的按钮覆盖了 y 1600 以下和右侧边缘的所有内容。
- 每个声音都属于一个可见事件,并使用
sfx(time, name)在与事件相同的提示时间声明。一个music(...)背景用于困境部分,另一个用于解脱部分。
质量标准。 在宣布一个场景完成之前,它必须满足所有以下条件:
- 每一帧都有生命力。 英雄眨眼和呼吸(
POSE.idle(q)),背景中有东西在移动(云、摇摆的招牌、漂浮的形状),并且镜头至少有一个慢推。任何持续超过一秒钟没有移动的帧都是一个缺陷。 - 入场和退场是动画化的, 不能是简单的硬切:带过冲的弹出、带弹跳的落下、跳入、带预期的速退(配方 1-6)。
- 冲击在一帧内同时发生: 挤压 + 屏幕震动 + 尘土或爆发 + 音效(配方 3)。仅此一项对于“感觉”的提升就比其他任何东西都大。
- 角色会表演。 他们看着正在发生的事情(
look),在事情发生后一拍才做出反应(配方 9),并在故事情绪变化时改变姿势和表情。切勿让一个角色在整个场景中都保持一个姿势。 - 每个场景都有一个搞笑段子,使想法具体化并带点趣味。
- 可读的文本。 标牌和标签至少 40 像素高,1-4 个单词,高对比度,在屏幕上至少显示 1 秒,且从不被角色或字幕遮挡。
- 场景之间有真正的过渡(配方 19-20,或在一个世界内快速的镜头移动),而不是一幅画直接替换另一幅。
步骤 7 - 审查整部电影
node ~/.claude/skills/animation-video/scripts/render.mjs "./film-<short-name>" check 36
使用读取工具打开两个联系表(check/sheet-1.jpg、sheet-2.jpg)。每个按时间顺序从左到右、从上到下显示 18 帧;时间由命令打印。在每一帧上逐项检查以下列表,并在修复任何问题之前先记录下来:
- 文本被截断、与其他文本重叠,或被角色或道具遮挡
- 字幕覆盖了重要内容,或品牌名称被分割或拼写错误
(设置
CAPTION.replace,或将动作上移) - 有大片空白区域(超过画面的三分之一没有任何内容):拉近镜头,或移动物体,或添加背景细节
- 在配音提及之前就看到了某些东西,或者在它应该消失后仍然存在
- 角色或关键道具部分离开屏幕,太小(高度低于 250 像素),或被隐藏
- 手、手臂或物体穿过本应位于其前面或后面的东西
- 连续两帧(间隔 2 秒以上)看起来完全相同:添加运动或镜头移动
- 在该故事时刻,角色的面部表情错误
- 结束卡:问题可读,评论提示可见,无重叠
修复你发现的问题,然后仅在这些时间点渲染静帧以进行确认
(render.mjs <project> stills 4.2 11.8)。当联系表太小而无法判断时,全尺寸查看单帧(check/f003.jpg)。最多进行两轮完整的审查;不要无止境地润色,也不要跳过审查。
步骤 8 - 导出
bash ~/.claude/skills/animation-video/scripts/build.sh "./film-<short-name>" "./<short-name>.mp4"
这需要 2-10 分钟(纸艺风格更慢):在后台运行或设置 10 分钟超时。它会渲染每一帧,混合配音 + 音效 + 音乐,并打印检查结果。确认:h264 1080x1920 30 fps,aac 音频,时长等于时间线总时长,平均音量在 -16 到 -19 dB 之间。如果渲染打印 PAGE ERROR,修复它并再次运行。
步骤 9 - 交付
……(内容已截断,但翻译结构已完整展示)