【问题标题】:Matching two audio files using FFT (Android Studio)使用 FFT (Android Studio) 匹配两个音频文件
【发布时间】:2017-01-04 04:47:48
【问题描述】:

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

  • 目标 API >15

  • 我决定使用 .wav 音频文件格式来简化文件解码

  • 我使用 AudioRecord 进行录制,使用 MediaPlayer 播放音频文件
  • 我创建了一个判定器类来传递我的音频文件并将其转换为 PCM 以执行匹配分析
  • 我正在使用以下规格来录制 AudioFormat (CHANNEL_MONO, 16 BIT, SAMPLE_RATE = 44100)
  • 将音频文件传递给解码器后,我继续将其传递给 FFT 类,以获得分析所需的频域数据。

以下是我的几个问题:

  • 当我使用 AudioRecord 录制音频时,默认格式是 PCM 还是我需要如何指定?
  • 我正在尝试将记录传递给 FFT 类,以获取频域数据以执行我的匹配分析。有没有办法在不将录音保存在用户设备上的情况下做到这一点?
  • 对两个文件执行 FFT 分析后,是否需要将数据存储在文本文件中才能执行匹配分析?有哪些选择或可能的方法来做到这一点?
  • 经过大量研究后,我发现的所有来源都涵盖了如何将录音与数据库中包含的歌曲/音乐进行匹配。我的目标是查看两个特定音频文件的匹配程度,我将如何处理? - 我需要创建/使用散列函数来实现我的目标吗?对此的详细答案将非常有帮助
  • 目前我有一个单独的线程用于录制;用于解码音频文件的单独活动; FFT 分析的单独活动。我计划在单独的线程或 AsyncTask 中运行匹配分析。您认为这种结构是最优的还是有更好的方法来做到这一点?另外,我应该在单独的线程中将我的音频文件传递给解码器,还是可以在录制线程或 MatchingAnalysis 线程中进行?
  • 在进行匹配比较之前,我是否需要在对音频文件的操作中执行窗口化?
  • 我需要解码 .wav 文件还是可以直接比较 2 个 .wav 文件?
  • 在比较之前是否需要对音频文件执行低调操作?
  • 为了执行匹配比较,我需要生成哪些数据(功率谱、能量谱、频谱图等)?

我这样做是正确的还是我错过了什么?

【问题讨论】:

  • 你听不见了。在您考虑尝试在移动设备上执行此操作之前,您需要开发一种算法,该算法可以在桌面计算机上运行时处理两个波形文件时做得很好。例如,考虑如何处理两个相同的文件(在现实世界中你永远不会发现,只是为了论证),它们的区别仅在于未知的延迟。您最好相信 Android 音频堆栈会插入延迟!现在考虑延迟、噪声和不同频率响应的组合。现在添加房间回声......
  • @ChrisStratton 我想延迟可以通过添加滑动窗口或修剪/截断两个信号以使其持续时间匹配来解决,对吗?或者也许使用哈希函数可以让我们忽略时间延迟?
  • 收集一组测试数据记录,写一些算法,想办法给它们打分。除了将其用于数据收集(手机麦克风与计算机麦克风不同)之外,在测试环境中取得良好结果之前,甚至不要触摸移动设备。
  • @ChrisStratton 我假设我正在使用手机录制音频并将其保存为 .wav 文件?我完成了你所说的,然后呢?
  • @ChrisStratton 我将如何为他们评分?我应该使用能谱密度进行评分吗?

标签: java android android-studio audio audio-fingerprinting


【解决方案1】:

在 Shazam 等应用中,Midomi 音频匹配是使用称为音频指纹的技术完成的,该技术使用频谱图和散列。

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

有点详细的过程,你可以在这个链接http://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf找到更多解释

有一些库可以为你做 dejavu (https://github.com/worldveil/dejavu) 和 chromaprint (它在 c++ 中)。 google 的 Musicg 是用 java 编写的,但它在背景噪音方面表现不佳。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多