音乐识别与信号处理

时间:2010-01-14 23:21:38

标签: php python audio signal-processing audio-processing

我想构建类似于TunaticMidomi 的内容(如果您不确定他们做了什么,请尝试使用它们)我想知道我使用的算法是什么必须使用;我对这些应用程序的工作原理是这样的:

  1. 有一个包含多首歌曲的大型数据库
  2. 1中的每首歌曲。降低质量/比特率(例如64kbps)并计算声音“hash”
  3. 拥有您想要识别的音乐的声音/摘录
  4. 3中的歌曲。降低质量/比特率(再次为64kbps)并计算声音“hash”
  5. 如果 4。声音哈希在任何 2。声音哈希中返回匹配的音乐
  6. 我虽然因为环境噪音和编码差异而降低了质量/比特率。

    我是否在正确的轨道?任何人都可以向我提供任何特定文档或示例吗? Midori似乎甚至认出hum's,这真是令人印象深刻!他们是如何做到的?

    是否存在声音哈希或是我刚制作的东西?如果他们这样做,我该如何计算它们?更重要的是,如何查看child-hash 中是否有father-hash

    我如何使用Python(可能是内置模块)或PHP 构建类似的系统?

    非常感谢一些示例(最好是Python或PHP)。提前谢谢!

9 个答案:

答案 0 :(得分:11)

我从事音乐信息检索(MIR)的研究。关于音乐指纹识别的开创性论文是Haitsma和Kalker在2002 - 03年左右的开创性论文。谷歌应该得到它。

我早期(早在2000年之前)读过有关Shazam方法的白皮书。此时,他们只是基本上检测到了光谱时间峰值,然后对峰值进行了散列。我确信程序已经发展。

这两种方法都解决了信号级别的音乐相似性,即它对环境失真很有效。我不认为它适用于嗡嗡声查询(QBH)。然而,这是一个与不同(但相关)解决方案不同(但相关)的问题,因此您可以在文献中找到解决方案。 (这里的名字太多了。)

ISMIR程序可在线免费获取。你可以在那里找到有价值的东西:http://www.ismir.net/

我同意使用像Marsyas这样的现有库。取决于你想要什么。我认为Numpy / Scipy在这里是不可或缺的。简单的东西可以用Python自己编写。哎呀,如果你需要像STFT,MFCC这样的东西,我可以给你发电子邮件代码。

答案 1 :(得分:10)

我在一个很酷的框架的外围工作,实现了几种音乐信息检索技术。我几乎不是专家(编辑:实际上我与专家无关,只是为了澄清),但我可以说,快速傅里叶变换在这个地方使用了所有地方。傅立叶分析很古怪,但它的应用非常简单。基本上,当您在频域而不是时域中分析音频时,您可以获得大量有关音频的信息。这就是傅里叶分析给你的。

这可能与您想要做的事情有点不同。在任何情况下,项目中都有一些很酷的工具可供使用,以及查看核心库本身的源代码:http://marsyas.sness.net

答案 2 :(得分:4)

我最近将基于音频地标的指纹识别系统移植到Python:

https://github.com/dpwe/audfprint

它可以识别来自数千个轨道的参考数据库的小(5-10秒)摘录,并且对噪声和信道失真非常稳健。它使用局部光谱峰值的组合,类似于Shazam系统。

这只能匹配完全相同的音轨,因为它依赖于频率和时差的精细细节 - 它甚至不会匹配不同的拍摄,当然也不会覆盖版本或嗡嗡声。据我了解,Midomi / SoundHound的工作原理是将哼唱相互匹配(例如通过dynamic time warping),然后在哼唱组和预定的音乐曲目之间有一套人为策划的链接。

将嗡嗡声直接匹配到音乐曲目(“哼唱查询”)是音乐信息检索中一直存在的研究问题,但仍然非常困难。您可以查看去年在MIREX 2013 QBSH Results评估的一组系统的摘要。

答案 3 :(得分:3)

从音乐中提取的MFCC在查找歌曲之间的音色相似性方面非常有用。这通常用于查找类似的歌曲。正如darren指出的那样,Marsyas是一种工具,可以通过将MFCC转换为单个矢量表示来提取MFCC并找到类似的歌曲。

除了MFCC之外,Rhythm还用于查找歌曲的相似性。Mirex 2009

中提供的论文很少

这将为您提供对检测音乐相似性最有帮助的不同算法和功能的良好概述。

答案 4 :(得分:2)

MusicBrainz project维护着这样一个数据库。您可以根据指纹对其进行查询。

该项目已经存在了一段时间,并且过去使用过不同的指纹。有关列表,请参阅here

他们使用的最新指纹是AcoustId。有Chromaprint库(也有Python绑定),您可以在其中创建此类指纹。您必须提供原始PCM数据。

我最近在Python中编写了一个用于解码(使用FFmpeg)的库,并提供了生成AcoustId指纹(使用Chromaprint)和其他功能(也通过PortAudio播放流)的功能。请参阅here

答案 5 :(得分:1)

自从我上次进行信号处理以来已经有一段时间了,但是您应该查看频域表示(例如FFT或DCT),而不是下采样。然后你可以制作一个排序的哈希并搜索带有该序列的数据库歌曲。

棘手的部分正在快速进行这种搜索(也许一些关于基因搜索的论文可能会引起关注)。我怀疑iTunes还会​​检测一些工具来缩小搜索范围。

答案 6 :(得分:1)

我确实通过计算音频样本的短时傅立叶变换,读了一篇关于某种音乐信息检索服务(没有提到名字)的方法的论文。该算法然后在频域中挑选出“峰值”,即特别高幅度的时间位置和频率,并使用这些峰值的时间和频率来生成散列。事实证明,哈希在不同样本之间几乎没有碰撞,并且还能抵抗峰值信息中大约50%的数据丢失.......

答案 7 :(得分:1)

目前我正在使用ActionScript 3开发一个音乐搜索引擎。这个想法是首先分析和弦并标记帧(目前仅限于mp3文件),其中频率发生剧烈变化(旋律改变并忽略噪音)。之后我对输入声音做了同样的事情,并将结果与​​倒置文件匹配。匹配的一个确定匹配的歌曲。

对于Axel的方法,我认为你不应该担心这是一个歌唱还是只是哼唱,因为你没有实现语音识别程序。但我很好奇你使用哈希函数的方法。你能解释一下吗?

答案 8 :(得分:0)

对于通过哼唱功能进行查询,它比音频指纹识别解决方案更复杂,困难来自:

  • 如何在现实世界的应用中有效地收集旋律数据库?许多演示系统使用midi进行构建,但midi解决方案的成本对于公司来说是极其负担不起的。
  • 如何处理时间差异,例如,用户哼声可能快或慢。使用DTW?是的,DTW是一个非常好的解决方案,用于处理时间变化的时间序列,但它需要花费太多的CPU负载。
  • 如何制作时间序列索引?

这是一个通过哼唱开源项目https://github.com/EmilioMolina/QueryBySingingHumming的演示查询,可以作为参考。