在两个压缩的音频文件中查找匹配的内容

Find matching content in two compressed audio files

我正在尝试查找两个音频文件中任何匹配内容的时间范围。使用示例是:

我有两个从电视节目中删除的 mp3 文件。在电视节目开始时,他们有一个 "previously on" 回顾,然后是节目的主题曲,然后是实际节目。

重述部分时长不定,但主题曲始终如一。由于整个文件的压缩,比较字节时可能不相同。

我的目标是比较节目的两个 mp3 文件,找到共同的主题曲并获得它的时间范围,这样就可以知道节目的实际内容从哪里开始。

文件中也有可能存在多个常见匹配项,例如两部电视剧都有广告,能找到也不错

我会在 iOS 做这件事。

我应该研究什么,傅立叶变换?

在另一个信号(音频或其他)中查找信号(音频或其他)的传统方法是使用 a cross correlation,而执行此操作的有效方法是在频域中,其中昂贵的 O(n^2) 矩阵乘法天真的方法变成了 O(n) 复数共轭乘法。

在 iOS 上,您可以使用 Accelerate 框架来实现这一点,调用

  • vDSP_fft_zrip 将您的每个音频文件转换到频域
  • vDSP_zvcmul 将结果信号相乘
  • vDSP_fft_zrip将乘积变换回时域

此最终结果中最大绝对值的索引为您提供了一个信号与另一个信号的最佳匹配的时滞。

这个答案掩盖了很多细节,包括打包(使乘法复杂化)、信号填充、将 mp3 解码为信号处理功能期望的 float/double 格式、将立体声扁平化为单声道,以及将互相关分解为更小的重叠块,因为您可能不想将整个电视节目音频加载到内存中。

很抱歉。我很想编写一个小型开源库来执行此操作。像这样的答案相当于 100 个答案。