【发布时间】: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