基本上,我有很多代表同一首歌的音频文件。然而,有些歌曲的质量比原曲差,有些经过编辑,与原曲不再相符。我想做的是以编程方式将这些音频文件与原始音频文件进行比较,看看哪些音频文件与该歌曲匹配,无论质量如何。直接比较显然行不通,因为文件的质量各不相同。
我相信这可以通过分析歌曲的结构并与原曲进行比较来完成,但我对音频工程一无所知,所以这对我没有多大帮助。所有歌曲的格式相同(MP3)。另外,我正在使用 Python,所以如果有它的绑定,那就太棒了;如果没有,那么适用于 JVM 甚至本地库的东西也可以,只要它在 Linux 上运行并且我可以弄清楚如何使用它。
这实际上不是一项微不足道的任务。我认为没有任何现成的图书馆可以做到这一点。这是一种可能的方法:
- 将 mp3 解码为 PCM。
- 确保 PCM 数据具有您事先选择的特定采样率(例如 16KHz)。您需要对具有不同采样率的歌曲进行重新采样。不需要高采样率,因为无论如何您都需要模糊比较,但太低的采样率会丢失太多细节。
- 归一化 PCM 数据(即找到最大样本值并重新调整所有样本,以便具有最大幅度的样本使用数据格式的整个动态范围,例如,如果样本格式为有符号 16 位,则归一化后最大振幅样本应具有值 32767 或 -32767 )。
- 将音频数据分割成固定数量样本的帧(例如:每帧 1000 个样本)。
- 将每一帧转换为谱域(FFT).
- 计算代表两首歌曲的帧序列之间的相关性。如果相关性大于某个阈值,则假设歌曲是相同的。
Python 库:
-
PyMedia(对于步骤 1)
-
NumPy(用于数据处理)--另见本文一些介绍性信息
一个额外的并发症。您的歌曲在开始时可能会有不同长度的静音。因此,为了避免漏报,您可能需要执行额外的步骤:
3.1.从头开始扫描 PCM 数据,直到声能超过预定义的阈值。 (例如,使用 10 个样本的滑动窗口计算 RMS,并在超过动态范围的 1% 时停止)。然后丢弃直到此时的所有数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)