我想在两段音频之间进行某种距离测量。例如,我想将动物的声音与模仿该动物的人类声音进行比较,然后返回声音相似程度的分数。
这似乎是一个难题。处理它的最佳方法是什么?我正在考虑从音频信号中提取几个特征,然后对这些特征进行欧几里得距离或余弦相似度(或类似的东西)。什么样的特征易于提取并有助于确定声音之间的感知差异?
(我在某处看到 Shazam 使用散列,但这是一个不同的问题,因为被比较的两段音频基本相同,但一个有更多噪音。这里,两段音频不一样,它们只是感知上的相似的。)
我想在两段音频之间进行某种距离测量。例如,我想将动物的声音与模仿该动物的人类声音进行比较,然后返回声音相似程度的分数。
这似乎是一个难题。处理它的最佳方法是什么?我正在考虑从音频信号中提取几个特征,然后对这些特征进行欧几里得距离或余弦相似度(或类似的东西)。什么样的特征易于提取并有助于确定声音之间的感知差异?
(我在某处看到 Shazam 使用散列,但这是一个不同的问题,因为被比较的两段音频基本相同,但一个有更多噪音。这里,两段音频不一样,它们只是感知上的相似的。)
在计算机科学研究中,比较一组声音的相似性的过程称为基于内容的音频索引、检索和指纹识别。
一种方法是:
对每个音频文件运行几位信号处理以提取特征,例如随时间变化的音高、频谱、自相关、动态范围、瞬态等。
将每个音频文件的所有特征放入一个多维数组中,并将每个多维数组转储到数据库中
使用优化技术(例如梯度下降)在多维数据数据库中找到给定音频文件的最佳匹配。
使这项工作顺利进行的诀窍是选择哪些功能。自动执行此操作并获得良好结果可能会很棘手。Pandora的人在这方面做得非常好,在我看来,他们拥有最好的相似度匹配。不过,他们通过让人们听音乐并以许多不同的方式对它们进行评分,来手工编码他们的向量。有关更多信息,请参阅他们的音乐基因组项目和音乐基因组项目列表属性。
对于自动距离测量,有几个项目可以做这样的事情,包括marsysas、MusicBrainz和EchoNest。
Echonest 拥有我在这个领域见过的最简单的 API之一。很容易上手。
我建议研究频谱分析。虽然这并不像您最想要的那样简单,但我希望将音频分解为其基础频率将提供一些非常有用的数据进行分析。看看这个链接
Your first step will definitely be taking a Fourier Transform(FT) of the sound waves. If you perform an FT on the data with respect to Frequency over Time1, you'll be able to compare how often certain key frequencies are hit over the course of the noise.
Perhaps you could also subtract one wave from the other, to get a sort of stepwise difference function. Assuming the mock-noise follows the same frequency and pitch trends2 as the original noise, you could calculate the line of best fit to the points of the difference function. Comparing the best fit line against a line of best fit taken of the original sound wave, you could average out a trend line to use as the basis of comparison. Granted, this would be a very loose comparison method.
- 1. hz/ms, perhaps? I'm not familiar with the unit magnitude being worked with here, I generally work in the femto- to nano- range.
- 2. So long as ∀ΔT, ΔPitch/ΔT & ΔFrequency/ΔT are within some tolerance x.
- Edited for formatting, and because I actually forgot to finish writing the full answer.