音乐识别与信号处理
我想要做一个类似于 Tunatic 或 Midomi 的东西(如果你不太明白它们是干嘛的,可以去试试)我在想我需要用什么算法;我对这些应用的工作原理的想法大概是这样的:
- 有一个包含很多歌曲的大数据库
- 对1.中的每首歌降低音质/比特率(比如降到64kbps),然后计算出声音的“哈希值”
- 有你想要识别的音乐的声音片段
- 对3.中的歌曲同样降低音质/比特率(再降到64kbps),并计算出声音的“哈希值”
- 如果4.的声音哈希值在2.的任何声音哈希值中找到,就返回匹配的音乐
我想到要降低音质/比特率是因为环境噪音和编码的差异。
我这样想对吗?有没有人能给我一些具体的文档或例子? Midomi似乎甚至能识别哼唱
,这真是太厉害了!他们是怎么做到的?
声音哈希值存在吗,还是我自己想出来的?如果存在,我该怎么计算它们?更重要的是,我该如何检查子哈希
是否在父哈希
中?
我该如何用Python(也许是内置模块)或PHP来构建一个类似的系统?
如果能给一些例子(最好是Python或PHP的),我会非常感激。提前谢谢!
9 个回答
我最近把我的音频基于地标的指纹识别系统移植到了Python上:
https://github.com/dpwe/audfprint
这个系统可以从一个包含成千上万首曲目的参考数据库中识别出小段(5-10秒)的音频片段,并且对噪音和信号失真有很强的抵抗力。它使用了一些局部的频谱峰值组合,这和Shazam系统的原理类似。
不过,这个系统只能匹配完全相同的曲目,因为它依赖于频率和时间差的细微细节——它甚至无法匹配不同的录音版本,更别提翻唱或哼唱了。根据我的理解,Midomi/SoundHound的工作原理是通过相互匹配哼唱(例如,使用动态时间规整),然后有一套人工整理的链接,把一组哼唱和对应的音乐曲目连接起来。
直接将哼唱与音乐曲目匹配(“通过哼唱查询”)是音乐信息检索中的一个持续研究问题,但仍然相当困难。你可以查看去年在MIREX 2013 QBSH结果中评估的一些系统的摘要。
我在做音乐信息检索(MIR)方面的研究。关于音乐指纹识别的经典论文是Haitsma和Kalker在2002-03年左右写的那篇。你可以在谷歌上找到它。
我读过一篇很早的白皮书(真的很早,2000年之前)关于Shazam的方法。那时候,他们主要是检测声音的频谱峰值,然后对这些峰值进行哈希处理。我相信这个过程现在已经发展了很多。
这两种方法都是从信号层面来处理音乐的相似性,也就是说,它们对环境的干扰是比较强的。不过,我觉得这种方法不太适合用来根据哼唱来查询(QBH)。不过,这属于一个不同但相关的问题,解决方案也不同但又有联系,所以你可以在相关文献中找到解决方案。(这里不方便一一列举。)
ISMIR的会议论文集可以在网上免费获取。你可以在这里找到有价值的资料:http://www.ismir.net/
我同意使用像Marsyas这样的现有库。这要看你想要什么。我觉得Numpy和Scipy是必不可少的。简单的东西可以用Python自己写。如果你需要像STFT、MFCC这样的东西,我可以给你发代码。
我曾经参与过一个很酷的框架,这个框架实现了几种音乐信息检索的技术。我并不是专家(其实我离专家还远着呢,想澄清一下),但我知道快速傅里叶变换在这方面用得非常广泛。傅里叶分析听起来有点复杂,但它的应用其实很简单。基本上,当你从频率的角度分析音频时,你能获取到很多信息,而不是仅仅从时间的角度去看。这就是傅里叶分析的作用。
这可能和你想做的事情有点偏离。不过,无论如何,这个项目里有一些很酷的工具可以玩,还有核心库的源代码可以查看:http://marsyas.sness.net