14

我想构建类似于TunaticMidomi的东西(如果您不确定它们的作用,请尝试它们)并且我想知道我必须使用哪些算法;我对此类应用程序的工作原理的想法是这样的:

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

由于环境噪声和编码差异,我认为会降低质量/比特率。

我在正确的轨道上吗?谁能给我提供任何具体的文档或示例?Midori 似乎甚至认出hum's了,这真是令人印象深刻!他们是怎么做到的?

声音散列是否存在或者是我刚刚编造的?如果他们这样做,我该如何计算它们?更重要的是,我如何检查是否child-hashfather-hash

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

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

4

9 回答 9

11

我从事音乐信息检索(MIR)方面的研究。关于音乐指纹的开创性论文是 Haitsma 和 Kalker 在 2002-03 年左右发表的一篇。谷歌应该给你它。

我阅读了一份关于 Shazam 方法的早期(非常早期;在 2000 年之前)白皮书。那时,他们基本上只是检测到光谱时间峰值,然后对峰值进行哈希处理。我确信该程序已经发展。

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

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

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

于 2010-01-15T15:20:28.073 回答
10

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

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

于 2010-01-14T23:27:41.987 回答
5

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

https://github.com/dpwe/audfprint

它可以从包含数十万条轨道的参考数据库中识别小的(5-10 秒)片段,并且对噪声和通道失真具有相当的鲁棒性。它使用局部光谱峰值的组合,类似于 Shazam 系统。

这只能匹配完全相同的音轨,因为它依赖于频率和时间差异的精细细节——它甚至不匹配不同的镜头,当然不包括版本或嗡嗡声。据我了解,Midomi/SoundHound 的工作原理是相互匹配嗡嗡声(例如通过动态时间扭曲),然后在一组嗡嗡声和预期的音乐轨道之间建立一组人工策划的链接。

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

于 2014-06-06T18:09:31.350 回答
3

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

除了 MFCC,Rhythm 还用于查找歌曲相似度。在Mirex 2009上发表的论文很少

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

于 2010-01-14T23:40:51.310 回答
2

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

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

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

我最近用 Python 编写了一个库,它进行解码(使用 FFmpeg)并提供生成 AcoustId 指纹(使用 Chromaprint)和其他东西(也可以通过 PortAudio 播放流)等功能。见这里

于 2012-11-10T16:20:49.007 回答
1

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

棘手的部分是使这种搜索速度更快(也许一些关于基因搜索的论文可能会引起人们的兴趣)。我怀疑 iTunes 也会对仪器进行一些检测以缩小搜索范围。

于 2010-01-14T23:30:43.630 回答
1

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

于 2010-01-14T23:53:59.973 回答
1

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

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

于 2010-01-17T13:56:53.830 回答
0

对于哼唱特征的查询,它比音频指纹解决方案更复杂,难点来自:

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

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

于 2015-09-15T04:02:20.310 回答