如何在php中检测一首歌的BPM

时间:2009-03-18 05:32:14

标签: algorithm audio signal-processing beat-detection

如何以编程方式确定歌曲的速度/ BPM?常用的算法是什么,必须考虑哪些因素?

12 个答案:

答案 0 :(得分:42)

在单个StackOverflow帖子中解释这很有挑战性。通常,最简单的节拍检测算法通过定位声能中的峰值来工作,这很容易被检测到。更复杂的方法使用 comb filters 和其他统计/波形方法。有关包含代码示例的详细说明,请检查this GameDev article输出。

答案 1 :(得分:30)

要搜索的关键字是“节拍检测”,“节拍跟踪”和“音乐信息检索”。这里有很多信息:http://www.music-ir.org/

有一个名为MIREX的(可能)年度比赛,其中不同的算法测试其节拍检测性能。

http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/

这应该给你一个要测试的算法列表。

经典算法是 Beatroot (google it),这很好且易于理解。它的工作原理如下:

  1. 短时间FFT音乐以获得超声波图。
  2. 对每个时间步的所有频率的增加求和(忽略减少)。这为您提供了称为“光谱通量”的一维时变函数。
  3. 使用任何旧的峰值检测算法查找峰值。这些被称为“开始”,对应于音乐中的声音开始(音符开始,鼓点击等)。
  4. 构建起始间隔(IOI)的直方图。这可用于查找可能的节奏。
  5. 为节拍跟踪结果初始化一组“代理”或“假设”。按顺序一次一个地添加这些代理。每个代理都跟踪也是节拍的开始列表,以及当前的速度估计。代理可以接受开始,如果它们与他们最后跟踪的节拍和节奏紧密相符,如果它们完全不同则忽略它们,或者如果它们介于中间则产生新的代理。不是每个节拍都需要一个发作 - 代理可以插入。
  6. 每个代理人根据其假设的整齐程度给出一个分数 - 如果所有的节拍开始都是响亮的,那么它会获得更高的分数。如果它们都是常规的,它会获得更高的分数。
  7. 得分最高的答案就是答案。
  8. 根据我的经验,该算法有所下降:

    • 峰值检测非常特别,对阈值参数和诸如此类的敏感。
    • 有些音乐对节拍没有明显的影响。显然它不适用于那些。
    • 很难知道如何解决60bpm-vs-120bpm问题,尤其是实时跟踪!
    • 仅使用1D光谱通量丢弃 lot 信息。我想你可以通过一些带限频谱通量(也许是一个宽带鼓通道)来做得更好。

    Here是此算法实时版本的演示,显示了光谱通量(底部的黑线)和开始(绿色圆圈)。值得考虑的是,节拍是从绿色圆圈中提取的。我已经像点击一样播放了这些内容,说实话我不认为我能听到他们的节拍,因此在某种程度上这种算法比节拍检测的人要好。我认为减少这种低维信号是它的弱点。

    令人讨厌我几年前找到了一个非常好的网站,其中包含许多用于节拍检测的算法和代码。虽然我完全没有改过它。

    编辑:找到它!

    以下是一些很棒的链接,可以帮助您入门:

    http://marsyasweb.appspot.com/

    http://www.vamp-plugins.org/download.html

答案 2 :(得分:22)

节拍提取涉及识别音乐中的认知度量结构。通常这些不对应于物理声能 - 例如,在大多数音乐中存在一定程度的切分音,这意味着我们感知的“脚踏”节拍与物理声音的存在不对应。这意味着这是起始检测的一个完全不同的领域,它是物理声音的检测,并以不同的方式执行。

您可以尝试使用Aubio库,这是一个提供起始和节拍提取工具的普通C库。

还有在线Echonest API,虽然这涉及将MP3上传到网站并检索XML,但可能不太适合..

编辑:昨晚我碰到了这个 - 一个非常有前途的C / C ++库,虽然我自己没有使用它。 Vamp Plugins

答案 3 :(得分:9)

如果您可以设法在项目中使用python代码进行交互,那么Echo Nest Remix API是一个非常灵活的python API:

有一个方法analysis.tempo可以为您提供BPM。它可以比简单的BPM做得更多,您可以从API文档或 this 教程中看到

答案 4 :(得分:9)

您感兴趣的一般研究领域称为音乐信息检索

有许多不同的算法可以做到这一点,但它们都基本上以ONSET DETECTION为中心。

开始检测测量事件的开始,在这种情况下,事件是正在播放的音符。您可以查看加权傅立叶变换(高频内容)中的变化,您可以查看物质内容的较大变化。 (特殊差异)。 (我建议你进一步研究几篇论文)一旦你应用了一个起始检测算法,你就可以通过阈值来挑选节拍的位置。

一旦你获得节拍的时间定位,就可以使用各种算法。您可以将其转换为脉冲序列(创建一个始终为零的信号,仅在您的节拍发生时为1)然后应用FFT和BAM,现在您在最大峰值处具有开始频率。

以下是一些引导您走向正确方向的论文:

http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf

http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf

这是对某些人讨论的内容的扩展:

有人提到应用机器学习算法:基本上从起始检测功能(如上所述)中收集一堆特征,并将它们与神经网络/逻辑回归中的原始信号结合起来,并了解什么使节拍成为节拍。

看看Andrew Ng博士,他在线获得斯坦福大学的免费机器学习讲座(不是漫长的视频讲座,实际上是在线远程课程)

答案 5 :(得分:7)

执行Fourier transform,找到功率谱中的峰值。您正在寻找低于20 Hz截止值的人类听觉峰值。我猜通常在0.1-5Hz的范围内是慷慨的。

可能有帮助的问题:Bpm audio detection Library

此外,这是关于SO的几个“高峰发现”问题之一:Peak detection of measured signal


编辑:不是我做音频处理。这只是基于您正在寻找文件的频域属性这一事实的猜测......


另一个编辑:值得注意的是,有损压缩格式如mp3,首先存储傅里叶域数据而不是时域数据。有点聪明,你可以节省一些繁重的计算......但是看看cobbal的深思熟虑的评论。

答案 6 :(得分:2)

准确的BPM检测非常困难。请参阅this stackoverflow question,以及我对它的回复。

答案 7 :(得分:2)

重新发布我的答案:简单的方法是让用户按节拍的节拍点击按钮,并计算点击次数除以时间。

答案 8 :(得分:2)

有几种方法可以获得BPM,但我发现最有效的方法是“节拍频谱”(描述 here )。 该算法通过将音乐的每个短样本与每个其他短样本进行比较来计算相似度矩阵。一旦计算出相似度矩阵,就可以获得每个时间间隔T的每个样本对{S(T); S(T + 1)}之间的平均相似度:这是拍频谱。拍频谱中的第一个高峰是节拍持续时间的大部分时间。最好的部分是你也可以做音乐结构或节奏分析等事情。

答案 9 :(得分:2)

其他人已经描述了一些节拍检测方法。我想补充说,有一些库可用于为这类任务提供技术和算法。

Aubio就是其中之一,它有着良好的声誉,它用C语言编写,带有C ++包装器,因此您可以轻松地将它与cocoa应用程序集成(Apple框架中的所有音频内容也都是用C语言编写的) / C ++)。

答案 10 :(得分:0)

这是free program将分析BPM并将其写入ID3V2标签。不知道有多好

答案 11 :(得分:-2)

我认为这对于4-4种舞蹈音乐来说是最简单的,因为应该有一次低频率的砰砰声大约两秒钟。