Communitygithub.com

make-2d-video

将旁白(及可选脚本)转化为完整的 MP4 视频,所有画面均由代码绘制(HTML Canvas + Three.js),并通过无头 Chromium 逐帧捕获、ffmpeg 编码。无需图像或视频生成模型,角色一致、文字清晰。

make-2d-video 是什么?

这是一个完整的 2D 动画视频制作 AI 技能,专门用于将旁白(或脚本)自动生成叙事性动画视频。它采用“电影感火柴人”风格(边缘光、氛围感 2.5D 场景、大脸特写、冻结帧、数据叠加、蓝图图样和低多边形 3D 镜头),无需任何图像或视频生成模型,完全通过 HTML Canvas 和 Three.js 代码绘制每一帧。用户只需提供音频(旁白)和可选的脚本文字,系统会自动完成时间戳(Whisper)生成、故事拆解、风格选择(火柴人、3D 卡通或扁平 2D 卡通)、场景构建与渲染、背景音乐与音效添加,最终输出 16:9 或 9:16 的 720p 到 4K 的 MP4 视频。该技能特别适合制作解说视频、科普动画、新闻解释以及“What If”类内容,并且支持多语言(通过 `lang` 参数驱动整个流程,屏幕文字自动本地化)。它遵循严格的黄金规则:旁白内容一字不改、每个镜头忠实呈现说出的内容、设计阶段优先预览(查看 PNG 缩略图),以及三个用户确认点(设置、风格预览样张、最终渲染前预览)。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lynguyen9995/make-2d-video/tree/HEAD

在你喜欢的 AI 中提问

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

文档

make-2d-video studio:完整视频流水线

将旁白(及可选脚本)转化为完整的 MP4 视频,所有画面均由代码绘制(HTML Canvas + Three.js),并通过无头 Chromium 逐帧捕获、ffmpeg 编码。无需图像或视频生成模型,角色一致、文字清晰。为每个脚本全新创作视觉内容;仅风格固定。

此技能基础目录中的捆绑资源:

  • kit/:已测试的工作室(渲染器、引擎、工具、音频,以及 examples/reaction-time 参考项目)。将其安装到工作区中的 make-2d-video-studio/ 下(参见 references/install.md)。
  • references/install.md:安装、依赖表、诊断、自测。
  • references/style-bible.md:外观(角色、布景、灯光、摄像机、剪辑、图形、9:16 规则、禁忌)。在设计任何镜头前请完整阅读。
  • references/style-bible-toon.md:卡通角色 (cast: "toon") 的外观。当角色为 toon 时,请遵循此文档,而非 style-bible.md 中冲突的部分(边缘光、无轮廓线、黑色剪影)。
  • references/story-breakdown.md:编写 story/bible.md 和 story/shots.json,以及节奏规则。
  • references/engine-api.md:场景 API、配置和 shots.json 模式,以及 three-kit 参考。
  • references/sound-design.md:音乐计划、音效库、环境音和电平。
  • references/render-qc.md:预览和最终渲染、速度指南、QC 检查清单、故障排除。

此插件的阶段命令可重新运行某个阶段:/new-video(阶段 1–4),/video-styles(5),/render-video(6 和 8),/video-sound(7)。要端到端运行,请遵循本文档,并在每个阶段需要时加载参考文档。

黄金规则

  1. 先询问视频语言。 在提出任何其他问题、安装、文件或编辑之前,先询问用户视频使用哪种语言(阶段 0)。后续每一步都使用该语言。用用户书写的语言与用户交谈。
  2. 保持旁白完整。 切勿重写、添加、删除或重新排列口述单词。每个镜头都应描绘画面显示时所说的词汇。
  3. 相同风格,全新画面。 为此脚本创作布景、道具、角色和动作。仅使用 examples/reaction-time 来学习 API。
  4. 具体而精确地展示所说的内容。 抽象台词变成视觉隐喻、图表或特写反应。
  5. 草稿、查看、修复,然后渲染。 在任何完整渲染之前,自行打开联系表和静帧(阅读 PNG 文件)。渲染很慢;查看很快。
  6. 三个用户检查点: 设置选择、基于渲染样张的风格选择、最终渲染前的预览。如果用户不在,则使用默认值,说明假定项,然后继续。
  7. 文件即真理。 每个视频都存在于 make-2d-video-studio/projects/<slug>/ 下,而 story/shots.json 拥有所有时间控制权。 一个视频 = 一个独立的文件夹:config.json、input/、assets/(+ assets/_raw/ 用于未选中的 AI 图像)、scenes/、story/ (包括 plan.md 交接备注)、timeline/、jobs/(+ jobs/logs/)、build/(临时,可安全删除)、out/(仅交付物)。 切勿将每个视频的文件放置在工作区根目录或单独的 _jobs/ 文件夹中。
  8. 只有故事中出现的人物才出现在屏幕上(新闻/解说视频)。 除非用户要求,否则不出现频道吉祥物或解说员/主持人角色 (例如 nhoc、ongdo)。新闻中的每个具名人物都应拥有自己的卡通形象(标志性发型、眼镜、 服装,依据 style-bible-toon.md 中的漫画规则)以及姓名标签,而非通用形象或剪影。私人或 未具名人物(未确认的嫌疑人、家庭成员)保持匿名:使用通用的无名卡通形象或带有角色标签的剪影。

频道默认值 (channel.json)

在阶段 0 之前,查找 channel.json 的位置顺序:make-2d-video-studio/ 旁边(包含工作室的工作区文件夹),然后是 当前文件夹,然后是此技能的基础目录(随技能一起复制的副本;在新机器上,安装后将其复制到 工作室旁边)。它可以包含 name、lang、aspect、resolution、fps、style、cast(stick | 3d | toon)、captions、shotsPerMin 和 music。 每个存在的键都是此视频的默认值:跳过它所回答的问题(语言、宽高比、分辨率、fps、字幕、 阶段 5 的风格选择),而是用一行确认,例如 "Kênh Tí Tò Mò:tiếng Việt,9:16,1080p,30 fps,dusk,có phụ đề。" 仅询问仍然未知的信息(旁白、脚本、标题)。name 是用于片尾卡的频道名称。

三种绘制风格(每个视频选择一种角色)

cast外观引擎风格圣经
stick(默认)黑色火柴人,带边缘光,氛围感电影级 2.5D 布景rig2d.js(+ three-kit.js 用于 3D 定场镜头)style-bible.md
3d3D 卡通角色:白色扁平头部、梨形身体、面条肢体rig3d.js、rig3d-cast.js(kind: '3d',rig3d: true)style-bible.md → "2D cast or 3D cast"
toon带轮廓线的扁平 2D 卡通:肤色圆形头部、豆状身体、棍状四肢、粗轮廓线、线条抖动、漫画文字、视觉笑料、公众人物漫画;可选带辉光的 toon-shaded 3D 英雄道具toon.js、toon3d.jsstyle-bible-toon.md

channel.json → cast 决定;否则在阶段 1 询问一次(每种风格一行)。对于 toon,默认颜色风格为 paper (电影级色域也可用,但会压暗扁平颜色)。在编写 toon 镜头前,先学习 examples/toon-demo/。

新闻解说模式(toon cast,频道的首选格式)

当用户要求制作新闻/金融/科技/亿万富翁/投资资产解说视频时,请遵循 kit/CLAUDE.md (安装为 make-2d-video-studio/CLAUDE.md)。它将用以下带关卡的工作流替换下面的阶段 1–8: 0 选题(3–5 个候选,含来源强度、风险和保质期)✋ → 1 有来源的脚本 + 3 个标题 + 缩略图概念 ✋ → 2a 语音和 2b 资产清单(story/assets.md:要绘制的内容、数量、使用 Flow / 用户的图像 AI / 代码 toon / three.js + bloom 制作)✋ → 3 图像 + 角色表 ✋ → 4 时间线 + 场景 → 5 所有镜头的联系表 + 30 秒演示 ✋ → 6 完整渲染 → 7 打包(缩略图、带来源的描述、章节、过时列表)✋ → 8 上传 ✋ → 9 查看统计数据。 场景图像:无人物、无文字、无标志。缩略图:可包含人物(风格化,绝不可使用真实人物的逼真伪造品) 以及 ≤ 4 个文字。切勿从未经审计的项目通过 YouTube Data API 上传(上传会被锁定为私有); 通过 YouTube Studio 网站上传,保存为私密/定时发布,并且仅在用户明确同意后发布。 在本地 Claude Code 会话中,自行运行每个命令;仅当没有 Windows shell 时才编写 .bat 作业。

阶段 0:视频语言(始终第一)

如果 channel.json 提供了 lang,则在上方的一行摘要中确认,而不是询问。否则,在询问任何其他问题、创建文件、安装或编辑之前,用用户的语言准确提出一个问题,例如:"Video này dùng ngôn ngữ nào?(ví dụ:Tiếng Việt,English,日本語…)"。在可用时使用 AskUserQuestion。等待回答,然后将其映射为 ISO 639-1 代码(vi、en、ja、ko、es、pt、de、fr、hi……)。如果用户在此之前已经在对话中指定了视频语言,则用一行确认,不再询问。

语言代码驱动整个流水线:

  • tools/new_project.py 的 --lang <code>(存储在 config.json → lang 中)。tools/transcribe.py 从配置中读取该代码。
  • 所有屏幕文字(标题卡、标签、单位、标志、图表说明、烧录字幕)均使用此语言书写,简短且拼写正确,包含完整变音符号。切勿翻译或更改口述旁白。
  • 字体:渲染器加载拉丁、拉丁扩展和越南语字形;对于 vi,标题字体自动切换为 Nunito,以便重音符号在统一字体中渲染。对于捆绑字体未覆盖的脚本(日语、韩语、中文、阿拉伯语、印地语、泰语……),请告知用户并在 QC 期间仔细检查文字静帧。

阶段 1:输入

在语言已知后,询问一次(在可用时使用 AskUserQuestion):

  • 旁白文件(必需)。还没有录音?使用 VieNeu(如果其 MCP 工具已连接)制作一个:按句子合成一个片段 (01.wav、02.wav……放在一个文件夹中),将句子逐行写入 sentences.txt(可选 |0.8 停顿或 |cham 减慢标记,情感标签如 [cười] 保留在行内),然后 python -I tools/join_segments.py <clip_dir> sentences.txt voiceover.wav。它会使用固定停顿连接片段(当给出整个脚本时,VieNeu 会合并短句并删除停顿)并写入 voiceover.wav.script.txt,这是要作为 --script 传递的纯净文本。

  • 脚本: 带时间戳的(SRT/VTT/JSON/TXT 格式,使用 [mm:ss])、纯文本(最佳:与音频对齐,保持确切措辞),或无(转录)。

  • 宽高比: 16:9 或 9:16。

  • 分辨率: 720p / 1080p(推荐)/ 1440p / 2160p(4K)。提及更高分辨率渲染时间更长。

  • 字幕: 9:16 默认开启,16:9 默认关闭。

  • 音乐: 生成、用户自有文件或无。音效: 开或关。

  • 标题。

  • 角色(绘制风格):stick / 3d / toon,除非 channel.json 给出了 cast。

暂时不要询问颜色风格。默认值(当 channel.json 未指定时):16:9、1080p、24 fps、生成音乐 + 音效、角色 stick、风格 dusk(toon 时为 paper)。

阶段 2:安装或检查工作室

遵循 references/install.md:将 kit/ 复制到工作区中的 make-2d-video-studio/(如果已存在则跳过),安装依赖项,运行 python tools/verify_kit.py 和 python tools/doctor.py,然后运行示例自测。用一个简短列表报告已安装的内容。在 Windows 上,如果 doctor 仅在 winget 文件夹中找到 ffmpeg,它会写入 make-2d-video-studio/env.sh 和 env.ps1;在渲染和混音命令前加上 source env.sh &&(在安装前启动的 shell 看不到新的 PATH)。

阶段 3:项目 + 时间线

在 make-2d-video-studio/ 内运行。当 python 不是 Python 3 时使用 python3。

没有可用终端的 Windows(计算机使用只能点击文件资源管理器): 将每个长步骤放入用户双击的作业中。将 tools/jobs/templates/full.ps1 + 2-full.bat 复制到 projects/<slug>/jobs/;每个作业 .ps1 以 $JobDir = $PSScriptRoot 开头,并点引用 ..\..\..\tools\jobs\common.ps1(提供 $P、Run、Py、Say、Fail、Done,并写入 jobs/logs/<name>.log + <name>.status = RUNNING / OK / FAILED,供 Claude 读取)。共享助手:tools/jobs/set_duration.py(从旁白设置 config.json 的 duration)、tools/jobs/make_srt.py(从 timeline/sentences.json 生成 out/<title>.en.srt)。 Windows 上的工作室安装/修复:tools/jobs/setup-studio.bat。

python tools/new_project.py --name <slug> --voice "<voiceover path>" [--script "<script path>"] --aspect 16:9 --resolution 1080p --fps 24 --style dusk --title "<title>" --lang <code> [--captions]
  • 带时间戳的脚本:python tools/parse_script.py --project projects/<slug> --script projects/<slug>/input/script.<ext>
  • 纯文本脚本:python tools/transcribe.py --project projects/<slug> --script projects/<slug>/input/script.txt --lang <code> --model small。匹配度必须 ≥ 90%;如果低于该值,告知用户脚本和音频不同。
  • 无脚本:python tools/transcribe.py --project projects/<slug> --lang <code> --model small(慢速机器上用 base,困难音频用 large-v3)。

检查 timeline/transcript.txt(其结尾应接近旁白长度),然后运行 python tools/beats.py --project projects/<slug> 以获取节拍表和草稿 story/shots.json。

阶段 4:故事拆解

阅读 references/style-bible.md(或 references/style-bible-toon.md,针对 toon cast)和 references/story-breakdown.md。编写 story/bible.md(日志行、每个角色带一种标志性颜色、带情绪和关键光的场景、动机、音乐计划,以及 cast 是 2D 火柴人还是 3D 角色)。编写 scenes/cast.js。重写 story/shots.json:连续的镜头、在短语边界提前 0.1–0.2 秒切换、每个新地点一个定场镜头、每个镜头一个具体的 scene 描述。节奏:9:16 短视频每分钟 30–40 个镜头(中位数 1.5–2 秒);长 16:9 解说视频每分钟 15–25 个镜头(中位数 2–3.5 秒)。channel.json → shotsPerMin 会覆盖两者。向用户发送一个 5–10 行的计划摘要,除非他们反对,否则继续。

阶段 5:风格选择

如果 channel.json 固定了 style,则直接使用它,除非用户要求,否则跳过比较网格。 构建 1–2 个最常用的布景加 3 个代表性镜头(一个宽镜头含 ≥ 2 个角色、一个 bigFace 特写、一个数据/蓝图或 3D 镜头)。然后渲染:

node render.mjs --project projects/<slug> --styles dusk,midnight,golden,neon,storybook --at <t1>,<t2>,<t3> --scale 0.5

打开 build/styles/style_grid.png,然后用每种风格一行向用户展示:dusk(淡紫色阴影、琥珀色主光、奶油色边缘光)、midnight(冷海军蓝、蓝白边缘光、钠灯效果)、golden(暖橙色和青绿色)、neon(深黑、品红和青绿)、storybook(柔和粉彩、低对比度)。将选择保存到 config.json → style。如需调整,向 engine/styles.js 中的 STYLES 添加自定义条目(moods 覆盖以及 grade 提亮/伽马/增益、饱和度、对比度、暗角、颗粒、辉光)并重新渲染该行。

相关技能