Kinetix: 用代码制作精彩短剧
Kinetix 存放在一个代码仓库中(可通过 PATH 上的 kinetix、$KINETIX_HOME 或包含 runtime/kinetix.js 的 kinetix/ 检出目录找到)。
所有命令均为 kinetix <cmd>;首先运行 kinetix doctor,如果缺少组件,则运行 ./setup.sh。
核心模型:每一帧都是时间的纯函数。 一段“短剧”是一个包含时间线上场景的 index.html;
配乐由 music.py 在相同的节拍网格上构建,因此剪辑、震动和节奏爆点能够同步对齐。
1. 先收集真实素材
- 故事来源于产品自身的语言。 阅读其 README、网站文案和应用文本,并引用它们。切勿编造统计数据、用户、奖项或速度。
- 展示真实内容。 使用应用截图、屏幕录制,或使用 Playwright 以 2 倍 DPI 捕获的实时网页。如果捕获会触及实时后端,则在浏览器中模拟 API(
page.route),而不是创建真实记录。将模拟或演示素材标注清楚。 - 只选一个数字。 如果来源存在分歧(1.2 秒 vs 1.5 秒),始终如一地使用一个数值,并在交接中注明来源。
- 旁白为可选项。 对于旁白,使用用户拥有密钥的 TTS API(印度语言使用
tools/tts_sarvam.py),然后运行kinetix captions。
2. 在网格上规划
在 150 BPM 下,一个节拍为 0.4 秒,一个小节为 1.6 秒。每个段落边界和每个大爆点都落在节拍上。一个经过验证的 50–60 秒结构:
| 段落 | 小节数 | 作用 |
|---|---|---|
| 冷开场 | 3 | 2 秒内建立 relatable 的钩子:视角 + 痛点 |
| 铺垫 | 6–7 | 以小节切分升级,然后引入 riser |
| 间隙 | ¼ | 0.4 秒的近乎静默(“直到现在…”) |
| 第一爆点 | 8 | Logo 猛击,然后产品流程,每拍一个动作 |
| 半速 | 4–5 | 转折或深度,经过滤镜处理且更安静 |
| 第二爆点 | 8–10 | 快速展示:素材、真实数据、证明 |
| 结尾 | 3 | Logo、标语、URL、淡出 |
文本必须可读。 快速出现后保持:标签约 0.8 秒,句子每个词约 0.3 秒。序列文本放在每隔一个节拍上。只有非文本强调可以每个节拍出现。
3. 构建短剧
kinetix new my-reel # 竖屏;添加 --landscape 可变为 1920x1080
my-reel/index.html 使用运行时(references/runtime.md):
const K = Kinetix.init({ width: 1080, height: 1920, bpm: 150, build: [[3.2, 9.2]], drops: [[9.6, 16]], glitches: [9.6], fonts: [...] });
K.scene(9.6, 12.8, `<div class="c big t" style="left:540px;top:800px;font-size:230px">BRAND</div>`,
(lt, q) => K.slam(q(".t"), lt, 0, { from: 3 }));
K.start({ dur: 19.2 }).then(({ timeline }) => { window.__timelines["main"] = timeline; }); // 保留此字面量
场景模式(手机框架、全息素材面板、数据猛击、聊天气泡、计数器、打字动画)详见 references/recipes.md。
保持品牌一致:从产品中提取颜色、字体和 Logo,并通过 kinetix.css 中的 :root 变量进行主题化。
4. 构建配乐(references/music.md)
- 背景音乐:
kinetix music gen "<流派、乐器、情绪>" --bpm 150 --seconds 60 -o my-reel/assets/bed.wav。MusicGen 遵循提示中的 BPM,该工具会进行时间拉伸以匹配精确网格并写入bed.json。如果没有 GPU 或 MusicGen,Mix(bpm=150, seconds=DUR)可以构建纯合成混音。 music.py:m = Mix("assets/bed.wav", seconds=DUR),然后:- 按照与场景相同的时间放置打击乐:
m.add(t, h.impact())、m.drums(...)、m.sfx("impact/...") - 塑造编曲结构:
m.lowpass([(t, hz), ...])、m.bed_level(...)、m.gap(14.0, 14.4) - 然后运行
kinetix mix my-reel。
- 按照与场景相同的时间放置打击乐:
- 检查动态(你无法聆听,所以需要测量)。每个段落的 RMS 应从铺垫到爆点上升,在半速段下降,并在爆点达到峰值。如果铺垫比爆点更响,请降低铺垫的合成器层音量。同时生成频谱图(
ffmpeg ... showspectrumpic)并查看。 - 旁白: 混音后,使用 Whisper 在混合片段上确认旁白是否可听。
5. 字幕(可选,需要旁白)
captions-lines.json 包含 [{"clip": "assets/line1.wav", "at": 1.62, "text": "exact script", "y": 600}]。然后运行 kinetix captions my-reel。Whisper 以英文模式运行,并将脚本作为提示,因此印地语和其他罗马化的台词能保持其拼写。每行单独构建页面。
6. 验证:观察,然后检查
kinetix snap my-reel 1.5,4,9,...,每个场景拍摄一次。打开联系表并实际查看。空白帧意味着 JS 错误或未注册的时间线。kinetix check my-reel每 ½ 秒采样一次,且必须以 0 错误 结束。- 修复真实问题:文本溢出其框、重叠、隐藏文本、对比度。
- 仅标记有意的分层,切勿标记真实问题:对于文档上的印章使用
data-layout-allow-overlap,对于有意放在精灵之上的文本使用data-layout-allow-occlusion,对于框架中裁剪的截图使用data-layout-allow-overflow,对于装饰性背景或巨大的模糊表情符号使用data-layout-ignore。 - 在声称“修复”可见之前,对比修复前后的帧。某些发现可能是检查器的误报。
7. 特效与渲染
kinetix fx leak --hue 200 -o overlays/leak-cyan.mov # 色相:0 琥珀色,70 粉色,200 青色,290 石灰绿
kinetix fx stinger --colors "#c8ff3d,#5a45c9" -o overlays/stinger.mov
kinetix render my-reel -o out.mp4 --overlay overlays/[email protected]:0.8 --overlay overlays/[email protected] --poster 18.3
- 光漏特效:
leak-*文件以滤色模式叠加为灯光,因此文本保持可读。在爆点前约 0.4 秒开始光漏,使其在爆点时达到峰值,且不要让光漏峰值与 Logo 猛击重叠。 - 转场特效: 在剪辑前约 0.3 秒开始,让面板覆盖剪辑。
- 海报帧:
--poster将最佳稳定帧烧录为第 0 帧,这将成为 X、YouTube、Slack 和 Discord 上的缩略图。选择 Logo 卡或关键画面,切勿选择动画中间或闪光帧。 - 最终检查: 从最终 mp4 中提取帧(第 0 帧、每个叠加峰值、每个素材场景)并查看。
常见陷阱(全部真实遇到过)
- 桥接返回
{ timeline },而不是时间线本身。 GSAP 时间线是一个 thenable 对象,因此从异步函数中直接返回它会永远挂起,导致所有帧渲染为空白。 - 显示字体上的高亮框需要
line-height: 1.12(已在kinetix.css中),否则字形会突出,check会标记text_box_overflow。 - 素材必须是
<video muted data-start data-duration [data-media-start]>,放在非计时包装器中,绝不能使用 JPG 序列。动画作用于包装器,而不是视频本身。 - 图片切换(屏幕 A → B)使用
KinetixBridge.stackSet(img, src),该方法会预解码变体。在渲染时设置src会捕获未解码的帧。 - 每个命名字体都需要
@font-face。 对于系统表情符号字体,声明src: local("Noto Color Emoji")。 - MusicGen 背景音乐: librosa 的
beat_track会错误识别 Phonk 和 Club 节奏(它将 150 BPM 误判为“121”和“199”),这就是为什么hypebeat使用起始点自相关并将拉伸限制在 ±12% 以内。musicgen-medium 需要约 8 GB 的空闲 RAM 来加载;small 是默认值。 - 字幕: 将所有行合并为一个
createTikTokStyleCaptions调用会导致每行的最后一个词与下一行合并,因此运行时按行分页。 - Remotion: 使用
--gl=swangle(软件 GL 可在任何地方工作)渲染为 ProRes 4444 带 Alpha 通道。ffmpeg 的 VP9 解码器会丢弃 Alpha 通道。 - 许可证:
- MusicGen 输出采用 CC-BY-NC 许可证,适用于演示和个人频道,不适用于商业项目。
- Remotion 对个人和不超过 3 人的公司免费。
- 附带的音效为 CC0 许可证。
交接
告知用户:
- mp4 文件的位置
- 内容概述,以简短的节拍列表形式呈现
- 你验证的内容和验证方式(联系表、检查结果、响度)
- 你做出的任何数字或声明选择
- 你无法验证的内容(你无法听到;请他们试听)
提供发布选项,但未经同意切勿发布。