有没有办法以编程方式比较两个声音文件以确定它们是否相同或几乎相同?这些不是 mp3 文件,也没有任何 ID3 或其他元数据,而是纯 wav 文件。比较校验和值可能不起作用,因为它们可能不完全相同。
4 回答
关于声学指纹的维基百科文章提到了许多产品,包括开源 libfooid。基本上,您正在考虑进入频域,在相对较少的频段(例如 32 个)上获取粗略的电平,为您提供一个代表 25 毫秒声音的字符串,对整个文件执行此操作,然后执行对不同文件的这些字符串进行模糊比较。这是相当复杂的,但需要做 - 比较实际样本不会让你得到任何结果,因为像音量变化几个百分比这样简单的事情会抛出整个匹配。
在计算机科学研究中,比较一组声音的相似性的过程称为基于内容的音频索引、检索和指纹识别。
一种方法是:
1) 对每个音频文件运行几位信号处理以提取特征,例如随时间变化的音高、频谱、自相关、动态范围、瞬态等。
2)将每个音频文件的所有特征放入一个多维数组中,并将每个多维数组转储到数据库中
3) 使用优化技术(例如梯度下降)在您的多维数据数据库中找到给定音频文件的最佳匹配。
使这项工作顺利进行的诀窍是哪些功能
有几个项目可以做这样的事情,包括MusicBrainz和EchoNest。
Echonest 拥有我在这个领域见过的最简单的 API之一。很容易上手。
PS 不,我不为 Echonest 工作,也不认识在那里工作的任何人。
您可以尝试的一件可以为您提供相当不错的文件指纹的方法是进行傅里叶变换并查看文件中存在的不同频率的分布。仍然很有可能制作两个具有相同傅立叶变换的非常不同的声音文件,但如果您的文件来自非人为的来源,这有点不太可能......
您可以逐个样本比较两个 WAV 文件,并计算每个样本的平均差异。为了加快速度,您可以使用相同的方法,但每 10 个样本或每 100 个样本进行比较并得出基本相同的值(两个不同甚至接近的文件将具有巨大的每个样本平均差异)。