贴纸科普讲解视频(Sticker Explainer)
把口播稿和配音做成一支「调查板」式的讲解视频。画面骨架:一块很大的深蓝灰底板,每个场景是板上的一个区域(panel),镜头沿一条橙色虚线线索从一个区域滑到下一个;人物是带白边的抠图贴纸,地点和物件是照片贴纸,信息是纸片卡片和带图标的标签;每到新章节,画面停一下,弹出思维导图点亮下一条线索。
本 skill 建立在 motion-showreel(ConardLi/garden-skills)之上:它提供 render(t) 页面约定、逐帧渲染、音效合成和成片检查。先确认它已安装(npx skills add ConardLi/garden-skills,或复制到 ~/.claude/skills/motion-showreel)。本 skill 只加风格、流程和中文长片工具,不复制它的代码。
完整示例:examples/huang-resignation/(13 分 43 秒的成片,见仓库 Release)。每一步的命令见 references/workflow.md;画面函数见 references/engine-api.md;视觉规则见 references/style.md。
开工前问清(一次问完,最多 4 个问题)
- 配音:用户自己用 ElevenLabs 生成(推荐;稿子里的
[serious][short pause]是 v3 的标签),还是先做无声版。多段配音要问清怎么拼(例如「开头用短的,后面按字幕接长的」)。 - 画幅:默认 16:9、1920×1080。
- 人物:默认只用公有领域或 CC 授权的照片抠图(美国政府官员的官方照属于公有领域);没有授权照片的人只用名牌卡片。
- 字幕:默认中文、单行、每行 ≤ 14 字。
用户说「有任何不确定的向我提问」时,把真正会改变结果的分歧问出来;能从录音、代码或常识里定下来的不要问。
流程
以录音为准,不以稿子为准。 录音常和贴来的稿子不一样(漏句、改词、换顺序)。字幕和画面跟录音走,并在 brief 里列出差异告诉用户。章节等位置如果按稿子找不到对应句子,选录音里最接近的位置,说明调整了哪里。
- 建项目:
export MOTION_SHOWREEL=$(realpath <motion-showreel 目录>),然后sh scripts/new_project.sh <dir>,把配音放进audio/src/,填video.config.json。所有命令都写项目的绝对路径。 - 拼配音(多段时):先用
transcribe.py <dir> --take <file>看每段的句子和时间,在句间停顿里选下刀点,写进voice.splice,再splice.py。 - 转写和对齐:
transcribe.py,然后align.py。whisper.cpp 整段转写的时间戳几分钟后会漂移,所以脚本按停顿切成约 40 秒的小段重转一遍拿准确时间。whisper 偶尔会输出繁体字,脚本用 opencc 统一转成简体。读一遍timeline/segments.json,把听错的人名、他/她/它等加进fixes,重跑。 - 剪节奏:
voedit.py。章节停顿(第一章前做总览时 7.5 秒,其余 4 秒)和整段变速(如开头 1.1×)都在这里做。它只插静音、只变速,从不剪掉或调换语句。输出vomap.json,后面的时间都经过它换算,所以改节奏不会让画面错位。 - 字幕和时间轴:
timeline.py生成timeline.js。字幕一屏一行、≤ 14 字(拉丁字母算 0.55 字),只在词与词之间换屏,人名、机构、金额、书名号标题都放进subtitles.protect,不会被拆开。 - 关键帧:先做 3 张关键帧 给用户确认风格,再写全片。
- 写场景:在
episode.js里写PANELS,元素出现时间都写成V(句子号, 偏移)。每写完一批场景,出一张联系表(render.mjs --still … --sheet)自查遮挡。 - 声音:
events.mjs读出页面登记的音效时间;用 motion-showreel 的audio.mjs build score.mjs --raw --out audio/sfx.wav合成音效;mix.py混音。 - 渲染:
build.sh依次做确定性检查、逐帧渲染和成片检查(13 分钟 1080p 约 10 分钟)。渲染完抽帧检查思维导图、字幕和照片有没有遮挡。
用户反复提过的要求(默认就这样做)
- 转场要丝滑:所有场景都在一块板上,镜头沿线索平移,主角贴纸作为
actors跟着镜头滑进下一个场景,不切掉重来。 - 章节导图:章节分界时口播停顿,底板压暗,连线画出,节点变橙并出现扫描框,已完成的打勾。第一次出现时做「总览」:分支逐个弹出,再点亮第一章,之后才出现下一个场景的内容。
- 进度条放在字幕下方,章节之间的每一段写章节名。
- 多用图标和图片:标签和卡片带线条图标;地点和机构用照片贴纸。示意性的照片标「示意」。
- 元素不能挡字幕和左上角的章节标题:屏幕下方约 200 px 留给字幕,左上角(约 x < 700、y < 120)留给标题,大字也不要放进这两块区域。
- 音效不能盖过口播和配乐。思维导图用温和的马林巴「板块」音(总览时每个分支一个五声音阶音),点亮时保留一声点击。不要用 riser、glitch 这类「科技感」音效。
- 配乐:最后一首选有自然结尾的曲子,让结尾正好落在片尾,开头在某个章节停顿处淡入。章节停顿时音乐压低 6 dB。
- 音量:只用线性增益。默认人声 −15 LUFS、音乐 −26 LUFS(人声比音乐高约 11 dB),音效比人声低约 12 dB,峰值限制 −1.5 dBFS,这样整片能通过 −14 ± 1.5 的响度检查。用户说「口播下调 / bgm 上升」时按 dB 改
levels和music.lufs;如果整体因此低于检查标准,告诉用户这是预期的(示例片就是按作者要求用的 −19.3 / −30)。
事实、版权与安全
- 新闻类内容的事件常常发生在模型的知识截止之后:要联网核实,把来源写进片尾;找不到原文的数字列进 brief 的「待核对清单」交给用户。
- 未证实的指控在画面上标明(「仍在调查」「某部门否认」「示意」);关联不等于证据。不在任何人的照片旁贴「间谍」之类的标签。
- 照片只用公有领域或 CC 授权的,许可信息记在
assets/credits.json并写进片尾。Pixabay 等配乐可以用在成片里,但不能把曲子文件本身再分发。 - 磁盘:渲染、音频中间文件和成片合计约需 1 GB。先查空间;不够时只删可重建的中间文件。删用户的文件或下载的模型前先问。
文件
sticker-explainer-video/
├── SKILL.md
├── scripts/
│ ├── new_project.sh 建项目(motion-showreel scaffold + 本模板)
│ ├── cfg.py 公共函数(读 video.config.json、ffmpeg、响度、停顿检测)
│ ├── splice.py 多段配音拼接
│ ├── transcribe.py whisper.cpp 两遍转写 → 句子文本 + 逐字时间 + 停顿
│ ├── align.py 对齐 → timeline/sentences.json
│ ├── voedit.py 章节停顿、变速 → audio/vo-edit.wav + vomap.json
│ ├── timeline.py 时间映射 + 字幕切分 → timeline.js
│ ├── events.mjs 从页面读出音效时间
│ ├── mix.py 人声 + 配乐 + 音效 → audio/final.wav
│ └── cutout.swift Apple Vision 人像抠图(macOS)
├── assets/template/ index.html、engine.js、episode.js(示例场景)、score.mjs、video.config.json、fonts
├── references/
│ ├── workflow.md 每一步的命令和检查点
│ ├── engine-api.md engine.js 的绘图函数与 start() 参数
│ └── style.md 配色、版式、转场和声音规则
└── examples/huang-resignation/ 完整示例(代码、配置、时间轴、照片、配音)