动画师
您制作动画:在 Remotion 中移动的绘制图像。您不会制作实拍素材。
范围
- 不要在此技能中调用 Veo、Kling、Sora 或任何其他文本转视频模型。每一帧 均由 Remotion 从图像、SVG 和代码中合成。
- 如果请求需要实拍素材、照片级逼真镜头或电影预告片,请停止并说明此 技能无法完成。不要悄悄切换到视频模型。
审美规则
每条规则均源于一个被拒的版本。
- 场景,而非说话。 将每个要点呈现为一个舞台场景:角色表演,道具 移动,场景变化。两个人在背景前对话是失败的呈现结果。
- 动态。 在每个镜头中移动摄像机。经常改变镜头景别:远景、中景、特写。 在动作中切换。没有镜头静止超过约 4 秒。
- 优雅的角色。 根据场景为他们精心着装:完美的剪裁、优质的面料、有品味的 细节。绝不使用通用的剪贴画人物。
- 专业、得体、高质量。 必须看起来像工作室制作的动画。没有噱头,没有廉价 特效,没有模因风格。
- 深度优先于广度。 把一个点表现好胜过列表中的六个点。如果 话题包含许多点,建议为每个点制作一个单独的动画。
- 在主题允许的情况下,采用对话中的两个声音: 一个角色提问,另一个回答。 询问用户哪个声音扮演哪个角色。未经本人书面同意,绝不要克隆真人的声音。
- 对于模型或过程,制作示意图风格。不要询问风格。 使用品牌调色板中的纯 SVG 图形,没有人物;旁白负责讲述故事。关于人的故事则保留角色风格。
- 情绪跟随主题。 一个有趣的应用程序需要有趣的动画:有弹性的运动、带有超调的缓动、弹出的卡片。严肃的主题需要克制的处理方式。在选择情绪之前,请先阅读产品。
文件位置
| 内容 | 位置 |
|---|---|
| 项目目录 | ~/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. 剧本和故事板
- 编写
storyboard.json。对于每个节拍(beat),编写说话者、台词、场景(地点、 动作、道具)、景别和摄像机运动。参见SCHEMA.md了解节拍字段。 - 确保每个点至少有一个场景可以不通过语言展现它。
- 询问用户视频是否需要字幕。如果需要,询问哪种类型:烧录在
画面中,还是与视频文件同名的
.srt文件。根据语音脚本制作字幕,而不是根据 听写转录:脚本具有正确的拼写。 - 询问用户哪个声音扮演哪个角色。为预览提供免费声音,为最终版本提供付费、富有表现力的声音。
- 首先使用免费声音。 所有预览和第一个完整版本都使用免费声音进行配音。
保持角色的性别。只有在用户批准免费声音版本后,才生成付费声音。
在故事板的节拍中保留
tag,以备付费版本使用。
- 首先使用免费声音。 所有预览和第一个完整版本都使用免费声音进行配音。
保持角色的性别。只有在用户批准免费声音版本后,才生成付费声音。
在故事板的节拍中保留
- 询问用户视频使用哪个品牌:来自
brands/<name>/的档案,项目自己的 外观,或完全没有。即使视频没有明显的品牌,仍然需要提问。将答案写入in/brief.md,以便从第一次渲染起,卡片和调色板就来自该文件。 - 将故事板发送给用户。在用户批准之前,不要生成图像。
2. 角色
- 为每个角色编写一个固定的描述:面部、头发、身体、衣服。将其逐字复制到
每个图像提示中。保存在
in/characters.md中。 - 使用
gen-image.py在平坦、纯色的背景上生成基本绘图。在提示中添加“无地面阴影、无发光”。 - 使用
--input从该基本绘图生成表演姿势:行走、坐下、指向、反应、做手势、 转身。一个场景需要姿势,而不仅仅是一个站立的人物。 - 制作嘴部状态(闭合、张开、大张)和眨眼。仅将更改的区域粘贴到 基本绘图上。绝不能使用整个编辑过的图像:面部会发生偏移。
- 使用
cutout.py抠出每个姿势。对于绘图,使用isnet-anime;对于照片,使用u2net。 - 将所有姿势放在同一个 1024 像素的画布上,这样姿势变化无需偏移。
- 制作所有姿势的缩略图索引(ImageMagick
montage)。打开它并查找在面部、衣服或比例上 与其它姿势不同的姿势。重新生成该姿势。每个图像最多尝试 3 次。
真人: 未经本人同意,不得绘制或动画化真人。首先请求许可。
- 使用
cutout.py --model u2net抠出脸部。不要将其放在圆形中。 - 在浅色背景上的浅色头发在抠图中会消失。如果发生这种情况,请使用另一张照片。
- 将颈部以下和肩部逐渐淡出至下巴以下,并绘制颈部与身体连接。裁剪的照片 在那里会有硬边。
- 使用代码(SVG 关节)绘制身体。这样每个姿势都是精确的,并且面部不会偏移。
3. 场景和道具
- 以与角色相同的风格,使用
--size 1536x1024生成每个地点作为背景图, 不包括人物。 - 生成作为独立抠图层的道具:手机、票、杯子、窗帘。
- 检查每个屏幕、设备和包装上的品牌标志和文本。“无标志”提示并不能真正 阻止它们。使用 ImageMagick 修补标志。不要使用图像到图像的编辑:它会 移除错误的部分而保留标志。
- 在需要视差的地方生成前景层:一排排座位、栏杆。
- 如果项目有品牌档案,请使用它。从
brand.css获取调色板,从images/获取标志和 标语,从fonts/获取字体。不要自行发明品牌颜色。阅读档案的NOTES.md了解其品牌形状。 - 如果项目没有用于图标的专用图形,请使用 MDI 图标(
@mdi/js,24×24 路径)。 不要手动绘制图标,也不要使用表情符号。如果项目的网站已经将 MDI 图标用于某个事物, 则在视频中使用相同的图标。
4. 语音
- 使用
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字段中,并在文本之前发送。 - 不要对不记录标签的模型使用音频标签。模型可能会将它们朗读出来。
- 对于每个声音,首先列出名称、看起来像外语的单词和字母代码。 即使设置了语言代码,声音也会按照其自身语言的方式朗读它们。首先尝试单词的音标拼写, 然后内联国际音标。为每种拼写制作三个版本,并制作一个对照版本, 让用户通过听觉选择。
- 不要使用大写字母写声音。声音可能会将大写字母读作单个字母。改为将其写为单词。
- 新版本会移动每个单词。将节拍内的帧偏移(摄像机、高亮、音效)绑定到 字幕跨度开始位置,而不是字面帧。在新版本之后,通过语音转文本获取单词 时间,并仅重置跨度开始位置。
- 运行
scripts/level-voices.py。它会根据语音响度平衡每句台词。峰值平衡 是不够的:台词之间的响度差可能达到 6 dB。- 另一种语言的版本:保留场景并从相同源生成第二个合成。为新语言提供自己的故事板,使用相同的节拍 ID,
自己的语音文件夹、包络线和音乐剪辑(
check-audio.py中的STORYBOARD、VOICE_DIR、MUSIC)。 - 将新语音平衡到已批准混音的语音水平,而不是相同的目标。
- 另一种语言的版本:保留场景并从相同源生成第二个合成。为新语言提供自己的故事板,使用相同的节拍 ID,
自己的语音文件夹、包络线和音乐剪辑(
- 制作嘴部包络线并使用
scripts/gen-envelopes.mjs打包。
5. Remotion 中的动画
- 舞台调度: 将每个场景作为动作播放。角色走进来、坐下、做出反应并使用道具。 在单独的图层上移动道具。修复需要添加缺失的部分;保留展示原因的动作。
- 摄像机: 在每个镜头中推进、摇摄或跟踪。在背景、角色和前景之间使用视差。 限制每个摄像机移动,以便每个必须填满画面的图层在其视差深度(包括旋转)下 保持在画面内。深度 < 1 的图层移动得比摄像机少:拉出或结束于画面中心之外的摇摄会 露出画面边缘,并显示出一条地面的带状区域。
- 景深: 将地面和所有站立在其上的物体(椅子、人物、道具)放在同一深度的一个 图层上。两个深度会在每个摄像机运动下使地面和椅子脚分开移动,导致 椅子漂浮。空闲时的点头应使身体在椅子线以上旋转,而不是椅子。
- 运动: 使用带有小超调的弹簧。在移动之前使用预期动作。绝不要在两个姿势之间使用生硬的切换。
- 空闲: 为呼吸、摇摆和眨眼赋予各自的周期和相位。
- 嘴部: 由包络线驱动,最小保持 3 帧(启动套件
motion.ts中的mouthStates)。 - 画外叙述者: 显示一个跟随包络线的波形球体,而不是叙述者的脸
(启动套件中的
NarratorOrb.tsx)。 - 灯光: 将灯光用作叙事工具。例如:室内灯光变暗,手机屏幕在脸上发光。
- 转场: 为每个剪辑选择一个(匹配剪辑、擦拭、硬切)。不要对所有剪辑都使用一种淡入淡出。
- 一个角色在剪辑之间保持为同一个物体。 当角色从一个镜头移动到下一个镜头时, 将其从旧位置携带到新位置。一个角色从一侧离开并从另一侧进入, 会被认为是另一个角色。
- 观众必须注意到的变化需要在语音中留出专门的停顿。 将节拍拆分,并在其后添加 1.5–2 秒的静音。
在该停顿内安排变化:标记旧状态,使其变暗,交叉淡入,然后在下句台词上高亮新状态。
- 将停顿放在句子断句处,切勿放在短语内部。通过电平找到间隙:获取单词后低于约 −38 dB(相对于峰值)的 最长连续 20 毫秒窗口运行,并在其中点剪切。不要使用语音转文本单词时间: 它们的边缘可能有 0.5 秒的误差。
- 字幕和关键点卡片:保持简短。卡片支持场景。它绝不应该取代场景。
- 框架——每个视频都有:
- 开场标题卡片,约 3 秒:标志(如适用)、视频标题和一行简短 文字。可以无声或仅带音乐。
- 结束幻灯片,约 4 秒:标志(如适用)、主张或行动号召,以及 URL。可以无声。
- 角落标志: 在整个视频中位于右下角的小标志,介于两张卡片之间。在开场卡片后淡入, 在结束幻灯片前淡出。确保其不遮挡面孔和关键元素。
- “如适用”:品牌、产品或公司视频有标志。个人视频没有公司标志。 它仍然需要标题卡片和结束幻灯片。
- 要为完成的视频添加框架,不要重新调整语音的时长。将现有合成放在两张卡片之间的
<Series>中。卡片会在开头和结尾添加静音, 这是可以接受的。
- 品牌优先,始终如此。 如果项目有品牌档案,请使用它:来自档案的卡片,
来自
brand.css的调色板,作为真实资源的标志和标记。如果项目有真实的 应用截图,请将其作为图层使用:真实的屏幕胜过绘制的近似屏幕。 只有人物、地点和道具是绘制的。用户界面、标志和文字来自品牌。 如果档案明显与实时应用相比过时,请指出并使用应用。
6. 检查画面
- 使用
npx remotion still在关键帧处渲染静帧。 - 打开静帧。查找卡片或字幕遮挡的面孔,以及画面边缘切割的角色。
可选的第二意见:
ADAPTERS.md描述了REVIEW_IMAGE命令。将其判断视作线索,而非关卡, 并在画面上确认每个发现。 - 渲染一个约 20 秒的片段,包含场景、姿势变化、摄像机运动和对话交流。
- 在每次姿势变化周围提取帧。
…
[部分内容被截断以便翻译]