比较两个音频文件

Sas*_*gov 8 python audio mp3

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

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

atz*_*tzz 17

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

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

Python库:

  • PyMedia(第1步)
  • NumPy(用于数据处理) - 另请参阅本文以获取一些介绍性信息

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

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


Ben*_*enG 6

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

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

我没有针对您的程序化解决方案,但这是 YouTube Audio ID系统进行逆向工程的有趣尝试.它用于版权侵权检测,类似的问题.


tzo*_*zot 5

那个答案复制:

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

如果您更喜欢将其作为自己的项目进行,libofa可能会有所帮助。Python 包装器文档可能对您最有帮助。