Communitygithub.com

Prateekiiitg56/beat-sync

将编辑与音乐同步——使用 librosa 进行节拍、强拍和起音检测,构建节拍网格,选择歌曲窗口,在重拍上放置剪切、闪光、文字和缩放,速度斜坡和速度时间映射,测量参考卷的剪切时机,并验证每个剪切都落在节拍帧上。适用于任何音乐驱动编辑(卷轴、蒙太奇、速度编辑、音乐视频、预告片、宣传片)。

beat-sync 是什么?

Beat Sync 是一个 AI 代理技能,用于将视频编辑与音乐节奏精确同步。它通过 librosa 库分析音频,提取节拍、强拍、起音(重拍)和 RMS 能量,构建可变的帧级时间映射,并在关键节拍点放置剪切、闪光、文字和速度斜坡等编辑事件。该技能支持任意节拍模型,提供从分析到验证的完整工作流程,用户可通过命令行脚本(如 beats.py 和 timemap.py)灵活控制。虽然主要面向 Claude Code、Cursor、Codex 等 AI 编码代理,但其纯脚本化设计也适用于任何支持 Python 和 ffmpeg 的开发环境,特别适合音乐驱动的短内容制作、蒙太奇和速度编辑。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Prateekiiitg56/video-editing-skills/tree/HEAD/skills/beat-sync

在你喜欢的 AI 中提问

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

文档

节拍同步

scripts/ 中的脚本:

  • beats.py MUSIC --out beats.json [--start S --end E] — 速度、节拍、强拍猜测、强起音(重拍)、每秒 RMS 能量。
  • timemap.py — 构建可变速度时间映射(速度斜坡)并使用 ffmpeg 逐帧渲染。

1. 分析音乐

python beats.py song.mp3 --out edit/beats.json

输出 tempo、beats(秒)、downbeats(从最强相位开始的每第 4 个节拍)、hits(强起音:军鼓/底鼓/重拍)、每 0.5 秒的 energy。

解读结果:

  • 节拍周期 P = 60 / BPM。在 30 fps 下,120 BPM 的一个节拍 = 15 帧。
  • 重拍不总是节拍。 人声重音、逐渐上升的结尾、重拍。对于“编辑音频”趋势,剪切点是重拍,而不是节拍器。
  • librosa 可能锁定到半速或双倍速。合理性检查:典型流行音乐 90-130 BPM,trap 130-160(通常感觉为半速),EDM 120-128,phonk 130-150。如果在帧抓取测试中检测到的网格感觉不对,则减半/加倍。
  • 能量曲线找到重拍/副歌:安静部分之后的最大 RMS 跳跃。

2. 选择歌曲窗口

  • 短视频:7-20 秒。在 强拍 上开始窗口,并在强拍或乐句结尾(4 或 8 小节)结束。
  • 将最强的视觉放在重拍上。如果重拍在歌曲的 12 秒处,而您想要它在卷轴的 3 秒处,则窗口从 9 秒开始。
  • Instagram/TikTok 上的热门声音:应用内声音从固定点开始。如果最终帖子会使用应用内声音,则将编辑对齐到该起始点,并导出带有参考音频的版本作为指南。
  • 淡入音乐 10-50 毫秒(避免咔嗒声),除非窗口从瞬态开始;淡出 0.3-1.5 秒,或在硬重拍上结束。

3. 构建网格并放置事件

fps = 30
fr = lambda t: round(t * fps)           # 将每个事件捕捉到最近帧
U = beat_period / 2                     # 子节拍单位(八分音符),如果歌曲很密集
  • 剪切:在节拍上以获得流畅感,在重拍上以获得冲击力。每个节拍都剪切会令人疲惫;每 2 或 4 个节拍剪切一次,仅在重拍前(2-4 秒)的爆发中使用每个节拍剪切。
  • 预期:在节拍 前 1-2 帧放置剪切在手机上感觉更紧凑(音频延迟 + 感知)。测试两者并一致选择。
  • 闪光/抖动/缩放冲击:在重拍上,2-6 帧,衰减。
  • 文字:单词出现在人声音节或节拍上;每个单词至少保持 0.4 秒用于单个单词,对于按节奏朗读的行约 0.25 秒/单词。
  • 速度/效果变化:在强拍或重拍上。
  • 将每个事件及其音乐原因保存在表格(timing.json)中;构建脚本读取它。

4. 速度斜坡(速度)

速度斜坡是一个时间映射 src_t = f(out_t)。通过具有缓动速度的片段构建:

# 速度曲线:1x ... 在重拍之间斜坡到 4x ... 在重拍上回到 0.3x
segments = [(out_start, out_end, speed_start, speed_end, ease)]
  • 使用 smoothstep/cubic 缓动输入和输出速度;瞬间从 1x 跳到 4x 看起来像故障。
  • 在 重拍上慢速(0.2-0.5x),在 重拍之间快速(2-5x)。重拍帧本身显示关键动作(撞击、转身、看)。
  • 慢速部分需要高帧率源或帧插值(minterpolate、Resolve Speed Warp、RIFE)。
  • 在快速部分添加运动模糊(tmix=frames=3 或在时间映射渲染器中帧混合)以避免频闪。
  • 真实案例:俯拍桌面镜头,相机移动部分保持 1x,静态部分为 5.6x,每次速度变化都在强重拍上;光流传递(OpenCV LK + RANSAC 相似性)自动定位相机移动(见 motion-tracking)。

timemap.py 通过为每个输出帧拉取正确的源帧(可选帧混合)来渲染时间映射——比链式使用 setpts 滤镜更精确且更简单。

5. 匹配参考卷的时机

  1. 下载/获取参考;提取其音频。
  2. 检测其剪切:ffmpeg -i ref.mp4 -vf "select='gt(scene,0.3)',showinfo" -f null - 2>&1 | grep pts_time。
  3. 检测其音频的节拍;将每个剪切表示为节拍索引或偏移 → 这就是节奏模板。
  4. 通过逐帧步进(1/30 秒精度)测量文字开启/关闭时间。
  5. 在相同网格上用您的素材重新构建(见 reference-matching)。

6. 验证

  • 场景检测渲染;每个剪切时间 × fps 应等于计划帧(±0)。
  • 在调试渲染中在节拍上叠加点击音轨(aevalsrc 正弦脉冲)并在重拍处抓取帧。
  • 您无法监听:报告数字(计划 vs 测量的剪切帧),并要求用户用耳朵检查。

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相关技能