两个音频序列之间的感知相似度

Posted

技术标签:

【中文标题】两个音频序列之间的感知相似度【英文标题】:Perceptual similarity between two audio sequences 【发布时间】:2011-03-11 16:27:35 【问题描述】:

我想测量两段音频之间的某种距离。例如,我想将动物的声音与模仿该动物的人类声音进行比较,然后返回声音相似程度的分数。

这似乎是一个难题。处理它的最佳方法是什么?我正在考虑从音频信号中提取几个特征,然后对这些特征进行欧几里得距离或余弦相似度(或类似的东西)。什么样的特征易于提取并有助于确定声音之间的感知差异?

(我在某处看到 Shazam 使用散列,但这是一个不同的问题,因为被比较的两段音频基本相同,但一个有更多噪音。这里,两段音频不一样,它们只是在感知上相似。)

【问题讨论】:

【参考方案1】:

比较一组声音的相似性的过程在计算机科学研究中称为基于内容的音频Indexing、Retrieval 和Fingerprinting。

这样做的一种方法是:

    对每个音频文件运行几位信号处理以提取特征,例如随时间变化的音高、频谱、自相关、动态范围、瞬态等。

    将每个音频文件的所有特征放入一个多维数组中,并将每个多维数组转储到数据库中

    使用优化技术(例如gradient descent)在您的多维数据数据库中找到给定音频文件的最佳匹配。

使这项工作顺利进行的诀窍在于选择哪些功能。自动执行此操作并获得良好结果可能会很棘手。 Pandora 的人在这方面做得很好,在我看来,他们拥有最好的相似度匹配。不过,他们通过让人们听音乐并以许多不同的方式对它们进行评分,来手工编码他们的向量。有关更多信息,请参阅他们的 Music Genome Project 和 List of Music Genome Project attributes。

对于自动距离测量,有几个项目可以执行此类操作,包括 marsysas、MusicBrainz 和 EchoNest。

Echonest 拥有我在这个领域见过的simplest APIs 之一。很容易上手。

【讨论】:

【参考方案2】:

我建议研究频谱分析。虽然这并不像您最想要的那样简单,但我希望将音频分解为其基础频率将提供一些非常有用的数据进行分析。看看这个link

【讨论】:

谢谢。我可以尝试生成一些不同声音的频谱,看看相似的声音是否会产生相似的频谱,而不同的声音不会。根据我对***链接的了解,必须使用傅里叶变换创建频谱?【参考方案3】:

您的第一步肯定是对声波进行Fourier Transform(FT)。如果您对频率随时间变化的数据执行 FT1,您将能够比较某些关键频率在噪声过程中被击中的频率。

也许您也可以从另一个波中减去一个波,以获得一种逐步差分函数。假设模拟噪声遵循与原始噪声相同的频率和音调趋势2,您可以计算出与差异函数点的最佳拟合线。将最佳拟合线与原始声波的最佳拟合线进行比较,您可以平均出一条趋势线作为比较的基础。当然,这将是一种非常松散的比较方法。

- 1.hz/ms,也许吧?我不熟悉这里使用的单位量级,我通常在飞到纳米范围内工作。

- 2. 只要∀ΔT, ΔPitch/ΔT & ΔFrequency/ΔT在一定的公差范围内x .

- 为格式化而编辑,因为我实际上忘记写完完整的答案。

【讨论】:

你的意思是生成一个频谱,对吧?当你将它与原始声波相提并论时,差异函数的线不会只是0吗? 是的,我的意思是生成一个频谱。在这么多的话。 :) 如果要比较的最佳拟合线是基于两个声波的平均值,不,我不相信它只是 0。不过可能是错误的!

以上是关于两个音频序列之间的感知相似度的主要内容,如果未能解决你的问题,请参考以下文章

哪种功能,算法适合说话人验证

如何测量语音文件的相似度

Python:两个大型numpy数组之间的余弦相似度

如何度量两个词之间的语义相似度

计算两个列表之间的相似度

DTW算法, 时间序列相似度 2021-03-10