BPM(每分钟节拍数)是一首曲子的心跳。差一拍,混音就对不上;差一个八度,DJ 套件就会崩。本检测器使用带有八度误差校正的起始包络自相关,在浏览器内读取任何音频文件的速度。把文件丢进来,得到一个数字 — 在节奏明确的素材上,通常误差在 ±2 BPM 以内。
BPM 检测真正测的是什么
BPM 检测是在信号能量包络中寻找周期性。经典做法:计算短时窗 RMS,对其一阶差分做半波整流得到起始信号,再做自相关找到最可能的节拍周期。常见的边缘情形包括:速度落不到整数帧边界上(174 BPM 出名地难处理)、半小节强重音让检测器报出半速、以及没有清晰节奏内容的曲子。我们通过检查倍速速度上是否同样存在强自相关峰来缓解常见的八度误差 — 如果存在,就偏向更快的读数,因为听众感知到的速度通常落在 100-180 BPM 区间。
本检测器的工作原理
音频由 Web Audio API 解码并下混到单声道。我们以 100 Hz 的帧率(10 ms 跳长,20 ms 窗口)计算 RMS 包络,再对一阶差分做半波整流以分离起始点。自相关在对应 60-200 BPM 的延迟范围上扫过。选定最强峰之后,我们做事后八度校正:如果一半延迟(= 倍速速度)上的峰至少达到所选峰的 45 %,就切换到更快的读数。在所选峰附近做抛物线插值以获得亚帧级 BPM 精度。所有处理都在 Float32Array 之上的浏览器 TypeScript 中运行 — 没有外部库,也没有服务器。
什么时候使用这个工具
- DJ 套件和现场演出的对拍
- 把混音和分轨锁到参考曲目的速度上
- 在导入录制的演奏前先把 DAW 的工程速度设定好
- 审核鼓组采样和循环以确保速度标签正确
- 对一时跟不上拍的曲子做快速节奏判断
常见问题
- 检测有多准?
- 在节奏清晰的素材(大多数带鼓的流行、舞曲、嘻哈和摇滚)上,可以预期 ±2 BPM 的精度。在打击乐微弱或缺失的素材(管弦、氛围、原声民谣)上,算法可借用的特征更少,可能报出半速或倍速。结果旁会一同给出置信度,置信度低时请对结果保留余地。
- 为什么有时候报的是预期 BPM 的一半?
- 当周期性以多个谐波相关的速度同时存在时,BPM 检测本身就是一个含糊不清的问题。我们会识别这种情形并偏向更快的读数,但对带强细分的极慢曲子(60-80 BPM),检测器仍可能选择倍速。如果觉得不对,请用自己的 tap-tempo 比对一下。
- 能处理速度变化的曲子吗?
- 不太行。集成读数反映的是整个音轨的平均速度。对于按段落变速的曲子,正确的工具是逐帧输出的 beat-tracking 算法 — 但它要重得多,也不适合一个免费的浏览器小工具。
- 如果我的音轨没有鼓怎么办?
- 原声/氛围/无打击乐素材是最难的情形。起始包络会捕捉音符的攻击,但比鼓击弱很多。置信度会偏低,结果也不可靠。这种情况下,根据作曲意图手动输入 BPM 反而更合适。
隐私
你的文件完全在这个浏览器标签页里被分析 — 由 Web Audio API 解码,由浏览器 TypeScript 处理,绝不会上传。关掉标签页,所有工作状态也随之清除。