我试图使用aquila库找到口语之间的相似性。
我目前的做法如下
1)首先,我将说出的单词分解成更小的帧
2)然后对每个帧应用MFCC并将结果存储在向量中
3)最后使用DTW计算距离。
这是我正在使用的代码。
WITH val(name, bar_id) AS (SELECT 'given_name'::varchar, 7)
-- type cast needed for varchar, but numeric constant typed automatically
, ins AS (INSERT INTO foo(name)
SELECT name FROM val
ON CONFLICT (name) DO NOTHING -- conflicting row is locked
RETURNING foo_id)
INSERT INTO link_foo_to_bar(foo_id, bar_id)
SELECT foo_id, bar_id FROM ins, val;
UNION ALL
SELECT f.foo_id, v.bar_id FROM foo f JOIN val v USING (name)
LIMIT 1;
它工作正常,但不够准确。有时它表示说出的单词之间的距离较小' start'并且'停止'而不是两个口头的开始'
我的代码是否正确?如何改进程序,以便我可以获得更准确的结果? 任何帮助将不胜感激。
感谢。
答案 0 :(得分:2)
总体而言,DTW并非易事。您可以查看本讲座,了解必须完成的工作:
http://www.fit.vutbr.cz/~grezl/ZRE/lectures/08_reco_dtw_en.pdf
你需要弄清楚为什么开始和停止之间的距离小于开始和停止之间的距离。是因为音量不同还是你使用不同的声音?可能会有很多问题。相同样本之间的距离必须为0.您可能希望在样本之间逐帧转储对齐,以便查看与哪些对齐。
理想情况下,DTW不允许在帧之间进行非常大的跳转。上面的讲座描述了这一点。
为了获得更好的精确度,特征提取管道应该包括倒谱和倒谱平均归一化(基本上是体积归一化)的升降器。
您使用的音频不应包含静音,您需要使用语音活动检测来删除它。
另外,我不确定您的音频的采样率,但1024个样本的帧大小可能太大。