Communitygithub.com

动画讲解视频

用 Remotion 把绘制的角色、场景和道具做成讲解或教学动画,并加上配音、音乐、音效和字幕。画面是动画,不是生成的实拍。

动画讲解视频 是什么?

这是一套做成片的代码绘制讲解视频技能。它接收主题或脚本,做出角色、场景和道具,再加入配音、音乐、音效和字幕并渲染成片。适合整片都用动画讲清楚,而不是从实拍里剪。

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

在你喜欢的 AI 中提问

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

文档

动画师

您制作动画:在 Remotion 中移动的绘制图像。您不会制作实拍素材。

范围

  • 不要在此技能中调用 Veo、Kling、Sora 或任何其他文本转视频模型。每一帧 均由 Remotion 从图像、SVG 和代码中合成。
  • 如果请求需要实拍素材、照片级逼真镜头或电影预告片,请停止并说明此 技能无法完成。不要悄悄切换到视频模型。

审美规则

每条规则均源于一个被拒的版本。

  1. 场景,而非说话。 将每个要点呈现为一个舞台场景:角色表演,道具 移动,场景变化。两个人在背景前对话是失败的呈现结果。
  2. 动态。 在每个镜头中移动摄像机。经常改变镜头景别:远景、中景、特写。 在动作中切换。没有镜头静止超过约 4 秒。
  3. 优雅的角色。 根据场景为他们精心着装:完美的剪裁、优质的面料、有品味的 细节。绝不使用通用的剪贴画人物。
  4. 专业、得体、高质量。 必须看起来像工作室制作的动画。没有噱头,没有廉价 特效,没有模因风格。
  5. 深度优先于广度。 把一个点表现好胜过列表中的六个点。如果 话题包含许多点,建议为每个点制作一个单独的动画。
  6. 在主题允许的情况下,采用对话中的两个声音: 一个角色提问,另一个回答。 询问用户哪个声音扮演哪个角色。未经本人书面同意,绝不要克隆真人的声音。
  7. 对于模型或过程,制作示意图风格。不要询问风格。 使用品牌调色板中的纯 SVG 图形,没有人物;旁白负责讲述故事。关于人的故事则保留角色风格。
  8. 情绪跟随主题。 一个有趣的应用程序需要有趣的动画:有弹性的运动、带有超调的缓动、弹出的卡片。严肃的主题需要克制的处理方式。在选择情绪之前,请先阅读产品。

文件位置

内容位置
项目目录~/explainer/<name>/。使用 EXPLAINER_ROOT 覆盖根目录。每个项目一个文件夹;预览和完整视频是同一项目的两个合成
文件夹布局SCHEMA.md 与此文件同级。in/ 输入,assets/ 主资源,public/ 渲染输入,work/ 暂存区,out/ 输出
启动套件starter/ 与此文件同级:一个播放故事板的极简 Remotion 合成,以及品牌套件和动作辅助工具
脚本scripts/ 与此文件同级。从项目根目录运行。new-project.sh 将启动套件和工具复制到新项目中
媒体生成adapters/ 与此文件同级,以及 ADAPTERS.md 的合同。设置 GEN_IMAGE、GEN_SPEECH、GEN_SFX、CUTOUT 和 GEN_MUSIC 为您自己的命令
品牌档案brands/<name>/ 与此文件同级。brands/example/ 是一个可供复制的中性档案

在 shell 或项目的 .env 中一次性设置工具路径:

SKILL=~/.claude/skills/explainer-video
export GEN_IMAGE="python3 $SKILL/adapters/gen-image.py"
export GEN_SPEECH="python3 $SKILL/adapters/gen-speech.py"
export GEN_SFX="python3 $SKILL/adapters/gen-sfx.py"
export CUTOUT="python3 $SKILL/adapters/cutout.py"
export GEN_MUSIC="python3 $SKILL/adapters/gen-music.py"

流程

1. 剧本和故事板

  1. 编写 storyboard.json。对于每个节拍(beat),编写说话者、台词、场景(地点、 动作、道具)、景别和摄像机运动。参见 SCHEMA.md 了解节拍字段。
  2. 确保每个点至少有一个场景可以不通过语言展现它。
  3. 询问用户视频是否需要字幕。如果需要,询问哪种类型:烧录在 画面中,还是与视频文件同名的 .srt 文件。根据语音脚本制作字幕,而不是根据 听写转录:脚本具有正确的拼写。
  4. 询问用户哪个声音扮演哪个角色。为预览提供免费声音,为最终版本提供付费、富有表现力的声音。
    • 首先使用免费声音。 所有预览和第一个完整版本都使用免费声音进行配音。 保持角色的性别。只有在用户批准免费声音版本后,才生成付费声音。 在故事板的节拍中保留 tag,以备付费版本使用。
  5. 询问用户视频使用哪个品牌:来自 brands/<name>/ 的档案,项目自己的 外观,或完全没有。即使视频没有明显的品牌,仍然需要提问。将答案写入 in/brief.md,以便从第一次渲染起,卡片和调色板就来自该文件。
  6. 将故事板发送给用户。在用户批准之前,不要生成图像。

2. 角色

  1. 为每个角色编写一个固定的描述:面部、头发、身体、衣服。将其逐字复制到 每个图像提示中。保存在 in/characters.md 中。
  2. 使用 gen-image.py 在平坦、纯色的背景上生成基本绘图。在提示中添加“无地面阴影、无发光”。
  3. 使用 --input 从该基本绘图生成表演姿势:行走、坐下、指向、反应、做手势、 转身。一个场景需要姿势,而不仅仅是一个站立的人物。
  4. 制作嘴部状态(闭合、张开、大张)和眨眼。仅将更改的区域粘贴到 基本绘图上。绝不能使用整个编辑过的图像:面部会发生偏移。
  5. 使用 cutout.py 抠出每个姿势。对于绘图,使用 isnet-anime;对于照片,使用 u2net。
  6. 将所有姿势放在同一个 1024 像素的画布上,这样姿势变化无需偏移。
  7. 制作所有姿势的缩略图索引(ImageMagick montage)。打开它并查找在面部、衣服或比例上 与其它姿势不同的姿势。重新生成该姿势。每个图像最多尝试 3 次。

真人: 未经本人同意,不得绘制或动画化真人。首先请求许可。

  • 使用 cutout.py --model u2net 抠出脸部。不要将其放在圆形中。
  • 在浅色背景上的浅色头发在抠图中会消失。如果发生这种情况,请使用另一张照片。
  • 将颈部以下和肩部逐渐淡出至下巴以下,并绘制颈部与身体连接。裁剪的照片 在那里会有硬边。
  • 使用代码(SVG 关节)绘制身体。这样每个姿势都是精确的,并且面部不会偏移。

3. 场景和道具

  1. 以与角色相同的风格,使用 --size 1536x1024 生成每个地点作为背景图, 不包括人物。
  2. 生成作为独立抠图层的道具:手机、票、杯子、窗帘。
    • 检查每个屏幕、设备和包装上的品牌标志和文本。“无标志”提示并不能真正 阻止它们。使用 ImageMagick 修补标志。不要使用图像到图像的编辑:它会 移除错误的部分而保留标志。
  3. 在需要视差的地方生成前景层:一排排座位、栏杆。
  4. 如果项目有品牌档案,请使用它。从 brand.css 获取调色板,从 images/ 获取标志和 标语,从 fonts/ 获取字体。不要自行发明品牌颜色。阅读档案的 NOTES.md 了解其品牌形状。
  5. 如果项目没有用于图标的专用图形,请使用 MDI 图标(@mdi/js,24×24 路径)。 不要手动绘制图标,也不要使用表情符号。如果项目的网站已经将 MDI 图标用于某个事物, 则在视频中使用相同的图标。

4. 语音

  1. 使用 gen-speech.py 为每个说话者使用相同的 --voice 生成每句台词。
    • 在用户批准版本之前,使用同性别的免费声音。以下关于付费模型的说明适用于付费版本。
    • 运行 scripts/regen-voices.py <model>。仅当请求发生更改(文本、声音、模型、设置或同说话者邻居)时, 它才会向 API 发送一句台词,从而保留已批准的版本。不要为了修复一句台词而重新生成所有台词。
    • 要特意重新生成一句台词,请添加 --fresh <beat or speaker>。每次生成的版本都保存在 assets/voice/takes/ 中。要回退到早期版本,请使用 --restore <take>。
    • 在缓存之前创建的项目在每个节拍中没有 voice_key。使用 --adopt 运行一次, 否则第一次运行会重新生成每句台词。
    • 使用富有表现力的模型时,在每句台词前放置一个英语音频标签,例如 [warmly],并设置 模型的稳定性、相似性、风格和速度滑块。没有它们,台词听起来平淡。将标签 排除在 line 之外,因为字幕显示 line:将其放在节拍的 tag 字段中,并在文本之前发送。
    • 不要对不记录标签的模型使用音频标签。模型可能会将它们朗读出来。
    • 对于每个声音,首先列出名称、看起来像外语的单词和字母代码。 即使设置了语言代码,声音也会按照其自身语言的方式朗读它们。首先尝试单词的音标拼写, 然后内联国际音标。为每种拼写制作三个版本,并制作一个对照版本, 让用户通过听觉选择。
    • 不要使用大写字母写声音。声音可能会将大写字母读作单个字母。改为将其写为单词。
    • 新版本会移动每个单词。将节拍内的帧偏移(摄像机、高亮、音效)绑定到 字幕跨度开始位置,而不是字面帧。在新版本之后,通过语音转文本获取单词 时间,并仅重置跨度开始位置。
  2. 运行 scripts/level-voices.py。它会根据语音响度平衡每句台词。峰值平衡 是不够的:台词之间的响度差可能达到 6 dB。
    • 另一种语言的版本:保留场景并从相同源生成第二个合成。为新语言提供自己的故事板,使用相同的节拍 ID, 自己的语音文件夹、包络线和音乐剪辑(check-audio.py 中的 STORYBOARD、VOICE_DIR、MUSIC)。
    • 将新语音平衡到已批准混音的语音水平,而不是相同的目标。
  3. 制作嘴部包络线并使用 scripts/gen-envelopes.mjs 打包。

5. Remotion 中的动画

  • 舞台调度: 将每个场景作为动作播放。角色走进来、坐下、做出反应并使用道具。 在单独的图层上移动道具。修复需要添加缺失的部分;保留展示原因的动作。
  • 摄像机: 在每个镜头中推进、摇摄或跟踪。在背景、角色和前景之间使用视差。 限制每个摄像机移动,以便每个必须填满画面的图层在其视差深度(包括旋转)下 保持在画面内。深度 < 1 的图层移动得比摄像机少:拉出或结束于画面中心之外的摇摄会 露出画面边缘,并显示出一条地面的带状区域。
  • 景深: 将地面和所有站立在其上的物体(椅子、人物、道具)放在同一深度的一个 图层上。两个深度会在每个摄像机运动下使地面和椅子脚分开移动,导致 椅子漂浮。空闲时的点头应使身体在椅子线以上旋转,而不是椅子。
  • 运动: 使用带有小超调的弹簧。在移动之前使用预期动作。绝不要在两个姿势之间使用生硬的切换。
  • 空闲: 为呼吸、摇摆和眨眼赋予各自的周期和相位。
  • 嘴部: 由包络线驱动,最小保持 3 帧(启动套件 motion.ts 中的 mouthStates)。
  • 画外叙述者: 显示一个跟随包络线的波形球体,而不是叙述者的脸 (启动套件中的 NarratorOrb.tsx)。
  • 灯光: 将灯光用作叙事工具。例如:室内灯光变暗,手机屏幕在脸上发光。
  • 转场: 为每个剪辑选择一个(匹配剪辑、擦拭、硬切)。不要对所有剪辑都使用一种淡入淡出。
  • 一个角色在剪辑之间保持为同一个物体。 当角色从一个镜头移动到下一个镜头时, 将其从旧位置携带到新位置。一个角色从一侧离开并从另一侧进入, 会被认为是另一个角色。
  • 观众必须注意到的变化需要在语音中留出专门的停顿。 将节拍拆分,并在其后添加 1.5–2 秒的静音。 在该停顿内安排变化:标记旧状态,使其变暗,交叉淡入,然后在下句台词上高亮新状态。
    • 将停顿放在句子断句处,切勿放在短语内部。通过电平找到间隙:获取单词后低于约 −38 dB(相对于峰值)的 最长连续 20 毫秒窗口运行,并在其中点剪切。不要使用语音转文本单词时间: 它们的边缘可能有 0.5 秒的误差。
  • 字幕和关键点卡片:保持简短。卡片支持场景。它绝不应该取代场景。
  • 框架——每个视频都有:
    1. 开场标题卡片,约 3 秒:标志(如适用)、视频标题和一行简短 文字。可以无声或仅带音乐。
    2. 结束幻灯片,约 4 秒:标志(如适用)、主张或行动号召,以及 URL。可以无声。
    3. 角落标志: 在整个视频中位于右下角的小标志,介于两张卡片之间。在开场卡片后淡入, 在结束幻灯片前淡出。确保其不遮挡面孔和关键元素。
    4. “如适用”:品牌、产品或公司视频有标志。个人视频没有公司标志。 它仍然需要标题卡片和结束幻灯片。
    5. 要为完成的视频添加框架,不要重新调整语音的时长。将现有合成放在两张卡片之间的 <Series> 中。卡片会在开头和结尾添加静音, 这是可以接受的。
  • 品牌优先,始终如此。 如果项目有品牌档案,请使用它:来自档案的卡片, 来自 brand.css 的调色板,作为真实资源的标志和标记。如果项目有真实的 应用截图,请将其作为图层使用:真实的屏幕胜过绘制的近似屏幕。 只有人物、地点和道具是绘制的。用户界面、标志和文字来自品牌。 如果档案明显与实时应用相比过时,请指出并使用应用。

6. 检查画面

  1. 使用 npx remotion still 在关键帧处渲染静帧。
  2. 打开静帧。查找卡片或字幕遮挡的面孔,以及画面边缘切割的角色。 可选的第二意见:ADAPTERS.md 描述了 REVIEW_IMAGE 命令。将其判断视作线索,而非关卡, 并在画面上确认每个发现。
  3. 渲染一个约 20 秒的片段,包含场景、姿势变化、摄像机运动和对话交流。
  4. 在每次姿势变化周围提取帧。

…

[部分内容被截断以便翻译]

相关技能