animate 是做什么的?
将参考素材和一个粗略的想法转化为一个MP4文件,其中的每一帧都由代码绘制,音效由合成器生成。 用户提供审美;你来负责导演。一个粗略的简报就足够了,所以请自己做出创意决策,只询问那些会改变整个作品的问题。
所有内容都存放在 animations/<slug>/ 目录下:
refs/ study/ style.md beats.md piece.html score.json out/<slug>.mp4
根据需要在该目录中添加辅助脚本或笔记。examples/bee-dance/ 是本技能文件夹中的一个完整范例影片。
在下面的命令中,$SKILL 表示本技能的文件夹。从用户的项目中运行命令时,如果存在 $SKILL/.venv/bin/python,则使用它,否则使用 python3。如果缺少某个包,请参阅 README.md 中的设置说明。这些命令需要 ffmpeg 和 Chrome。
选择任务
| 用户想要 | 任务 | 方法 |
|---|---|---|
| "让这张图动起来" | 移动艺术品 | 将图像切割成图层并移动它们。阅读 references/move-an-image.md。跳过第3-4阶段的 piece.html;渲染脚本是一个Python脚本。 |
| "画这个","重新创建这个场景" | 重绘 | 在 piece.html 中绘制整个场景,与参考素材高度匹配。 |
| "以这种风格"创作一个主题或故事 | 新影片 | 下面的完整流程。参考素材设定外观;主题是新的。 |
如果他们没有指定时长或画幅,对于影片使用15秒、1080x1920;对于移动图像使用5秒。
代码擅长形状、线条、渐变和纹理:扁平矢量、线稿、剪纸、risograph、水彩、动漫背景、植物图鉴。它不擅长照片写实和人物面部表情。如果参考素材是照片写实的,在开始构建之前先说明这一点,并为其提出一个插画风格的演绎方案。
第1阶段:研究每个参考素材
用户可能会给你很多参考素材,所以给每个素材分配一个任务,而不是把它们混为一谈。
python3 $SKILL/scripts/study.py animations/<slug>/study <文件或文件夹...>
这会为你提供每个参考素材的联系表、调色板,对于视频还会提供剪辑点和节奏曲线。如果只有视频的一部分重要,可以添加以秒为单位的时间范围,例如 "reel.mp4@0-12",否则说话人头部的素材会使结果失真。然后亲自查看这些图表,并在纹理重要的地方进行裁剪。数字无法告诉你为什么某些东西感觉很好。
编写 style.md:
- 每个参考素材给我们带来了什么,每行一个:来自这个的纹理,来自那个的字体,来自另一个的节奏。
- 我们不复制的内容:姿势、角色、标志、签名、精确构图。取其风格,而非作品;唯一的例外是用户要求动画化的图像上的“重绘”或“移动”任务。
- 调色板以十六进制值表示,字体(
assets/fonts/初始有两个字体,或者你可以复制任何开放字体),纹理,运动感觉。 - 一个贯穿始终的设计要素,将整个作品联系起来:一个镜头、一个涟漪、一条永不中断的线。没有这种要素的影片看起来像幻灯片。
为每个新的参考素材在 animations/library.md 中添加一张简短的卡片,使其经验超越当前项目。当用户指向他们以前使用过的风格时,重用这些卡片;只有当你学到新东西时才扩展一个卡片。
关卡: 你能用一句话说清楚这个影片看起来是什么样子,以及为什么这样设计服务于主题。
第2阶段:节拍表
如果作品中有事实性内容,请先核实它们。一个画得很漂亮但错误的主张仍然是错误的,流行的“事实”往往不严谨。记录下你为最终报告所做的任何软化处理。
将 beats.md 写成一个表格。画面和声音一起规划,因为这种同步才让它看起来昂贵:
| 时间 | 画面 | 声音 |
|---|---|---|
| 0-1.5 秒 | 一个橙色的水滴落下并散开 | 滴水声,湿润的绽放声,铺垫音进入 |
| 1.5-3 秒 | 标题行出现,细节弹出 | 每个单词一个拨弦声,微小的滴答声 |
关卡: 在前半秒内有什么东西动起来;结构是:钩子、构建、呼吸、高潮;没有超过2秒没有新画面创意的时间段;结尾保持大约1.5秒以便可以阅读。让画面承载新创意,而不是文字:每个标题需要大约1.5秒在屏幕上,所以先缩短标题而不是内容。保持文字避开垂直画面的顶部12%和底部18%。
第3阶段:构建画面
复制 assets/piece-template.html 到 piece.html 并在其中绘制。约定是 window.PIECE 加上 window.renderFrame(t)。
renderFrame(t) 必须只依赖于 t,并且可以是异步的。静态帧可以跳到任何时间点,所以任何帧间记忆或未设种子的 Math.random() 都会破坏它们。在 window.ready 内部,使用已设种子的生成器一次性绘制昂贵的静态层,然后逐帧合成。
要在作品中展示另一个影片,将其帧提取到 clips/ 目录下,作为编号的JPEG文件,在异步 renderFrame 中使用 Image 加载需要的帧,并将其绘制到画布上。
在绘制之前阅读 references/styles.md;里面有可用的配方(卡通云、树叶、行走人物、水、水彩、纸张)以及可以复制的源文件。深度来自不同速度移动的图层,生命力来自小的次级运动:摇曳、漂移、闪烁、颤动。
尽早并经常审查静态帧,远在完整渲染之前:
python3 $SKILL/scripts/render.py animations/<slug>/piece.html --stills 0.5 3 7 12
以完整尺寸查看它们,并与参考素材并排比较,修复不匹配的地方。预计需要几轮迭代。第一张静态帧通常是粗糙的草稿,而这个循环正是质量提升的关键。
python3 $SKILL/scripts/compare.py animations/<slug>/out/compare.jpg <静态帧和参考图像...>
关卡: 中间位置的一张静态帧看起来像是用与参考素材相同的材料制作的:相同的纸张、颜料、线条和颜色。主题可以是新的。参考素材的剪贴画版本不合格。
第4阶段:声音
根据 beats.md 中的相同时间编写 score.json。有关可用声音,请参阅 scripts/synth.py 的头部:拨弦声、铃声、铺垫音、滴水声、滴答声、渐强音、嗖嗖声、撞击声、踢鼓声和噪声底床。
python3 $SKILL/scripts/synth.py animations/<slug>/score.json animations/<slug>/out/score.wav
保持在一个调性上。让重音落在画面事件上,而不是网格上。在高潮之前留下真正的静默,因为对比才是它落地的关键。使用几行Python生成长串音符,而不是手动输入它们。
你听不到声音,所以请阅读 synth.py 打印的电平报告:注意你未计划的下凹,以及标志性声音被其余部分淹没的情况。
如果作品有旁白
旁白应该在画面之前完成,因为词语的时间点决定了每个节拍。使用用户拥有的任何语音工具录制它,使用单词时间点进行转录(faster-whisper 可行),然后根据这些时间点构建节拍和标题。Whisper 可能会在其前面的静默中提前开始一个词,所以在剪切停顿之前检查波形。
将人声混合到配乐之上,然后使用结果作为 --audio 进行渲染。配乐在人声下方闪避,因此在停顿处音乐升起:
python3 $SKILL/scripts/mix.py animations/<slug>/out/voice.wav animations/<slug>/out/score.wav animations/<slug>/out/mix.wav
第5阶段:渲染、检查、修复
python3 $SKILL/scripts/render.py animations/<slug>/piece.html --audio animations/<slug>/out/score.wav
python3 $SKILL/scripts/qc.py animations/<slug>/out/<slug>.mp4
render.py 输出 out/<slug>.mp4,母带处理到 -14 LUFS。它会打印进度,典型作品15秒大约需要1-2分钟;如果作品较重,在后台运行。如果只是声音修改,添加 --remux 可以在几秒钟内交换音频而无需重绘。
qc.py 会标记空白片段、单帧故障和音量问题,并写入一个联系表。它无法判断运动是否看起来良好,所以也要阅读联系表,然后逐帧仔细检查风险时刻的特写裁剪:过渡、文字进出、图层重叠处,以及任何重复运动的完整循环。修复并重新渲染直到干净。
交接
用用户易懂的语言报告:你制作了什么,每个参考素材如何使用,你检查了什么,以及你无法检查什么。你无法听到配乐或以速度观看,所以请说明。添加:
- 一个你知道的事实,如果你软化了某个主张。
- 容易调整的内容:3或4个他们可以要求下一步做的具体更改。
- 某个参考素材是否属于他人,在商业使用前需要慎重考虑。