Communitygithub.com

动画短片技能

将一个故事、创意或配音脚本转化为一部完整的手绘风格2D卡通短片(竖屏1080x1920 mp4,时长约35-45秒),包含角色动画、VoiceStudio配音、内嵌字幕、音效和音乐,以及一条Instagram帖子文案。

动画短片技能 是什么?

这是一个面向AI Agent(如Claude Code)的强大技能,用于全自动生成手绘风格的2D动画短片。它通过一个JavaScript文件描述画面随时间变化,利用无头Chrome逐帧渲染,再通过ffmpeg合成mp4,整个过程无需剪辑软件或AI图像生成。技能支持两种艺术风格(墨水和纸艺),并内置了角色、道具、动画配方库以及完整的配音流程。用户只需提供一个故事、创意或脚本,该技能就会自动完成后面的所有步骤:编写脚本、生成配音、构建时间线、逐场景编写动画、检查并导出成品。它严格遵循“配音先行”原则,确保画面与声音精准同步。使用时,用户只需输入灵感,技能会直接交付mp4文件和社交媒体帖子文案,非常适合快速制作具有高动态和表现力的短篇卡通宣传片或故事。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/munna-68/animation-video-skill/tree/HEAD

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

动画短片

你正根据一个故事制作一部卡通短片电影。用户提供一个故事、一句剧情梗概、场景列表或一个脚本。你将交付一个完成的 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 - 阅读故事并选择风格

除非根本没有故事,否则不要向用户提问。自行做出以下决定:

  1. 风格。 有两种风格。查看 SK/references/characters-ink.jpg 和 characters-paper.jpg(使用读取工具查看图片)以了解它们。
    • ink:粗而摇摆的墨水线条,粗体衬线标牌,温暖的复古卡通风格。最适合有反派、闹剧、店铺、街道、肢体笑话的故事。
    • paper:剪纸拼贴风格,无轮廓,柔和阴影,优雅的衬线字体。最适合关于手机、应用、链接、自然,或更柔和、更现代氛围的故事。
    • 如果用户指定了风格,就使用它。否则,如果工作文件夹中已有早期的剧集,则使用另一种风格(运行 head -3 */style.js 2>/dev/null 查看之前使用了哪种)。否则,根据故事选择。
  2. 演员表。 谁是英雄(小企业主或主角)?谁或什么是障碍(反派、困惑的顾客、迷宫)?两个主要角色就足够了。
  3. 项目文件夹。 从故事中取一个简短的名字,放在用户的工作文件夹中。
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 - 编写电影

在开始编写之前,请阅读以下内容(它们很短,但却是制作一部好电影与一部失败电影的区别所在):

  1. SK/references/engine.md - 你可以调用的所有函数。
  2. SK/references/kit-ink.md 或 kit-paper.md - 你选择的风格的角色、姿态、道具。
  3. SK/references/recipes.js - 25 个经过测试的动作,可以复制。也请查看 recipes-<style>.jpg。
  4. 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 的十条规则(每一条都防止了实际发生过的失败):

  1. 只编辑 film.js(如需可编辑 style.js 中的颜色)。切勿编辑 engine.js 或 index.html。
  2. 切勿直接写入原始时间。每个提示都基于配音构建:L('l04')(行开始)、E('l04')(行结束)、wt('l04', 'three rival')(口语短语的开始时间),加上或减去一个小偏移量。给每个提示起个名字:const tSlam = L('l04') + 0.25;。
  3. 在词语说出前 0.1-0.3 秒 开始一个动作,使其正好落在词语上。
  4. 姿态和对象使用 q(时间步进为每秒 12 次:产生手绘动画的感觉)。镜头、震动和擦除使用 t(平滑)。
  5. 在提示触发之前,任何东西都不可见。使用 pop(...) 或 if (q < tCue) ... 使对象在配音提到它们时才出现,而不是之前。
  6. 没有 Math.random(),没有 Date,没有 CSS 动画,没有 setTimeout。使用 h(n) 获取随机性。对于相同的 t,电影必须每次都给出相同的画面。
  7. 背景的绘制要比屏幕大得多(例如 x 从 -1000 到 2080),这样镜头的移动和震动永远不会显示空的边缘。
  8. 绘制顺序由深度决定:后绘制的东西在更前面。先背景,然后是远处对象、角色、近处对象,最后是效果。
  9. 将重要内容保持在 x 70-1010 和 y 180-1400 范围内。字幕位于 y 1420-1560,Instagram 自己的按钮覆盖了 y 1600 以下和右侧边缘的所有内容。
  10. 每个声音都属于一个可见事件,并使用 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 - 交付

……(内容已截断,但翻译结构已完整展示)

相关技能