使用 FFT 匹配两个音频文件 (Android Studio)

Matching two audio files using FFT (Android Studio)

过去几天我一直在开发我的应用程序的一部分,我需要同时播放和录制音频文件。我需要完成的任务只是比较录音与播放的音频文件和 return 匹配百分比。这是我到目前为止所做的以及我的问题的一些背景信息:

下面是我的几个问题:

我这样做的方式是否正确,还是我遗漏了什么?

在像 Shazam 这样的应用程序中,Midomi 音频匹配是使用称为 audio-fingerprinting 的技术完成的,该技术使用频谱图和散列法。

  • 你找到 FFT 的第一步是正确的,但是你需要在时间和频率之间制作一个称为频谱图的二维图。
  • 此频谱图数组包含超过百万个样本,我们无法处理这么多数据。所以我们找到了振幅的峰值。峰值将是一个(时间,频率)对,对应于在其周围 局部邻域 中最大的振幅值。峰值查找将是一个计算成本很高的过程,不同的应用程序或项目以不同的方式执行此操作。我们使用峰值是因为它们对背景噪音更不敏感。
  • 现在不同的歌曲可以有相同的峰值,但不同的是出现的顺序和时间的不同。所以我们将这些峰值组合成唯一的哈希值并将它们保存在数据库中。
  • 对您希望应用识别并从数据库中匹配的每个音频文件执行上述过程。虽然匹配并不简单,但也要考虑时间差,因为歌曲可以来自任何时刻,而且我们有完整歌曲的指纹。但这不是问题,因为指纹包含相对时间差。

这个过程比较详细,您可以在此 link http://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf

中找到更多解释

有些库可以为您完成 dejavu (https://github.com/worldveil/dejavu) 和 chromaprint(在 c++ 中)。 google 的 Musicg 在 java 中,但它在背景噪音下表现不佳。

匹配两个音频文件是一个复杂的过程,和上面的评论一样,我也会告诉你先在PC上试,然后在手机上试。