我试图找到两个音频文件中任何匹配内容的时间范围。使用的一个例子是:
我从电视节目中删除了两个mp3文件。在电视节目开始时,他们有一个“以前在”的回顾,然后是节目的主题曲,然后是实际节目。
回顾部分的长度可变,但主题曲调始终相同。由于整个文件的压缩,在比较字节时可能不一样。
我的目标是比较节目的两个mp3文件,找到共同的主题曲调并获取它的时间范围,以便可以知道节目的实际内容的开始位置。
文件中也可能存在多个常见匹配,例如:两个电视节目中的广告,也可以找到这些广告。
我将在iOS上这样做。
我应该考虑哪些事情,傅里叶变换?
答案 0 :(得分:2)
在另一个信号中找到信号(音频或其他信号)的传统方法是使用a cross correlation,并且执行此操作的有效方法是在频域中,其中昂贵的O(n ^ 2)矩阵乘法朴素方法成为O(n)复共轭倍增。
在iOS上,您可以使用Accelerate
框架来实现此目的,通过调用
vDSP_fft_zrip
将您的每个音频文件转换为频域vDSP_zvcmul
将结果信号相乘vDSP_fft_zrip
将产品转换回时域最终结果中最大绝对值的索引给出了一个信号在另一个信号中最佳匹配的时间滞后。
这个答案掩盖了许多细节,包括打包(使乘法复杂化),信号填充,将mp3解码为信号处理功能所期望的浮点/双精度格式,将立体声扁平化为单声道,以及打破互相关因为你可能不希望将整个电视节目音频加载到内存中,所以可以分成较小的重叠块。
很抱歉。我喜欢写一个小型的开源库来做到这一点。这就像这一个值得100个答案。