在过去的几天里,我一直在开发我的应用程序的一部分,我需要同时播放和录制一个音频文件。我需要完成的任务只是比较录音和播放的音频文件,并返回匹配的百分比。以下是我到目前为止所做的工作以及我的问题的一些背景:
目标api>15
我决定使用.wav音频文件格式来简化文件的解码
我用audiorecord录音,用mediaplayer播放音频文件
我创建了一个decider类,以便传递我的音频文件并将其转换为pcm,以便执行匹配分析
我使用以下规格的录音音频格式(单声道,16位,采样率=44100)
在我把音频文件传给解码器之后,我接着把它传给fft类,以便得到分析所需的频域数据。
下面是我的几个问题:
当我使用audiorecord录制音频时,默认的格式是pcm还是我需要如何指定?
我试图将记录传递给fft类,以便获取频域数据来执行匹配分析。有没有办法不把录音保存在用户的设备上?
对两个文件执行fft分析后,是否需要将数据存储在文本文件中以执行匹配分析?有哪些选择或可能的方法来做到这一点?
在做了大量的研究之后,我发现的所有来源都包括如何将录音与数据库中包含的歌曲/音乐进行匹配。我的目标是看看两个特定的音频文件匹配得有多紧密,我该怎么做我是否需要创建/使用哈希函数来实现我的目标?对此的详细回答将非常有用
目前我有一个单独的线程记录;用于解码音频文件的单独活动;fft分析的单独活动。我计划在单独的线程或异步任务中运行匹配分析。你认为这种结构是最佳的还是有更好的方法?另外,我应该在单独的线程中将音频文件传递给解码器,还是可以在录制线程或匹配分析线程中进行?
在进行匹配比较之前,是否需要对音频文件执行窗口操作?
我需要解码.wav文件还是直接比较2个.wav文件?
在比较之前,我是否需要对音频文件执行低音操作?
为了进行匹配比较,我到底需要生成哪些数据(功率谱、能谱、谱图等)?
我是不是走对了路,还是错过了什么?
1条答案
按热度按时间pb3s4cty1#
在像shazam这样的应用程序中,midomi音频匹配是使用一种叫做音频指纹的技术来完成的,这种技术使用频谱图和散列。
找到fft的第一步是正确的,但接下来需要在时间和频率之间绘制一个2d图,称为频谱图。
这个光谱图阵列包含超过百万个样本,我们无法处理这么多数据。所以我们找到了振幅的峰值。峰值将是(时间、频率)对,对应于在其周围的局部邻域中最大的振幅值。峰值发现将是一个计算成本很高的过程,不同的应用程序或项目以不同的方式实现这一点。我们使用峰值是因为它们对背景噪声更不敏感。
现在不同的歌曲可以有相同的峰值,但不同的将是顺序和发生的时间差。所以我们将这些峰值组合成唯一的散列并保存在数据库中。
对您希望应用程序识别并匹配数据库中的每个音频文件执行上述过程。虽然匹配并不简单,但也要考虑时间差,因为歌曲可以从任何瞬间发出,而且我们有完整歌曲的指纹。但这不是一个问题,因为指纹包含相对时间差。
这是一个比较详细的过程,你可以在这个链接中找到更多的解释http://www.ee.columbia.edu/~dpwe/papers/wang03-shazam.pdf
有一些图书馆可以帮你做这件事(https://github.com/worldveil/dejavu)和chromaprint(在c++中)。google的musicg是java语言,但是它在背景噪声中表现得不好。
匹配两个音频文件是一个复杂的过程,像上面的评论一样,我也会告诉你先在pc上试,然后在手机上试。