Communitygithub.com

演示到宣传短片:用代码做卡点竖屏短片

用 Kinetix 以代码制作卡点竖屏(或 16:9)宣传短片:场景用 HTML/JS 写,MusicGen 或纯合成器配乐、重拍落在节拍上,逐字对时字幕,Remotion 漏光和转场音效,HyperFrames 质量关卡,渲染时直接烧入封面图。

演示到宣传短片:用代码做卡点竖屏短片 是什么?

「演示到宣传短片」配方第 3 步(社媒剪辑),来自 nikhilcherry/kinetix。每一帧都是时间的纯函数:短片是一条 index.html 时间轴,music.py 在同一节拍网格上生成配乐,所以剪辑点、震屏和重拍同时落下。智能体先收集真实素材:原文引用 README、官网文案和应用内文字,使用真实截图或 2× DPI 的 Playwright 截取(API 用 mock),绝不编造数据。然后按网格规划(150 bpm 时一拍 0.4 秒),套用验证过的 50–60 秒结构:2 秒冷开场钩子、铺垫、近乎静音的停顿、Logo 砸屏加产品流程的高潮、半速转折。可选的 TTS 旁白会变成逐字对时字幕;再加 Remotion 漏光与转场、HyperFrames 质量关卡和烧入的封面,产出可直接发 Shorts、TikTok 和 Reels 的 MP4。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nikhilcherry/kinetix/tree/HEAD/skill/kinetix

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

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 秒结构:

段落小节数作用
冷开场32 秒内建立 relatable 的钩子:视角 + 痛点
铺垫6–7以小节切分升级,然后引入 riser
间隙¼0.4 秒的近乎静默(“直到现在…”)
第一爆点8Logo 猛击,然后产品流程,每拍一个动作
半速4–5转折或深度,经过滤镜处理且更安静
第二爆点8–10快速展示:素材、真实数据、证明
结尾3Logo、标语、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. 验证:观察,然后检查

  1. kinetix snap my-reel 1.5,4,9,...,每个场景拍摄一次。打开联系表并实际查看。空白帧意味着 JS 错误或未注册的时间线。
  2. 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 文件的位置
  • 内容概述,以简短的节拍列表形式呈现
  • 你验证的内容和验证方式(联系表、检查结果、响度)
  • 你做出的任何数字或声明选择
  • 你无法验证的内容(你无法听到;请他们试听)

提供发布选项,但未经同意切勿发布。

相关技能