音乐识别和信号处理

14

我想要建立一个类似于TunaticMidomi的东西(如果您不确定它们是做什么的,请尝试使用它们),我想知道我需要使用哪些算法;我对此类应用程序的工作原理的想法如下:

  1. 有一个大型数据库包含多个歌曲
  2. 对于1.中的每首歌曲,降低质量/比特率(例如降至64kbps)并计算声音“哈希”
  3. 有您想要识别的音乐的声音/摘录
  4. 对于3.中的歌曲,再次降低质量/比特率(再次降至64kbps)并计算声音“哈希”
  5. 如果4.中的声音哈希在任何2.中的声音哈希中,则返回匹配的音乐

我考虑降低质量/比特率是由于环境噪声和编码差异。

我在这条路上吗?有人能提供给我任何具体的文档或示例吗?Midori甚至可以识别“嗡嗡声”,这真的很令人印象深刻!他们是如何做到的?

是存在声音哈希还是我只是编造了它?如果存在,我该如何计算它们?更重要的是,我该如何检查child-hash是否在father-hash

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

一些示例(最好是Python或PHP)将不胜感激。谢谢!


1
相关问题:声音样本识别库/代码开源的声纹指纹?。来自MusicBrainz的好的维基概述 - Albert
这是Python的一个很好的选择:https://github.com/worldveil/dejavu - lollercoaster
9个回答

11

我从事音乐信息检索 (MIR) 的研究。关于音乐指纹识别的经典论文是 Haitsma 和 Kalker 在 2002-03 年左右发表的那篇。你可以通过 Google 找到它。

我曾经阅读一份早期(真的很早期;在 2000 年之前)关于 Shazam 方法的白皮书。当时,他们只是基本地检测了频谱时间峰值,然后对这些峰值进行哈希。我肯定这个过程已经得到改进。

这两种方法都解决了信号级别的音乐相似性问题,即它能够抵抗环境干扰。但是,我认为它对于哼唱查询 (QBH) 的效果并不好。然而,这是一个不同(但相关)的问题,并有着不同(但相关)的解决方案,因此你可以在文献中找到解决方案。(这里就不一一列举了。)

ISMIR 的会议记录可在网上免费获取。你可以在那里找到有价值的东西:http://www.ismir.net/

我赞成使用像 Marsyas 这样的现有库。这取决于你的需求。我认为 Numpy/Scipy 在这里是必不可少的。简单的东西可以自己写 Python 代码。如果你需要 STFT、MFCC 等东西,我可以通过电子邮件给你提供代码。


1
我知道我忘了什么:在音符级别上的相似性通常是通过计算色度图来实现的。对于每个时间帧,您需要计算信号中有多少C、C#、D、D#、...、A#、B。因此,色度图的维度为12乘以时间。许多相似性方法都使用这种方法。 - Steve Tjoa
谢谢您的输入。您可以通过电子邮件将代码发送给我吗?我正在努力尝试解决这个问题,一些示例代码会很有帮助。 - Alix Axel
@Steve Tjoa,能否检测哨声? - pankaj asudani

10

我曾在一个实现多个音乐信息检索技术的酷炫框架的边缘工作过。虽然我不是专家(编辑说明:实际上我离专家差得远呢,只是想澄清一下),但我知道在这方面,快速傅里叶变换被广泛应用。傅里叶分析有些奇怪,但其应用相当简单明了。基本上,如果你在频域而非时域对音频进行分析,可以获得很多关于其信息的数据。这就是傅里叶分析给你的。

这可能与您想要做的事情有点偏题。无论如何,该项目中有一些很酷的工具供您使用,以及查看核心库本身的源代码:http://marsyas.sness.net


如何检测是否有人向iPhone麦克风吹口哨? - pankaj asudani

5

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

https://github.com/dpwe/audfprint

它可以识别来自数万首曲目的参考数据库中的小片段(5-10秒),并且对噪声和信道失真非常鲁棒。它使用局部谱峰的组合,类似于Shazam系统。

这只能匹配完全相同的曲目,因为它依赖于频率和时间差异的细节 - 它甚至不会匹配不同的版本,肯定也不会匹配翻唱或哼唱。据我所知,Midomi / SoundHound通过将哼唱与彼此匹配(例如通过动态时间扭曲),然后有一组人工策划的链接将一组哼唱与预期的音乐曲目联系起来。

直接将哼唱与音乐曲目匹配(“按哼唱查询”)仍然是音乐信息检索中的一个正在进行的研究问题,但相当困难。您可以在MIREX 2013 QBSH Results中查看去年评估的一组系统的摘要。


3
从音乐中提取的MFCC对于发现歌曲之间的音色相似性非常有用。这通常用于查找相似的歌曲。正如Darren所指出的那样,Marsyas是一个工具,可以用来提取MFCC并通过将MFCC转换为单个向量表示来查找相似的歌曲。
除了MFCC之外,节奏也被用来发现歌曲的相似性。在Mirex 2009中有几篇论文介绍了不同的算法和特征,这些算法和特征对于检测音乐相似性非常有帮助。

2

MusicBrainz项目维护着这样的一个数据库。你可以基于指纹对它进行查询。

该项目已经存在一段时间了,并且过去使用过不同的指纹。请查看此处以获取列表。

他们正在使用最新的指纹AcoustId。有Chromaprint库(也带有Python绑定),您可以使用它创建这样的指纹。您必须提供原始PCM数据。

我最近用Python编写了一个库,它可以解码(使用FFmpeg)并提供生成AcoustId指纹(使用Chromaprint)和其他函数的功能(还可以通过PortAudio播放流)。请看此处


1

我已经有一段时间没有进行信号处理了,但是与其进行下采样,不如看看频域表示(例如FFT或DCT)。然后,您可以制作某种哈希并搜索具有该序列的数据库歌曲。

棘手的部分是使此搜索快速(也许一些关于基因搜索的论文可能会引起兴趣)。我怀疑iTunes也会检测乐器以缩小搜索范围。


1

我曾经读过一篇关于某个音乐信息检索服务(不点名)的方法的论文——通过对音频样本进行短时傅里叶变换的计算。然后,该算法会在频域中挑选出“峰值”,即特别高幅度的时间位置和频率,并使用这些峰值的时间和频率生成哈希。结果发现,哈希在不同样本之间有惊人地少的冲突,并且还能够抵御高达50%的峰值信息数据丢失......


1

目前我正在使用ActionScript 3开发一款音乐搜索引擎。首先分析和标记和弦(目前仅限于mp3文件),在频率发生剧烈变化的帧(旋律变化并忽略噪声)处进行标记。然后对输入音频执行相同的操作,并将结果与反转文件匹配。匹配的结果确定匹配的歌曲。

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


0

对于通过哼唱查询的功能,它比音频指纹解决方案更为复杂,难点在于:

  • 如何在实际应用中高效地收集旋律数据库?许多演示系统使用MIDI进行构建,但MIDI解决方案的成本对于公司来说极其不可承受。
  • 如何处理时间变化,例如用户哼唱可能快或慢。使用DTW?是的,DTW是处理具有时间变化的时间序列的非常好的解决方案,但它会消耗太多的CPU负载。
  • 如何制作时间序列索引?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接