【问题标题】:Comparing sound files if not completely identical比较声音文件(如果不完全相同)
【发布时间】:2025-12-20 03:45:11
【问题描述】:

有没有办法以编程方式比较两个声音文件以确定它们是否相同或几乎相同?这些不是 mp3 文件,也没有任何 ID3 或其他元数据,而是纯 wav 文件。比较校验和值可能不起作用,因为它们可能不完全相同。

【问题讨论】:

    标签: comparison audio


    【解决方案1】:

    wikipedia article on acoustic fingerprinting 提到了许多产品,包括开源 libfooid。基本上,您正在考虑进入频域,在相对较少的频段(例如 32 个)上获取粗略的电平,为您提供一个代表 25 毫秒声音的字符串,对整个文件执行此操作,然后执行对不同文件的这些字符串进行模糊比较。它相当复杂,但需要做 - 比较实际样本不会让您有任何收获,因为像音量变化几个百分比这样简单的事情会导致整个匹配失败。

    【讨论】:

    • 良好的链接。 OQ 似乎表明文件可能相同或几乎相同,这表明逐个样本的比较是可行的。
    【解决方案2】:

    比较一组声音的相似性的过程在计算机科学研究中称为基于内容的音频IndexingRetrievalFingerprinting

    这样做的一种方法是:

    1) 对每个音频文件运行几位信号处理以提取特征,例如随时间变化的音高、频谱、自相关、动态范围、瞬态等。

    2) 将每个音频文件的所有特征放入一个多维数组中,并将每个多维数组转储到数据库中

    3) 使用优化技术(例如gradient descent)在您的多维数据数据库中找到给定音频文件的最佳匹配。

    使这项工作顺利进行的诀窍在于哪些功能

    有几个项目可以做这样的事情,包括MusicBrainzEchoNest

    Echonest 拥有我在这个领域见过的simplest APIs 之一。很容易上手。

    附:不,我不为 Echonest 工作,我也不认识在那里工作的任何人。

    【讨论】:

      【解决方案3】:

      您可以尝试的一件事会给您一个相当不错的文件指纹,那就是获取Fourier transform 并查看文件中存在的不同频率的分布。仍然很有可能制作两个具有相同傅立叶变换的非常不同的声音文件,但如果您的文件来自非人为的来源,这有点不太可能......

      【讨论】:

      • 所以比较文件我发现 2 ffts 之间的相关性? (假设这会给我不那么准确的结果)
      【解决方案4】:

      您可以逐个样本比较两个 WAV 文件,并计算每个样本的平均差异。为了加快速度,您可以使用相同的方法,但每 10 个样本或每 100 个样本进行比较并得出基本相同的值(两个不同甚至接近的文件将具有巨大的每个样本平均差异)。

      【讨论】:

      • 如果一个文件的前面添加了 1 秒的静音,则此方法不起作用,但其他方面相同。
      • 您需要添加模式识别,并在检查样本之前尝试将它们暂时对齐
      • 我同意这两点,但这将这个问题从简单的领域带到了极其复杂的领域。