Vibe 知识短片(代码逐帧版)
成片规格:1920×1080、30fps、约 159 秒(跟曲子走)或自定、没有人声、一屏一句中文字幕、画面全部由 Canvas 代码画。
示例《半衰期》(examples/halflife/)全部由组件拼成,复刻验证:和原样片 67 帧逐像素一致、混音逐采样一致。examples/gallery/ 是同一套组件换题材的演示。
这类片子观众买账的是三样东西:真实的事实(年份、原始数据、论文)、一直在动的画面、卡在音乐上的揭晓。下面每条规则都是为了守住这三样。
底线(每条都有出过事的原因)
- 上屏的每个数字、人名、年份、引文都要有出处,写进事实表;查不到就不写,示意画面标「示意」。AI 写引语时很会“编得像真的”——旧版《半衰期》里那句卢瑟福英文名言就是编的。
- 水印只写用户自己的号名或片名。照着参考帧做时,AI 会把参考作者的名字一起画进去(旧 demo 左上角写着“比特新语”),那等于冒用。
- 配乐只用用户提供、有授权的文件;不从别人视频里扒音轨,不去来路不明的站下载,skill 也不附带任何曲子。B 站发布时在 B 站投稿流程里添加音乐。
- 片尾和发布文案都写 AI 制作声明。
- renderFrame(t) 只由 t 决定:随机数用
VF.rng(种子),不用计时器,不在帧之间存状态。否则导出会抖、每次渲染都不一样。
准备
SK=~/.claude/skills/vibe-knowledge-film
$SK/engine/setup.sh # 检查 node / ffmpeg(libx264) / numpy,装 playwright 包,找本机浏览器
流程(三个确认点,确认后再往下)
① 选题和路线 → 确认 1
用 AskUserQuestion 问清(推荐项排第一):
- 选题:用户只给方向时给 3 个候选。好选题 = 硬核概念 × 能落到“你”身上的情感点(熵增 → 生活的力不从心;半衰期 → 遗忘是不是背叛),最好还有一个反直觉的转折。见
references/story.md。 - 配乐:
bgm(用户提供开智小曲等授权文件,画面卡曲子,片长 = 曲长)或synth(代码合成,片长自定)。 - 署名(水印写什么)、时长(默认跟曲子 159 秒)。
② 查证 → 事实表
每个要上屏的事实:说法 | 出处 | 可信度(T1 原始文献 / T2 权威二手 / T3 只能当“据说”)| 用在哪一句。 查证常常会改写故事:《半衰期》查到“遗忘是幂律、越旧越稳”,推翻了原副标题,反而成了结尾的反转。查到冲突就停下来告诉用户。
③ 字幕稿 + 分镜 → 确认 2
按六段式写(钩子 → 片名 → 历史锚点 → 机制演示 → 反直觉转折 → 落回观众 → 献词与参考),一屏一句、≤ 6.5 字/秒、关键词用 {} 高亮、需要出处的句子带第 4 项小字。
分镜每段写:画面在演什么(一句字幕对应一个屏上动作)、“真的在算”的东西(用真数据、真公式、固定种子跑模拟)、音效。模板 templates/事实表与字幕分镜.md。把事实表 + 字幕分镜给用户看,点头再写代码。
④ 建片、写 film.js
$SK/engine/new_film.sh <片目录> <片名> # 六段式骨架
$SK/engine/new_film.sh <片目录> <片名> --from halflife # 从《半衰期》起步 / 对照
先按要演的内容挑组件:references/components.md 有“讲什么 → 用什么”对照表,examples/gallery/组件图鉴.png 是全部组件的样子。骨架模板已经用组件拼好六段,换数据和文字即可;组件不够用再在 film.js 里写局部函数(API 见 references/engine.md,完整写法见 examples/halflife/film.js)。规则:
- 最难的那一镜先做,出静帧看立不立得住,再做别的。
- 字幕、场景、音效都按“分镜时间”写;卡曲子的事交给 warp(第 ⑤ 步),不要逐个改时间点。
- 场景里每 2–3 秒要有新动作;长停留加微动(流光、扫光、缓推),引擎自带的呼吸镜头幅度小,单靠它压不住“静止”。
- 新出现的字(场景里画、字幕里没有的)加进
strings。
⑤ 配乐与卡点
- bgm:曲子放进片目录,跑
python3 $SK/engine/analyze_bgm.py <曲子> --json out/bgm.json。如果是开智小曲,先比对data/kaizhi-xiaoqu.json的 sha256:一致就直接用里面的小节网格和建议锚点;不一致(别的来源会整体偏 0.1–0.3 秒)就以新测的 低频突入点 为准重建网格。然后在meta.music.warp写锚点:片名闪白 → 第 1 个 drop,设问/静默 → 回落段,反转揭晓 → 第 2 个 drop,落点和献词 → 乐句开头。细节见references/music.md。 - synth:在
meta.music.synth按段落写各声部电平、静默包络(照着示例的 SYNTH 改)。
⑥ 自检(不出全片)
node $SK/engine/export.mjs <片目录> events # 音效表 + 字幕时序
node $SK/engine/export.mjs <片目录> stills # out/stills.png,16 格总览;也可指定秒数 3,16.9,43.6
cd <片目录> && python3 -m http.server 8765 --bind 127.0.0.1 # 浏览器开 film.html 拖时间轴、听配乐
逐格看:字有没有压线出界、画面有没有空一半、曲线贴不贴数据点、有没有东西飘错位置、字幕和动作对不对得上。这些代码不报错,只有看才看得出来——《半衰期》在这一步抓到了 5 个。
⑦ 出片 + 质检
$SK/engine/build.sh <片目录> # 音效表 → 配乐 → 逐帧渲染 → -14 LUFS 合成 → qa.py(后台跑,约 5–12 分钟)
$SK/engine/build.sh <片目录> --skip-render # 只改了声音
qa.py 报 ✗ 必须改,! 要么改、要么交付时说明是有意的。机器也会冤枉人:报“黑场”先抽帧看,深色底常被误判。读法见 references/qa.md。
⑧ 交付 → 确认 3
给用户:成片路径、片长、质检结果、还不够好的地方。补 制作日志.md(每个翻车点:现象 → 原因 → 改法,做教程时就是镜头清单)。需要发布文案时见 references/publish.md。
命令速查
| 命令 | 作用 |
|---|---|
engine/setup.sh | 环境检查与安装 |
engine/new_film.sh <目录> <片名> [--from halflife] | 新建片子(复制一份引擎快照进去,日后升级引擎不影响旧片) |
node engine/export.mjs <目录> events / stills [秒,…] / render [起 止] | 导出音效表 / 总览图 / 视频(给起止秒只渲一段) |
python3 engine/audio.py <目录> | 配乐 + 音效 → out/mix.wav |
python3 engine/analyze_bgm.py <曲子> [--json 文件] | BPM、小节、能量曲线、低频突入点 |
engine/build.sh <目录> [--skip-render] | 一键成片 + 质检 |
python3 engine/qa.py <目录> [成片] | 单独质检 |
参考文件(用到再读)
| 文件 | 什么时候读 |
|---|---|
references/story.md | 选题、六段式、字幕规则、事实表分级 |
references/style.md | 视觉规范:配色、字体、五层画面、版式坐标、动效密度 |
references/components.md | 写场景前:21 个组件 + 5 个数据工厂、“讲什么 → 用什么”、参数 |
references/engine.md | VF 基础 API、meta 字段、场景写法 |
references/music.md | 配乐两种模式、开智小曲结构、drop 检测、warp 锚点、音效表 |
references/qa.md | 质检每项的含义、阈值和常见误报 |
references/pitfalls.md | 动手前扫一遍:做《半衰期》踩过的 30 个坑 + 同类项目的坑 |
references/publish.md | 发布文案、AI 声明、音乐与引用的处理 |
examples/halflife/ | 完整示例:film.js(组件版)、事实表与字幕分镜、制作日志 |
examples/gallery/ | 组件图鉴:同一套组件换题材;组件图鉴.png 总览 |
data/kaizhi-xiaoqu.json | 开智小曲的实测结构与建议锚点 |