我开发了一个使用mfcc和隐马尔可夫模型进行声音识别的概念验证系统。当我在已知声音上测试系统时,它给出了有希望的结果。虽然系统在输入未知声音时返回最接近匹配的结果,但分数并不明显,以设计它是一种未知声音,例如:
我训练了3个用于演讲的隐马尔可夫模型,一个用于从水龙头中取出水,另一个用于敲击桌面。然后我在看不见的数据上测试它们并得到以下结果:
input: speech
HMM\knocking: -1213.8911146444477
HMM\speech: -617.8735676792728
HMM\watertap: -1504.4735097322673
So highest score speech which is correct
input: watertap
HMM\knocking: -3715.7246152783955
HMM\speech: -4302.67960438553
HMM\watertap: -1965.6149147201534
So highest score watertap which is correct
input: knocking
HMM\filler -806.7248912250212
HMM\knocking: -756.4428782636676
HMM\speech: -1201.686687761133
HMM\watertap: -3025.181144273698
So highest score knocking which is correct
input: unknown
HMM\knocking: -4369.1702184688975
HMM\speech: -5090.37122832872
HMM\watertap: -7717.501505674925
这里输入是一个未知的声音,但它仍然返回最接近的匹配,因为没有用于阈值/垃圾过滤的系统。
我知道在关键字定位中,OOV(词汇表外)声音可以使用垃圾或填充模型过滤掉,但它说它是使用一组有限的未知单词训练的,这些不能应用于我的系统因为我不知道系统可能录制的所有声音。
如何在语音识别系统中解决类似的问题?我怎样才能解决我的问题以避免误报?
答案 0 :(得分:3)
要拒绝其他字词,您需要填充模型。
这是一项统计假设检验。你有两个假设(单词已知且单词未知)。要做出决定,您需要估计每个假设的概率。
填充模型是根据您的语音训练的,只是以不同的方式,例如,对于任何语音,它可能是单高斯。您比较通用填充模型的得分和HMM这个词的得分并做出决定。有关更深入的信息和高级算法,您可以查看关于关键字定位的任何论文。本论文有一个很好的评论:
声音中的声音关键词应用于数据挖掘 A. J. Kishan Thambiratnam
http://eprints.qut.edu.au/37254/1/Albert_Thambiratnam_Thesis.pdf
答案 1 :(得分:1)
所以我所做的是:我创建了我的填充模型的简化版本。每个代表水密声音,敲击声音和语音声音的hmm是一个单独的6状态hmm,由来自各种长度0.3秒到10秒的30,50,90个声音训练集的声音训练。然后我创建了一个填充模型,它是一个1状态hmm,包括所有训练集声音的敲击,水密和语音。因此,如果给定声音的hmm模型得分大于填充物的得分 - 声音被识别,否则它是未知声音。我真的没有大数据,但我已经完成了以下关于误报拒绝的测试和对看不见的声音的真正肯定拒绝。
true positives rejection
knocking 1/11 = 90% accuracy
watertap 1/9 = 89% accuracy
speech 0/14 = 100% accuracy
false positives rejection
Tested 7 unknown sounds
6/7 = 86% accuracy
因此,通过这个快速测试,我可以得出结论,这种方法可以给出合理的结果,尽管我有一种奇怪的感觉,这可能还不够。
答案 2 :(得分:0)
判别模型在分类任务方面往往比生成模型表现更好。
使用专门设计的CRF或最大边距分类器(结构化svm),您可以在此任务上获得更好的性能。
本文(http://ttic.uchicago.edu/~jkeshet/papers/KeshetGrBe07.pdf)讨论了与您类似的分类问题,并表明最大边际公式优于填充模型的生成方法。
可能没有任何开箱即用的功能可以完成我所描述的功能,但是,通过一些努力,您可以扩展svm-struct。 (hmm-svm实现不适用于您的问题,因为您需要提前指定隐藏状态结构,而不是学习任意连接的隐藏状态结构。)