如何在php中检测歌曲的BPM [关闭]


Answers:


42

在单个StackOverflow帖子中进行解释很难。通常,最简单的节拍检测算法通过定位易于检测的声能峰值来工作。更复杂的方法使用梳状滤波器和其他统计/波形方法。有关包括代码示例的详细说明,请查看此GameDev文章


5年后,GameDev文章不再显示404ツ(此外,根据web.archive.org/web/20120525085210/http://archive.gamedev.net/…,您可以经常使用webarchive.org )
耳机

您能从GameDev文章中向我解释一下吗?作者说让1024个样本大约为每秒500个(th?)秒。稍后他说44032个采样大约是1秒。但是,如果每0.05秒1024个样本等于每1秒20480个样本,我们如何得到它呢?有不同的频率吗?可以通过首先输入数字1024轻松找到该文本片段
。– Powercoder

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. 得分最高的代理商就是答案。

根据我的经验,此算法的缺点:

  • 峰值检测是临时性的,并且对阈值参数敏感。
  • 某些音乐在节拍上没有明显的起音。显然,它不适用于那些。
  • 很难知道如何解决60bpm-vs-120bpm问题,尤其是实时跟踪!
  • 仅使用一维光谱通量就可以丢弃很多信息。我认为您可以通过使用一些频带受限的频谱通量(也许还​​有一个宽带用于鼓)来做得更好。

是该算法的实时版本的演示,显示了频谱通量(底部的黑线)和起始点(绿色的圆圈)。值得考虑的事实是,节拍仅从绿色圆圈中提取。我已经像单击一样播放了发作,说实话,我认为我听不到它们的节拍,因此在某些方面,该算法比起节拍检测的人要好。我认为将这种低维信号减小是其薄弱的一步。

令人讨厌的是,几年前我确实找到了一个很好的站点,其中包含用于节拍检测的许多算法和代码。我完全没能拒绝它。

编辑:找到了!

这里有一些很棒的链接,可以帮助您入门:

http://marsyasweb.appspot.com/

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


难以为OSX目标构建Vamp插件。没有依赖项的探查,但具有darwin的os typedefs。将sdk切换到... / Developer / SDKs / iPhoneOS7.0.sdk之后,尝试使用make -f build / Makefile.osx来了解我的意思。
loretoparisi

22

节拍提取涉及音乐中认知度量结构的识别。通常,这些不对应于物理声能-例如,在大多数音乐中,都有一定程度的晕厥,这意味着我们感知到的“踩踏”拍不对应于物理声的存在。这意味着这与开始检测(物理声音的检测)完全不同,并且以不同的方式执行。

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

还有在线Echonest API,尽管这涉及将MP3上传到网站并检索XML,所以可能不太合适。

编辑:昨晚我遇到了-一个非常有前途的C / C ++库,尽管我自己没有使用过。鞋面插件


9

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

有许多不同的算法可以执行此操作,但是它们基本上都以“启动检测”为中心。

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

一旦获得节拍的时间本地化,便可以使用多种算法。您可以将其变成一个脉冲序列(创建一个始终为零的信号,仅在发生拍子时创建一个信号),然后对该信号应用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)博士,他在线上有斯坦福大学提供的免费机器学习讲座(不是冗长的视频讲座,实际上是在线远程课程)


9

如果您可以在项目中管理与python代码的接口,则Echo Nest Remix API是适用于python的漂亮API:

有一种方法analysis.tempo可以为您提供BPM。您可以从API文档或教程中看到,它比简单的BPM还要完成更多的工作


7

执行傅立叶变换,并找到功率谱中的峰值。您正在寻找低于20 Hz的人耳听力峰值。我猜通常在0.1-5ish Hz的范围内比较大。

这样的问题可能会有所帮助:Bpm音频检测库

另外,这是关于SO的几个“峰值发现”问题之一:测量信号的峰值检测


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


另一个编辑:值得注意的是,像mp3这样的有损压缩格式首先存储傅立叶域数据,而不是时域数据。稍微聪明一点,您就可以省去一些繁琐的工作……但请参阅cobbal的周到评论。


1
但是,mp3通过切断人耳听觉之外的频率来实现压缩。在这里,傅里叶可能不是正确的工具。
cobbal

1
MP3不会“砍掉”人类听觉以外的频率,它会分别对大约1毫秒宽的包络窗口执行余弦变换(与傅立叶变换有关)。我会在10秒钟的长窗户上尝试dmckee的第一个建议,然后看看结果如何。
TrayMan 2009年

这太简单了,无法真正发挥作用。
Timmmm 2013年


2

重新发布我的答案:最简单的方法是让用户按节奏按节奏敲击一个按钮,然后计算轻击次数除以时间。


2

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

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


2

有几种获取BPM的方法,但我发现最有效的一种是“拍谱”(在此介绍)。该算法通过将音乐的每个简短样本相互比较来计算相似度矩阵。一旦计算了相似度矩阵,就有可能获得每个时间间隔T的每个样本对{S(T); S(T + 1)}之间的平均相似度:这是拍谱。节拍频谱中的第一个高峰值在大多数情况下是节拍持续时间。最好的部分是您还可以执行音乐结构或节奏分析等操作。



-2

我猜想这将是4-4舞蹈音乐中最容易的,因为应该有一个低频震荡器,每秒约响两次。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.