gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:34:56 27 4
gpt4 key购买 nike

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

  • 目标API >15

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

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

下面是我的几个问题:

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

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

最佳答案

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

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

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

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

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

关于java - 使用 FFT (Android Studio) 匹配两个音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41456372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com