Communitygithub.com

jjietay/clayducation

制作一个带有旁白解说的教学视频(MP4 格式),采用统一的软质 3D 黏土风格,并包含一个无声吉祥物。脚本在语音生成前会由智能体进行检查。适用于用户需要视频、讲解、动画或概念视觉演示的场景。

clayducation 是什么?

该技能基于当前对话和项目上下文,自动生成一个带有旁白解说的教学视频(MP4),采用统一的软质 3D 黏土美学风格,其中包含一个默默演示操作过程的吉祥物。它首先通过提问选项来确认视频风格、受众、检查点以及背景音乐,从而获得用户偏好,然后将这些设置保存为视频配置,以供后续步骤使用。核心流程包括:编写脚本,并借助专门的脚本智能体检查事实准确性和节奏;基于故事板定义 3D 场景;生成语音、字幕和背景音乐;渲染 3D 视频帧;最后将所有元素合成最终的 MP4 文件。该技能强调代码质量,设有严格的自动化检查点以保证视觉清晰度(避免重叠)、碰撞检测、配音节奏和字幕规范。它支持并行渲染以提升效率,并记录故障案例以防止重复错误。该技能是为与项目相关的教学概念量身定制的,重点在于将分步操作与视觉演示无缝结合。

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

在你喜欢的 AI 中提问

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

文档

讲解视频

你制作一个帮助用户学习某个概念的视频。你有一个新工具无法比拟的巨大优势:你了解当前的对话和项目背景。善用这一点。

视频引擎位于 ~/.claude/skills/clayducation/engine/。在此文件中,“make” 意味着:

node ~/.claude/skills/clayducation/engine/make.mjs <command> <project-dir>

第 0 步:先询问(每次技能启动时)

无论用户是输入了 /clayducation 还是用文字请求了视频,你首先要做的事情是:使用 AskUserQuestion 工具提出下方的问题,并附带可点击的选项。如果用户的输入或本次对话已经回答了某个问题,则跳过它(例如,“像新闻短片”回答了“风格”问题;“搭配 lo-fi 音乐”回答了“音乐”问题)。将推荐选项放在第一位,并标记为“(推荐)”。在一个调用中询问所有四个问题(该工具最多接受 4 个参数)。如果主题本身不明确,并且没有跳过任何问题,则先通过单独的调用询问主题。

问题标题选项(第一个为默认)
视频应该采用哪种风格?风格黏土 3D:统一的软质黏土风格,由无声吉祥物完成所有操作 · 经典 2D,混合风格:每个部分使用不同的 2D 风格 · 经典 2D,统一风格:由用户指定风格(新闻短片,白板,……)
视频的目标观众和时长?观众考试复习,标准:使用讲座中的符号、计算例题、考试陷阱,时长 5 到 6 分钟 · 考试复习,深入:同上,时长 8 到 9 分钟,覆盖推导的每一步 · 初学者,简短:以直觉为主,减少符号,时长 2 到 4 分钟 · (其他:用户指定观众群体和时长,例如“专家快速回顾,简短”)
何时需要与你确认?检查点一次性完成:直接返回完成的视频 · 故事板之后:展示计划并等待批准 · 初稿效果之后:展示前几帧并等待
使用哪种背景音乐?音乐宁静(current):柔和的铺垫音色,无节拍 · Lo-fi(lofi):轻柔的节拍,更有活力 · 无

当对话内容暗示某个选项时,将其作为推荐选项放在第一位(例如下周有考试则推荐“考试复习,深入”)。如果用户信息只回答了“观众”问题的一半(例如“为了我的考试”),则保留该问题,但只提供与该回答一致的选项。观众群体包括:考试复习、初学者和专家快速回顾(快速且密集);时长包括:简短(2 到 4 分钟)、标准(5 到 6 分钟)、深入(8 到 9 分钟)。将答案写入第 4 步的 video.json 文件中:"_look"(clay 或 classic)、"_brief": { "viewer": ..., "length": ..., "checkpoint": ..., "style": ... } 和 "_render": { "music": "current" | "lofi" | false }。后续的每一步以及重新构建都会从该文件中读取这些设置,而不会再次提问。如果用户忽略了问题,则使用每个选项的第一个值。

一次性完成,除非用户选择了检查点

在第 0 步之后,不间断地执行以下所有步骤,并只返回最终完成并经过检查的视频。不要询问“我是否可以继续?”,不要展示草稿,不要在步骤之间等待。下面的每一项检查都由你来执行并据此采取行动。唯一的暂停点是用户选择的检查点:“故事板之后” 会在第 7 步后暂停(展示故事板和脚本智能体的判定结果,然后等待);“初稿效果之后” 会在第 9 步的第一次 make look 后暂停(展示其图片,然后等待)。

用户想要的风格(在第 6 步之前阅读)

黏土风格用于动作表现,Manim 用于绘制图表,吉祥物出现在每一个视频中。 阅读 styles/clay.md。用户选择黏土风格而非旧有的混合风格,以保持视频风格的一致性。2D 风格是可选的经典风格,请参见下文。

  • 不要强制将图表放入黏土场景中(用户的要求)。 当一张 2D Manim 图片比黏土场景更能帮助观众理解(例如曲线、分布、等高线、投影或平面上的其他几何形状)时,将该部分做成 Manim 部分,并使用 Manim 的深色背景(styles/math-manim.md)。永远不要构建一个复制数学曲线的黏土模型:用户已经要求移除这些模型。执行动作的物体和吉祥物的物理操作应保留在黏土场景中。视频可以在黏土部分和 Manim 部分之间切换,相同的事物使用相同的颜色。

  • 同一风格,多个部分。 视频被划分为时长大约为 15 到 40 秒的多个部分(引言、每个概念、你的案例、结尾)。每个部分都有自己的纯色背景、摄像机和场景设置。相邻的两个部分永远不会共享背景。

  • 吉祥物负责执行操作。 他是沉默的,没有口型同步,旁白是配音。他用自己的手行走、拉、推、搬运和关闭物体,因此脚本中的“力”应该表现为观众看到他执行的动作。用户在某次视频中吉祥物只是站着观看后提出了此项要求。他默认保持面无表情,make check 会在吉祥物一直站在原地时发出 WARN。变换操作:在每个部分使用不同的动作辅助函数(carry,knock,press,grip,pointAt,pushOn;参见 styles/clay.md 中的“使用不同的动作”)。用户曾发现在每个部分中吉祥物都在推东西。

  • 事物必须相连。 弹簧必须连接到墙壁,大头针必须接触地图,手必须接触它握着的东西。用户发现经过所有检查后,某个弹簧仍然没碰到墙壁。make bake 会测量 models.js(JOINS)中的每一个连接点,因此请在那里添加新的连接点,并在静帧中检查接触情况。

  • 仅使用我们自己的模型。 使用 styles/library/clay 中的工具包。永远不要下载模型。如果视频需要新的物体,请以相同的风格将其添加到工具包中。

  • 每个部分是一个连续的镜头。 在部分内部没有剪辑或新的幻灯片:物体在配音说话时到达、移动和组合,摄像机缓慢移动。一个部分的结束状态是下一个部分的起始状态,或者在下一个部分的背景中淡出。

  • 画面用于解释;文字仅用于命名。 文字保持平面和清晰,以 HTML 形式叠加在 3D 场景之上。每帧包含:一个题头(小型大写字母,部分编号和来源)、一个最多 8 个单词的标题、几个含细指引线的 1 到 4 个单词的标签,以及底部最多一行字幕。从不出现句子列表、项目符号或颜色图例。 屏幕上最多显示大约 15 个单词。

  • 公式要配合配音动态呈现(用户的要求)。 一个静止的公式比阅读笔记好不了多少。使用 eqn() 构建每个公式:术语在提到时出现,在配音移动它们时移动,在配音说“消去”时撞击并爆炸,在配音提到重要内容时才弹跳。make look 会对静止的公式和画面上没有“消去”动作的“消去”语句报错。参见 styles/clay.md。

  • 物理运动。 物体像真实物体一样运动:手臂伸出,球落下并弹起,方块掉落并静止,脉冲传播。没有静态盒子的堆积效果。

  • 相同物体在每个视频中保持相同的颜色(机器人永远是橙色,地图永远是黄色)。

如果故事板违反了以上任何规则,请在编写代码之前修改故事板。

严格规则

  • 默认并行执行(用户要求,2026-11-09)。 任何可以同时运行的任务都应该并行执行:一个 13 分钟的视频,当每帧都在一个 Chrome 页面(一个核心忙碌,GPU 使用率 10%)上测量时需要 3 小时。引擎现在可以在多个页面中同时测量 look、collide、review 和 stable(渲染的 workers:核心数的一半,最多 8 个,且不超过可用内存允许的数量;),并且 build 同时运行 sheet、stable 和 review。当你添加一个需要遍历所有帧的步骤时,也要将其分散到多个页面中(make.mjs 中的 measureParallel、traceParallel、idParallel)。在你自己的工作中:同时启动独立的任务(比如 look 和 selftest,Manim 渲染和检查),绝不要在一个任务可能运行时而等待另一个任务。

  • 在这里(主对话中)进行思考。 你自己编写脚本、故事板和场景,因为上下文在此处。绝对不要将这些步骤交给子智能体:子智能体启动时没有上下文。第 7 步中的脚本智能体是唯一的例外,并且它是有意冷启动的。

  • 不要仓促地讲解核心概念。 用户通过观看这些视频来学习。遵循 reference/script.md 中的节奏规则,修复每一个节奏方面的 WARN。

  • 永远不要编造事实。 每个数字、公式和主张都必须来自你已验证的来源:用户的代码、数据手册、规格书、论文、文档。将它们列在 storyboard.md 中。报告任何你无法验证的内容。

  • “你的案例”是可选的。 仅当本次对话或项目确实包含匹配的示例时才添加它(例如用户遇到的 bug、一个修复、一个测量数值)。永远不要虚构一个。

  • 无重叠。 没有任何视觉元素可以覆盖另一个:文本覆盖文本、文本覆盖图形、或图形隐藏另一个图形。每个标签、公式、箭头和物体都应拥有自己的空间。check 会对重叠的文本发出 WARN,并且 review 会将每个测量到的重叠写入 overlaps.md。拥挤与否是用户的判断,因此请在全尺寸的帧中检查。ID 检查有助于此:make look 会添加一张显示最小间隙的图片,并对距离其他物体小于 12 像素的文本、图形上的文本、低对比度的文本以及被其他模型遮挡的模型发出 WARN。在 make final 之前修复所有重叠问题。

  • 字幕使用单行。 每个字幕提示最多 42 个字符,且不会有任何两条提示同时显示,因此播放器永远不会显示两行字幕。引擎自动执行此规则;verify 会报告违反规则的提示。不要通过修改 make.mjs 中的 SUB_MAX 来让提示符合要求。

  • 闭环(用户的要求,引擎强制执行)。 每次编辑后:执行 make look,读取它列出的每一张图片,修复你看到的问题,然后再次查看。只有这样,才能进行构建。绝不要盲目编辑和构建,因为构建耗时很长,而查看只需几秒钟。每张图片的右上角都有一个 CHECK 数字,只有当所有图片的数字按照指定顺序通过验证时,大门才会打开:

    1. 编辑。如果你更改了 script.md,则运行 make voice。如果视频包含 Manim 部分并且你更改了 manim_scenes.py 或者配音,则运行 make manim:make look 会绘制 Manim 的帧,但并不生成它们。
    2. make look <dir>:它会在每一帧上测量每个更改过的场景,并绘制其邻近帧和运动部件。阅读所有这些信息。然后运行 make look <dir> --ok <digits>。不执行此操作,make build 将停止。如果一张图片的帧和标签与你之前已阅读并确认的完全相同,则会显示 READ BEFORE 字样,并且无需提供数字(当所有图片都是之前已读过的时,使用 --ok -)。阅读每一张新图片;对于 strips 也是如此。
    3. make build <dir>。它将在任何碰撞时停止。
    4. 阅读 build/review/moving.md 中的每一条 strip。然后运行 make look <dir> --moving-ok <digits>。
    5. make final <dir>。如果源代码在 look 或 build 之后发生了更改,或者仍有未解决的碰撞或重叠问题,它将停止。 以单个命令的形式运行每一步,并在第一次失败时停止,并确认编辑已生效。
  • 每个阅读者都检查邻近帧和运动部件。 任何评判视频的智能体或会话,都应阅读每个已编辑部分的邻近帧,以及每个运动物体(吉祥物和物体)在其整个运动过程中的所有帧。仅对视频进行采样是不行的:用户曾遇到过在采样帧之间,一只手穿过了桌子的情况。

  • 新错误要添加护栏。 当用户发现一个错误时,首先将其添加到 reference/faults.md 和 engine/test/selftest.mjs 中,并确认测试在此错误上失败。然后修复视频。不要只修复视频。在对检查进行任何更改后运行 make selftest。

用户的要求(请保留)

以下内容均是根据听觉体验提出或选择的。引擎大部分会自动处理。

主题内容自动处理?
配音使用 Chatterbox 内置的配音,通过 engine/tts/slow-reference.wav 减慢到大约每分钟 160 个单词;每个段落一气呵成,以保持语气连贯是
停顿每个句号恰好 0.6 秒,每个逗号最多 0.3 秒,根据脚本中的标点符号设置是;如果无法放置停顿,voice 会发出 WARN
错误取用如果某个部分的台词与脚本不同(通过 Whisper 检查),则使用新的种子重取,最多重试 3 次;保留最佳取用结果是;如果仍然错误则发出 WARN
语速过快如果某个从句的速度超过视频正常速度的 1.3 倍(符号单词计为两个单词),则重新录制;用户曾认为“lambda v is v, scaled by lambda”速度过快是;发出 WARN 并标记为“fast”:为其分配一个简短的独立句子并添加 [pause]
负数读作“negative”,从不读作“minus”voice 会以 ERROR 停止
重复单词“one one” 需要加逗号(变成 “one, one”),否则配音会出错是
书写连贯的段落;仅在某个概念结束或播放动画时使用 [pause]。拒绝的内容:每个句子后停顿、断断续续的句子、语速过快、拉长(含糊不清)的配音、Kokoro由你决定,参见 reference/script.md
音乐可听见、平稳、大约低于配音 13 dB(musicVolume 0.37;用户从 0.26 提高了 3 dB)、轻柔的闪避;两首获准的曲目,current(默认)和 lofi。拒绝:忽大忽小的抽吸感、音乐太轻听不到、其他 4 首曲目是;你选择曲目,参见 SOUND.md
音效engine/sfx.mjs 工具包中的音效,经过听觉验收;飞入时的 whoosh 声低于其他重音 4 dB(用户觉得稍响)。新视频默认开启(_render.sfx: true),旧视频默认关闭你在提示点添加 s.sfx;引擎负责混合
音频48 kHz 立体声是;verify 会检查
字幕软字幕,从不硬烧录;用户的 mpv 以小字体显示字幕(sub-scale=0.7)是
单行字幕每条提示一行,最多 42 个字符,没有两条提示同时出现。用户在 ROS 2 系列的第一个视频中看到了两行字幕是;verify 报告违反规则的字幕提示
无重叠没有文本或图形覆盖另一个元素check 对文本发出 WARN,其余问题依赖 overlaps.md 和你的帧检查清单
风格统一的 3D 黏土风格,包含无声吉祥物和我们自己的模型;曲线和图表使用深色背景的 Manim 部分(用户要求:不要强制绘制图表……

……[详细内容已截断,等待翻译]

相关技能