关于 stick-figure
stick-figure 是制作动画短视频的技能,将脚本、代码绘制的场景、旁白和音效组合起来。它提供示例项目及构建流程,涵盖逐词对齐、镜头时序和 MP4 渲染。
主要功能
- 01在项目文件夹中组织每条短片
- 02用代码绘制角色和场景
- 03按旁白逐词时间对齐镜头
- 04制作旁白和合成音效
- 05渲染镜头并导出 MP4
适用场景
- 01制作动画讲解短片
- 02替换旁白后重新调整镜头时序
- 03根据审核通过的脚本制作短视频
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ artemnovitckii/ claude-animation-skills --skill stick-figure安装后在 Claude Code 中输入/stick-figure确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
engine/make.shengine/template/audio.pycaptions.jsonscript.jsonengine/template/audio/words_ref.jsonengine/template/web/chars.jsenv.jsindex.htmllib.jsmain.jsshots.jswarp.jswords.jsengine/template/web/fonts/OFL-lora.txtOFL-poppins.txtengine/tools/align.pyrender.jstts_elevenlabs.pytts_kokoro.py详细介绍
/stick-figure
┌──────────────────────┐
│ ☀ ☁ │ bright sky, sea, props drawn in code
│ ◯ ◯ │ stick people with big white heads, expressive faces
│ /|\ /|\ │
│ / \ / \ 🛢 │
│ eye patch │ 1-2 word captions, lowercase, ~70% down
└──────────────────────┘
附带一个完整示例:engine/template 是一段已完成的 37 s 短片,标题为“如果海盗眼罩和失去眼睛毫无关系呢?”
首次使用
此技能的文件夹就是 Claude Code 加载它时显示的“Base directory”。
SKILL_DIR="<base directory of this skill>"
ENGINE="$SKILL_DIR/engine"
KIT=$(python3 -c 'import os,sys;print(os.path.realpath(os.path.join(sys.argv[1],"..","..","kit")))' "$SKILL_DIR")
[ -x "$KIT/.venv/bin/python" ] && [ -d "$KIT/models" ] || bash "$KIT/setup.sh" --voice # ~1 GB of voice models, once
PY="$KIT/.venv/bin/python"; export NODE_PATH="$KIT/node_modules"
需要 ffmpeg、Node 和 Python 3.9+。如需查看示例:cp -r "$ENGINE/template" ~/reels/pirate && bash "$ENGINE/make.sh" ~/reels/pirate。
工作原理
一段短片对应一个文件夹:
script.json:配音稿,每个条目一句话。captions.json:字幕的可选文本替换({"twenty five": "25"})。web/shots.js:镜头列表。每个镜头都以配音中的秒数为单位,通过SHOTS.push({start, end, tr, draw(ctx, lt, t)})添加;lt是镜头内的时间,tr是转场类型('whip'或'cut')。web/lib.js(缓动、关键帧kf、形状、文本)、web/chars.js(火柴人骨架drawStick、帽子、面部、手臂 IK、眼罩)、web/env.js(天空、云、海、船只、甲板、木桶、炮、灯笼、甲板下方)、web/main.js(鞭甩模糊、暗角、颗粒、字幕)。将新道具添加到env.js,或新建env2.js(并在web/index.html中列出)。audio.py:音乐和音效,全部通过代码合成,并按配音时间放置。
make.sh 会生成配音、对齐每个词(audio/words_new.json)、混合音频、并行渲染镜头,并写入 <folder>/<folder name>.mp4。
时间:audio/words_ref.json 是镜头计时所依据的配音。当配音变化但台词不变时,make.sh 会将镜头时间适配到新录音,因此更换录音无需修改。如果台词有变化,请删除 audio/words_ref.json(下一版录音会成为参考),并重新调整 shots.js 的时间。
步骤
- 脚本。 38 到 40 秒的短片约需 110 到 120 个词,每句话表达一个想法:以“如果……会怎样”的钩子开场,介绍普遍认知,用“But”转折,逐步举例,用一个镜头展示原理,最后给出回应开场钩子的结尾。开始动画前先给用户查看。
- 事实。 用来源核实每项说法。对于理论要使用保留措辞(“科学家认为”)。
- 文件夹。 执行
cp -r "$ENGINE/template" <reel>,然后清空其中的audio/,并替换script.json(和captions.json)。 - 配音。 在文件夹中执行:
"$PY" "$ENGINE/tools/tts_kokoro.py"(免费),或使用用户自己的录音,或使用 ElevenLabs 和ELEVENLABS_API_KEY("$PY" "$ENGINE/tools/tts_elevenlabs.py" audio/vo_el.mp3)。将录音放到audio/vo.wav,然后执行"$PY" "$ENGINE/tools/align.py" audio/vo.wav,并查看audio/words_new.json中的词语时间。 - 镜头。 重写
web/shots.js:大约 10 到 12 个场景,大多数持续 2 到 4 s,讲解镜头时间更长。新想法应配一个新场景。开场钩子从第 1 帧就开始呈现动作。人物面部和关键道具应避开字幕区域(y 约为 1250 到 1420),并位于 Instagram 安全区域内(x 100 到 980,y 220 到 1500)。 - 静帧。 在文件夹中执行:
node "$ENGINE/tools/render.js" stills 1.5,4.2,9.0,生成stills/。查看内容最丰富的时刻,并在完整渲染前修正问题。 - 音效。 根据词语时间编辑
audio.py中的提示音。 - 构建。 执行
bash "$ENGINE/make.sh" <reel>(保留audio/vo.wav;传入kokoro、elevenlabs或一个文件来替换它)。在核心数较多的机器上设置WORKERS=8。设置AUDIO_ONLY=1可重新混音而不重新渲染。 - 交付
<reel>/<name>.mp4。
风格
- 字幕:Poppins Bold,白字加深色描边,每条 1 到 2 个词,全小写,不加标点(
main.js中的capText()会处理;数字和%保持原样)。画面中不得出现 em dash。 - 明亮饱和的配色、墨线描边(
#221c22)、柔和的接触阴影、缓慢推进并带手持漂移、带动态模糊的鞭甩转场。冲击效果要包含爆发、震动和闪光。 - 音效音量低于配音(增益约为 0.38)。音乐是安静的拨弦背景音,在配音下方压低,开场绝不能使用音量很大的循环音乐。
评论
支持 Markdown