隐马尔可夫模型阈值


14

我已经开发出了使用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
Here the input is an unknown sound but it still returns the closest match as there is no system for thresholding/garbage filtering.

我知道在关键字中发现OOV(词汇量不足)的声音可以使用垃圾模型或填充物模型过滤掉,但是它说它是使用有限的一组未知词进行训练的,因此无法像我一样将其应用于我的系统还不知道系统可能会录制的所有声音。

语音识别系统中如何解决类似的问题?我该如何解决我的问题以避免误报?

Answers:


5

很好的问题!

如您所述,使HMM给出“我不知道”(我们称其为OOV)答案的唯一方法是给它一个特殊的状态,因为它始终输出模型下可能性最高的状态。所以,你必须确保OOV具有较高下的可能性每个输入不是speechwatertapknocking

简短的答案是这是不可能的。因为HMM不是绝对模式识别器。它仅比较模型下输出的可能性,并在上下文中对其进行训练

想想输入,这将是speechknocking在同一时间。HMM最有可能在这两种状态之间“犹豫”,因为此输入具有每种功能。最后,它将输出其中之一,但是输出OOV的可能性很小。在发现关键字的情况下,我的猜测是您会找到聪明的输入,这些输入会始终欺骗他们的HMM。然而,作者可能知道期望输入什么,并且他们选择了未知单词的有限列表,因此这些有毒输入很少见。

我建议您也这样做。考虑一下将要使用HMM并在要消除的最常见输入上训练OOV状态的情况。您甚至可以想到具有多个OOV状态。


2
但是这里描述的基于hmm的用于手势识别的阈值模型怎么样:herin.kaist.ac.kr/Publication/PS/hklee_PAMI_i09611.pdf。他们创建一个阈值模型,该模型是遍历hmm,每个hmm的状态组合在一起。“阈值模型充当基线。当特定的手势模型超过阈值时,将找到候选手势”,但是我的问题是我正在使用java和jahmm库,但我认为它没有遍历选项嗯。
Radek 2012年

就像标题中所说的那样,这是基于HMM的算法,因此它不是HMM。在我看来,纯HMM不能满足您的需求,并且基于阈值的分类器确实更适合。
gui11aume12 2012年

5

这在手势识别领域有点普遍。答案是创建一个阈值模型,如Lee和Kim(1999)的论文所述。

它的作用与填充模型或垃圾模型相同,但不需要像您所说的那样单独进行训练。您可以通过从其他型号连接所有自过渡态与统一的概率初始化的过渡,完全连接这些州创建一个阈值模型。请在纸上看一看,看看如何实际完成。

即使您的库不支持遍历模型,也不应阻止您手动创建所需大小的模型并相应地设置状态。如果您真的想要一个库,则例如,Accord.NET Framework中提供了隐马尔可夫模型分类器的实现,包括对阈值模型的支持。

免责声明:我是这个库的作者。


对,我可以手动创建阈值模型。举例来说,我有两个名为hmm的模型:sound1和sound2。两者都有2个状态。然后,我创建具有4个状态的阈值模型。每个状态具有相同的初始值是0.25。然后,我为所有可能的转移设置统一分布,以便所有可能的状态转移(0,0),(0,1),(1,0),(1,1),(1,2),(2,1), (2,2)等的均匀分布为0.0625。然后,对于阈值模型的状态1和2,我从sound1设置状态1和2的opdf,对于阈值的状态3和4,我从sound2设置状态1和2的opdf。
Radek 2012年

上述方法正确吗?
Radek 2012年

1
不完全是……也许我的描述有些松懈。阈值模型的转换矩阵的对角元素会从其他模型接收原始的自转换概率。从一个状态到其他状态的转换以统一概率初始化。我知道指出代码似乎有些懒惰,但是有时候代码比公式更容易理解
Cesar 2012年

顺便说一句,如果您阅读了Lee和Kim的论文,并且对它有不同的解释,或者认为我的实现不正确,请告诉我。
Cesar 2012年

3

因此,我要做的是:我创建了填充模型的简化版本。代表敲击声,敲打声和言语声的每个hmm是单独的6状态hmm,分别由来自30、50、90个声音的训练集中的声音进行训练,声音的长度分别为0.3秒至10秒。然后,我创建了一个填充器模型,该模型是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

因此,从这个快速测试中,我可以得出结论,尽管我感到奇怪,这种方法可能还不够,但该方法给出了合理的结果。


+1这很有趣。如果您还没有忘记这项工作,那么这种方法最终行得通吗?作为“填充器/其他”模型是否足够?如果没有,您最终是否实施了其他措施?
朱巴卜
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.