Java:比较两个音频文件,看它们是否是相同的“音乐”

我正在研究音乐流媒体服务,我遇到了一个问题:如何比较两个音频文件,看它们是否代表同一首歌。 这些文件可能没有相同的扩展名(例如OGG,mp3,wma)但可能仍然是同一首歌,并且它们可能具有不同的比特率和音量级别。

搜索“音频指纹识别”。 可能的解决方案可能是此库或本文 。

我查看了Google的开源lib musicg API: http : //code.google.com/p/musicg/

它是Java并提供两个音频文件的相似度量。

您可以使用开源echoprint

基本上,您将生成本地歌曲的指纹,并将其与歌曲数据库(如果找到)进行比较。

如果要比较两首歌曲,您需要做的是使用第一首歌曲创建本地数据库,然后尝试匹配您自己数据库中的第二首歌曲。 如果找到它,意味着它们是相同的。

请注意,“成为同一首歌”的概念很棘手。 实际上,指纹的作用是比较歌曲的许多部分,试图匹配这些部分。 这意味着即使您对音频有干扰(如人们说话,背景噪音等),您也可以匹配一首歌曲,因为大多数音频都与原始音频相似。

有一篇论文解释了echoprint如何在细节上工作

对于这样的事情(因为我做了一些音频产生),你需要某种算法来执行频谱分析(可能使用FFT – 快速傅立叶变换)。
在这里查看这个问题 。