Communitygithub.com

Th3warhawk/cartoon-audio-short

制作竖屏动画卡通短片。提供10个创意,编写脚本,然后将用户的配音转化为带有音乐和音效的完整MP4视频(音效音量为人声的50%)。适用于任何卡通短片或动画故事视频制作需求。

cartoon-audio-short 是什么?

该技能是一款面向AI智能体的专业动画短片制作工具,旨在将用户提供的想法、脚本或配音,通过全自动流水线转化为1080x1920分辨率、30帧/秒的竖屏动画MP4视频。它支持多种平台(如Claude Code、Cursor、Codex),核心流程包括:创意生成(提供10个创意点子)、脚本撰写(按约3.7词/秒的速度编写叙事)、配音录制指导、以及最终的视频渲染与混音。技能内置了完整的代码工具包(kit/),包含Three.js驱动的3D渲染引擎、toon.ts卡通角色库、音频处理脚本(mix.py)以及Playwright浏览器集成,确保在无网络环境下也能本地运行。其独特优势在于高度自动化的音视频同步与混音逻辑:音乐和音效被精确控制在人声音量的50%(−6 dB RMS),同时通过帧精度的时序对齐保证每个视觉反应超前于配音词汇0-3帧,无需手动调整。输出视频会经过响度标准化(约−14 LUFS)和无损编码(H.264 CRF 17),并附带QA检测图,确保专业级质量。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Th3warhawk/Claude3d_Short_Skill/tree/HEAD

在你喜欢的 AI 中提问

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

文档

卡通短片:创意 → 脚本 → 配音 → 成品MP4

视觉风格:采用扁平2D豆形头卡通角色(由勾勒有李子色轮廓的“卡片”画布构成),置于色彩斑斓的3D世界中,搭配黑色墨水轮廓、手绘质感纹理、景深效果及流畅运镜。输出格式为1080x1920,30 fps,时长与配音完全一致。用户原声不变。音乐和音效经过合成处理,音量设定为人声的50%。经《永不离开的士兵》(19.7秒,8个镜头)验证有效。

规则

  • 故事、角色和镜头必须始终原创。不得逐帧复刻其他创作者的视频。应针对相同创意提供自己的原创演绎。
  • 不得使用真实、在世的人物作为角色,也不得使用品牌吉祥物或标识。
  • 除非用户要求,否则不加字幕。剧情内文字(如雕刻信息、标志)是可接受的,且必须正确可读(不得镜像)。
  • 不得编辑或重新调整配音的时长。画面必须与配音同步,每个视觉反应应在其对应词汇出现前0-3帧完成。
  • 音频电平: 音乐背景电平设定为人声电平的50%(−6 dB,门控RMS)。音效电平为50%或略低,峰值经过限制以确保没有爆音超出旁白音量。始终使用mix.py进行混音,不得手动操作。不得使用会改变此比率的闪避或压缩处理;整个混音只允许应用一次线性增益加上一个峰值限制器。
  • 通过任务清单及时告知用户进度。在开始长渲染前,向用户发送静帧联系表。

阶段1:信息录入(始终优先)

如果音频文件已附带,则直接跳至阶段4。如果还提供了脚本,则使用该脚本进行时间对齐。 否则,提出一个AskUserQuestion(如果该工具不可用,则使用纯文本):“您想从哪里开始?”

  • 配音已就绪:要求用户上传配音文件,如果他们有脚本也一并提供(脚本有助于精确计时)。收到后进入阶段4。
  • 已有脚本,需要配音:如必要,按阶段3要求精简脚本,连同录音技巧一起返回给用户,要求上传,然后进入阶段4。
  • 需要视频创意和脚本:进入阶段2。 同时询问目标时长(如果用户未提及)。默认时长为20-30秒;45-60秒也可接受。

阶段2:10个视频创意

一次性提供恰好10个创意,编号列出,并要求用户回复数字(或“更多”)。每个创意应包含:

  • 标题(5-8个词,激发好奇心,例如“永不离开的士兵”)。
  • 钩子句:第一句台词,将悖论作为事实陈述(例如“一个人卖了埃菲尔铁塔。两次。”)。
  • 反转一行描述(视频结尾的讽刺性转折)。
  • 为何适合动画化:2-3个重大视觉时刻(如崩塌、揭露、追逐)。
  • 真实还是传说:明确说明是记录在案的历史、有争议的记载还是民间传说。

什么样的创意对这个格式来说是“完美”的:

  • 一个具有可展示的物理因果关系的惊人故事。
  • 一个鲜明的普通人角色,不断升级的风险,以及最后一句台词揭示的反转。
  • 一个可以通过简单3D形状加卡通卡片构建的场景(城镇、桥梁、船只、城堡、沙漠、实验室、宫殿)。
  • 10个创意应跨越不同时代和主题:古代、中世纪、19世纪、现代、科学、动物、发明、灾难、奇特法律、幸运巧合。
  • 对于任何声称真实的内容,在提供前应通过网页搜索验证关键事实。不得将流传的传说作为事实呈现。如果用户仍然想要,则应表述为“传说称”。
  • 不得以真实在世人物为嘲讽对象,不得涉及色情或政治内容。

阶段3:脚本(用户选择创意后)

仅编写旁白内容(口述文本中不包含舞台指示),语速约为3.7词/秒:20秒 ≈ 75词,30秒 ≈ 110词,60秒 ≈ 220词。结构公式:

  1. 钩子(第一句,无需铺垫):荒谬的事实。
  2. 背景1-2行:时间、地点、人物、一个具体细节。
  3. 升级过程2-4个节拍,每个更重大。其他人表示怀疑或嘲笑。使用一个夸张的笑话。
  4. 谜团或转折:“但当……时”/“你看,”引入真正的机制,通常用一个日常类比。
  5. 反转/收尾:简短、讽刺,并且是视频的最后几个词。 使用平实的英语口语,使用缩写,句子长度在8-15个词左右,数字拼写为单词。切勿描述观众已经看到的内容。

然后回复:

  • 将脚本放在一个可复制的代码块中,附带词数和预计时长。
  • 一段视觉规划(将要动画化的镜头描述)。
  • 录音技巧:一个稳定、温暖的叙述者声音;ElevenLabs效果不错(深沉的叙述者声音,速度约1.05-1.1,稳定性约45-55%)。Mp3或wav格式均可。在句子结尾留有自然的停顿。导出时不含音乐。
  • 要求:“配音准备好后请上传,我将制作完整视频。” 保留最终脚本文本。它将驱动阶段4的时序,因此无需语音识别。如果用户录制了修改版,请索要最终文本。

阶段4:制作视频(配音上传后)

从此刻起不间断地完成所有操作。仅在时序无法确定时提问。

4.0 获取工具包

代码工具包随技能一起存放在kit/文件夹内(包含引擎、工具、工作示例,以及来自github.com/mromidev/claude-animated-shorts的已购买的three.js r160和toon.ts笔库,均为MIT协议)。使用find / -name SKILL.md -path "*cartoon-audio-short*" 2>/dev/null定位文件夹,并将其kit/视为只读。

然后运行bash <skill>/kit/tools/setup.sh ~/shorts/<slug>。它会将引擎和工具复制到项目中,安装已购买的three.js,使用Node 22的module.stripTypeScriptTypes从toon.ts中剥离类型信息,并链接Playwright。无需网络连接。如果购买文件缺失,会回退到npm或git克隆。

  • 要求:Node 22.6+、带有numpy和Pillow的Python 3、ffmpeg,以及带有Chromium的Playwright(如缺失,运行npm i -g playwright && npx playwright install chromium)。
  • 如果包注册表被屏蔽,git over GitHub通常可用。切勿禁用TLS或绕过代理。
  • Chromium:使用预装的Playwright浏览器,参数为--use-angle=swiftshader --enable-unsafe-swiftshader --ignore-gpu-blocklist。这样可使用CPU WebGL,每帧渲染约3-10秒。

4.1 时序对齐

运行python3 timing.py voice.mp3 script.txt --out work。

  • 如果安装了whisper或faster-whisper,则使用单词时间戳。
  • 否则,它将脚本短语(根据标点符号分割)与静音检测到的语音片段对齐,使用动态规划匹配音节与时长,并惩罚片段内的句尾和短语内的长间隔。
  • 如果没有ASR也没有脚本,则索要脚本。Claude无法听到音频。
  • 检查work/phrases.json:停顿应出现在句尾。总帧数 = round(duration × 30)。

4.2 镜头规划(代码前的work/PLAN.md)

为每个镜头创建一行:帧数、台词、场景、光线、镜头运动、角色/姿势/表情、效果和音效提示。

  • 第0帧已经是钩子图像。
  • 通常每个短语一个镜头。将极短的短语合并到下一个镜头中。
  • 逐句形象化地表现每一句台词。道具承载笑话。
  • 变化镜头景别:钩子特写 → 全景揭示 → 双人镜头 → 关键物品插入特写 → 反应特写 → 收尾时的环境移动。
  • 利用光线表现节拍:白天代表正常,金色代表衰落或戏剧性,夜晚蓝色代表解释。时间跳跃使用6帧白色闪烁。
  • 反转台词处使用刺耳音效(音乐停止,低音打击,推进加滚动)。最终镜头的物理效果在最后一个词上落实。

4.3 世界(web/main.js)

保留引擎部分:卡通材质、墨水对比、add/tbox、天空、灯光、卡片、渲染目标/后期效果、applyLight、drawActors、swapForNd、renderFrame。替换// ---------- world ----------和// ---------- cards ----------之间的示例世界,以及worldState()中的故事部分。

  • 使用带有绘制画布纹理(paint.js:木板、横梁、朽木、石头、苔藓/常春藤、草地、泥土、灰泥、屋顶瓦片、大理石、横幅、雕刻文字)的基本几何体构建。以相同的扁平深色接缝风格编写新的绘制器。
  • 使用tbox保持恒定纹理密度、两步卡通渐变和雾效(雾颜色 = 地平线颜色)。
  • 背景:山丘(半埋球体)、山脉(圆锥+雪顶)、柏树/松树、远处房屋、绘制云广告牌。
  • 场景装置(坍塌、坠落、门)是由0..1进度驱动的旋转组(通过worldAt(f)实现),具有缓动和错开的部分。
  • 弯曲剧情内文字使用平面UV。检查是否镜像。

4.4 演员角色(web/roman.js → web/toon.js)

  • romanFront(p, outfitKey, opts)在600x1000的设计画布上绘制,脚底在y=975处。卡片高2.25米,因此1单位 = 0.00225米。
  • 在OUTFITS中添加服装(束腰外衣/披风/盔甲/头盔/发型/帽子/胡须/围裙/连衣裙/托加袍),以及相同风格的新头饰和道具。
  • 手臂姿势:下垂、持矛、指向、举起、挥手、叉腰、抱腹、按太阳穴(+旋转)、举起、伸手(+举起)、托腮、持盾、交叉、拇指。
  • 表情:toon.ts的FACE集加上打鼾、固执、眯眼。扩展FACE以增加更多。
  • 编辑后通过cat web/toonbase.js web/roman.js > web/toon.js重建。在使用新设计前,渲染一张角色测试表。
  • 广告牌仅绕偏航轴旋转,获得接触斑点和alpha测试阴影,且世界通道不对其进行墨线处理。
  • 使用q()舍入值构建卡片键(以便画布仅在可见变化时重绘)。
  • 分离的部件(例如抬起的头盔)是独立的卡片,与headCenter(seed)对齐:y = DECK + (partY − hc) × 0.00225。

4.5 动画:流畅而生动(web/motion.js)

  • 摄像机:camFromKeys(keys, f, {kicks})。使用smootherstep滑动(18-45帧)、easeOut用于揭示和甩镜头,以及path via-points(Catmull-Rom)用于曲线移动。每一个静止镜头都应带有微动,任何镜头保持超过4帧都不应完全静止。在戏剧性场景中使用3-5°的翻转,在撞击中使用7帧的抖动。
  • 连续性:优先使用连续运动(从特写拉出到全景、变焦、起重机穿过甲板、推近到物体)。仅在场景或时间跳跃时使用硬切,并伴随闪烁。
  • 角色从不冻结:对每张卡片应用idle(f, seed),blinkAt控制眨眼,重读单词时头部摆动。
  • 动作:预备动作 → back回弹 → spring稳定。跺脚是2帧下压+灰尘团+踢腿。笑是交替的倾斜+摆动。
  • 次要动态:旗帜布料飘动、树叶/灰尘/水滴/Zzz效果卡片、流水。总有一些东西在动。
  • 行走:walk()给出距离+步幅相位。双脚着地,上下摆动3-7%。
  • 镜头:特写和中景使用景深(弥散圆8-14像素),焦点在眼睛。全景清晰。变焦约需14帧。

4.6 视觉检查(完整渲染前)

在每个镜头的中间位置以及转场和关键动作处渲染静帧:node render.mjs stills/a "5,40,..." 然后 python3 sheet.py stills/a stills/sheet_a.jpg。查看联系表并修复以下陷阱:

  • 狭窄的垂直框架:水平半宽 = d·tan(hfov/2),其中hfov = 2·atan(tan(vfov/2)·0.5625)。在4米距离和40度视场角下,水平范围为±0.8米,因此需要在深度上安排角色。
  • 栏杆或柱子遮挡面部(相机应在栏杆内或大约2.5米高处)。相机路径穿过房屋、屋顶或灌木丛。前景道具距离相机应小于2米。主角被柱子挡住。
  • 镜像的文字。分离部件卡片的偏移方向错误。
  • 挤出材质组:0 = 顶盖,1 = 侧面+顶部。
  • 缺少墨线:调试仅边缘输出的布线。墨线半径在1080p下约为2.5像素。天空被视为远距离深度,而不是卡片。
  • 将联系表连同单行镜头摘要发送给用户,然后开始完整渲染。

4.7 声音(audio.py → 分轨 → mix.py)

根据故事重写提示表;合成器保持不变。audio.py仅写入分轨(music.wav,sfx.wav)。

  • 音乐:一个简短的行进风格循环(底鼓/军鼓、拨弦贝司、铜管垫)。在反转台词处停止,然后持续低音嗡鸣。
  • 音效按事件触发(以帧/30秒计):大动作时使用嗖嗖声,跺脚时用重击声,坍塌时用隆隆声+碎裂声,金属刮擦声,揭示时用叮当声,反转时用刺耳音效,吱吱声,啪嗒声,溅水声,鼾声,树叶声,环境水声。
  • 使用python3 mix.py voice.mp3 music.wav sfx.wav进行混音。它将音乐精确设定为人声门控RMS的50%(−6 dB),音效为50%,峰值限制在人声峰值的0.7倍。它会打印测量的电平:确认音乐显示为相对于人声的−6.0 dB,音效等于或低于该值。
  • 在制作声音之前锁定画面时序。任何时序更改都意味着需要重新运行audio.py和mix.py。

4.8 渲染 + 完成

  • 使用Bash的run_in_background运行node render.mjs frames "0-<N-1>",并通过监控循环报告进度,捕获错误或进程退出。RESUME=1允许在中断后继续。不要在小型机器上同时运行繁重的Python任务。
  • 运行bash finish.sh "Title"。它应用一次线性增益将响度调整至约−14 LUFS,并应用−1 dBFS峰值限制器,编码为H.264 CRF 17 + AAC,进行冻结/黑帧和响度质量检查,并写入out/qa_sheet.jpg。查看检测图。冻结跨度≥0.4秒或出现黑帧需要修复。
  • 通过SendUserFile交付MP4文件,并附上关于每个镜头内容的简要说明。提供字幕、微调或列表中的下一个创意选项。

引擎注意事项(保留在工具包中;如果重建请保留)

  • #include <fog_vertex> / <fog_fragment> 必须单独占一行。
  • 最终通道写入linearToOutputTexel(...)(渲染目标是线性HalfFloat)。
  • 法线+深度通道按网格交换材质:世界 → 法线/深度,卡片 → alpha测试遮罩(rgb为0,a = 深度),斑点/云/天空隐藏,水面 → 平面法线。雾和阴影在此期间关闭。
  • 墨线仅应用于深度跳变的近侧。折痕来自法线点积。跳过相邻卡片。墨线在大约140-520米处淡出。
  • 景深:48个采样点,每个样本进行弥散圆测试(无前景渗出)。
  • 太阳位置根据光照预设的方位角/仰角确定。阴影相机以每个镜头的动作为中心。

架构(用于编辑工具包的参考)

  • web/index.html通过本地HTTP服务器加载main.js(ES模块)。
  • main.js:渲染器、卡通材质、世界、卡片(1200x2000 CanvasTexture平面,原点在脚底),通道处理:颜色(RT采样4次) → 法线/深度 → 墨线+调色(饱和度、增益/提升、

…

[截断以进行翻译]

相关技能