比较两个音频文件

时间:2010-07-03 21:18:57

标签: python audio mp3

基本上,我有很多代表同一首歌的音频文件。然而,其中一些质量比原始质量差,有些被编辑到它们与原始歌曲不再匹配的地方。我想要做的是以编程方式将这些音频文件与原始文件进行比较,看看哪些与该歌曲匹配,无论质量如何。直接比较显然不起作用,因为文件的质量各不相同。

我相信这可以通过分析歌曲的结构并与原作进行比较来完成,但我对音频工程一无所知,所以这对我没有多大帮助。所有歌曲的格式相同(MP3)。另外,我正在使用Python,所以如果有绑定,那就太棒了;如果没有,JVM甚至本地库的东西也可以,只要它在Linux上运行,我就可以弄清楚如何使用它。

3 个答案:

答案 0 :(得分:17)

这实际上不是一项微不足道的任务。我不认为任何现成的库可以做到这一点。这是一种可能的方法:

  1. 将mp3解码为PCM。
  2. 确保PCM数据具有您预先选择的特定采样率(例如16KHz)。您需要重新采样具有不同采样率的歌曲。由于您无论如何都需要进行模糊比较,因此不需要高采样率,但过低的采样率会丢失太多细节。
  3. 归一化PCM数据(即找到最大样本值并重新调整所有样本,使得幅度最大的样本使用整个动态范围的数据格式,例如,如果样本格式为16位,则在归一化后最大幅度样本应具有值32767或-32767)。
  4. 将音频数据拆分为固定数量样本的帧(例如:每帧1000个样本)。
  5. 将每个帧转换为频谱域(FFT)。
  6. 计算代表两首歌曲的帧序列之间的相关性。如果相关性大于某个阈值,则假设歌曲相同。
  7. Python库:

    另外一个复杂因素。您的歌曲在开始时可能会有不同的沉默长度。因此,为了避免漏报,您可能需要一个额外的步骤:

    3.1。从头开始扫描PCM数据,直到声能超过预定阈值。 (例如,用10个样本的滑动窗口计算RMS,当它超过动态范围的1%时停止)。然后丢弃所有数据,直到这一点。

答案 1 :(得分:6)

首先,您必须更改您的比较域。分析未压缩文件中的原始样本将无处可寻。您的距离测量将基于您从音频样本中提取的一个或多个功能。维基百科列出了Acoustic Fingerprinting常用的以下功能:

  

音频指纹经常利用的感知特征包括平均过零率,估计速度,平均频谱,频谱平坦度,一组频段的突出音调和带宽。

我没有针对您的程序化解决方案,但这是interesting attempt对YouTube音频ID系统进行逆向工程。它用于版权侵权检测,类似的问题。

答案 2 :(得分:4)

that回复

复制

完全相同的问题是,旧的AudioScrobbler和目前在MusicBrainz的人们很久以前一直在努力。目前,可以帮助您完成任务的Python项目是Picard,它将使用GUID(实际上是其中几个)标记音频文件(不仅是MPEG 1第3层文件),然后从那时开始在,匹配标签非常简单。

如果您希望将其作为自己的项目,libofa可能会有所帮助。 documentation for the Python wrapper或许会对你有所帮助。