如何比较 2 个 MFCC 矩阵,保持时间信息

信息处理 声音的 声音 mfcc
2022-02-01 09:31:11

我有几千个声音的语料库。现在我选择一个声音样本S,我想在我的语料库中找到与 S 最相似的声音S '该应用程序适用于音乐,适用于我正在创作的作品:) 我发现了很多与语音识别相关的问题。这里的问题不同,因为节奏对我来说是最重要的信息,甚至在音色之前。如果S'的长度与S不同,则它一定是它的拉伸版本。

样本在 0.5 秒到 2 秒之间(大约)。我试图计算MFCCs,应用DTW,但我没有得到令人信服的结果。我仍然相信 MFCC 是要走的路,但是我开始认为 DTW 不适合我的目的,因为它删除了节奏信息。例如(如果我理解得很好),DTW 会识别出声音"Puuuum pum tchak""Pum pum tchaaaak"是相同的。但显然,在音乐方面,它们不是,因为时机至关重要。

那么,如何比较 2 个 MFCC 矩阵,同时保留时间信息?还是我的方法完全错误?

我目前正在研究 procrustes 分析,因为我读到它比较了 2 个形状,消除了缩放,……这对我来说听起来不错。

编辑

使用 DTW,我可能会:

distance("Pum pum tchak", "Pum pum tchaaaak") < distance("Pum pum tchak", "Puuum puuum tchaaak")

换句话说,时间换行并不关心与它"Puuum puuum tchaaak"完全相同"Pum pum tchak"但速度较慢的事实。

1个回答

您误解了 DTW 的工作原理。您实际上可以调整帧删除/插入成本以调整您可以容忍多少时间不匹配。

我们会有:DTW("Puuuum pum tchak", "Puuum pum tchak") < DTW("Puuuum pum tchak", "Pum pum tchk") < DTW("Puuuum pum tchak", "Puuuum pum tchak", "Puuuum pum tchak")。

也就是说,如果有一个时序完美的样本,它总是会比时序错误的样本产生更高的DTW分数。可以通过调整 DTW 对齐成本来调整相似音色和相似时序之间的权衡。DTW 的一个有用之处是它找到了“查询”和找到的样本之间的最佳对齐 - 因此您可以使用它找到的路径对结果进行时间拉伸/相位语音编码,并将其与查询完美对齐。

目前尚不清楚您的应用程序对时间的敏感程度;哪些特征最重要(整体音色?拟声词哪个发音?);以及您可以对找到的剪辑进行何种处理以使它们与查询更好地对齐。如果节奏/时间是绝对必要的,你可能想用一个起始检测器来处理每个样本;并将您的搜索限制在具有正确起始数量和正确间隔时间的剪辑集。

如果您对节奏差异绝对没有容忍度,那么您可以很好地计算两个剪辑之间的成对距离的平均值(如果它们的长度不匹配,则用零填充)。这有点傻,但您的应用程序可能需要这样。

最后,如果您的查询和样本都可以接受相同的特定域表示(例如节拍器节奏和鼓循环都可以转录为“低音鼓”和“小鼓”事件) - 它可能有助于转录所有剪辑并匹配转录而不是音频信号。