Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两个音频文件_Python_Audio_Mp3 - Fatal编程技术网

Python 比较两个音频文件

Python 比较两个音频文件,python,audio,mp3,Python,Audio,Mp3,基本上,我有很多代表同一首歌的音频文件。然而,其中一些歌曲的质量比原歌曲差,一些被编辑到与原歌曲不匹配的地方。我想做的是通过编程将这些音频文件与原始音频文件进行比较,看看哪些音频文件与那首歌相匹配,而不管质量如何。直接比较显然不起作用,因为文件的质量不同 我相信这可以通过分析歌曲的结构并与原作进行比较来实现,但我对音频工程一无所知,所以这对我帮助不大。所有歌曲的格式都相同(MP3)。而且,我正在使用Python,所以如果有它的绑定,那将是非常棒的;如果没有,JVM甚至本机库也可以,只要它在Lin

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


我相信这可以通过分析歌曲的结构并与原作进行比较来实现,但我对音频工程一无所知,所以这对我帮助不大。所有歌曲的格式都相同(MP3)。而且,我正在使用Python,所以如果有它的绑定,那将是非常棒的;如果没有,JVM甚至本机库也可以,只要它在Linux上运行,我就能知道如何使用它。

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

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


我没有针对您的编程解决方案,但这里有一个反向工程YouTube音频ID系统。它用于版权侵权检测,这是一个类似的问题。

这其实不是一个简单的任务。我认为任何现成的图书馆都做不到这一点。以下是一种可能的方法:

  • 将mp3解码为PCM
  • 确保PCM数据具有您事先选择的特定采样率(例如16KHz)。您需要对采样率不同的歌曲重新采样。高采样率不是必需的,因为您无论如何都需要模糊比较,但太低的采样率将丢失太多细节
  • 规范化PCM数据(即,找到最大样本值并重新缩放所有样本,以便最大振幅的样本使用数据格式的整个动态范围,例如,如果样本格式是有符号的16位,则在规范化后,最大振幅样本的值应为32767或-32767)
  • 将音频数据拆分为固定样本数的帧(例如:每帧1000个样本)
  • 将每个帧转换为频谱域()
  • 计算代表两首歌曲的帧序列之间的相关性。如果Correlation大于某个阈值,则假定歌曲相同
  • Python库:

    • (对于步骤1)
    • (用于数据处理)--另请参阅以获取一些介绍信息
    另一个并发症。您的歌曲在开始时可能会有不同长度的沉默。因此,为了避免误报,您可能需要额外的步骤:

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

    从应答复制:

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


    如果你喜欢把它作为自己的项目来做,可能会有所帮助。这也许对你的帮助最大。

    看看Shazam的工作原理:嗯,听起来不像我想象的那么简单。我最终使用了Picard,至少现在是这样。谢谢。:)PCM数据是字节数组,对吗?在步骤3中,由于我们需要高达32767的振幅,所以在进行规格化时,我相信您会将其转换为整数/双精度数组。如果我错了,请纠正我。此外,我们是否需要在步骤6中计算相关性?或者,如果我们只是比较fft值,看看它们是否在阈值范围内,会怎么样?@LINGS(3)假设步骤(1)中的PCM数据是适当类型的数组(例如int16或float32)。但是,如果所选解码器返回原始字节,那么是的,则需要一个转换步骤。请重新执行步骤(6):如果您的解决方案必须容忍噪声,那么简单的差异将不起作用,因为某些噪声(如咔嗒声或咔嗒声)会在FFT中造成很大的差异。不过,综合性差异可能会奏效。我不确定相关性是这里最好的比较方法,我没有像我可能应该做的那样研究它,但是当我实现类似的东西时,它工作正常。