11

我开发了一个使用 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(词汇外)声音,但它说它是使用一组有限的未知单词进行训练的,而这不能像我一样应用于我的系统不知道系统可能记录的所有声音。

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

4

3 回答 3

3

要拒绝其他词,您需要一个填充模型。

这是一个统计假设检验。你有两个假设(单词是已知的,单词是未知的)。要做出决定,您需要估计每个假设的概率。

填充模型是从您拥有的语音中训练出来的,只是以不同的方式,例如它可能是任何语音声音的单个高斯。您比较通用填充模型的分数和 HMM 单词的分数并做出决定。有关更深入的信息和高级算法,您可以查看有关关键字发现的任何论文。这篇论文有一个很好的评论:

语音关键词识别与数据挖掘应用 AJ Kishan Thambiratnam

http://eprints.qut.edu.au/37254/1/Albert_Thambiratnam_Thesis.pdf

于 2012-06-22T19:20:04.647 回答
1

所以我所做的是:我创建了填充模型的简化版本。每个代表水龙头声音、敲击声音和语音声音的 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

所以从这个快速测试中我可以得出结论,这种方法给出了合理的结果,尽管我有一种奇怪的感觉,它可能还不够。

于 2012-06-25T15:14:03.067 回答
0

判别模型往往比生成模型在分类任务上表现更好。

使用专门设计的 CRF 或最大边距分类器(结构化 svm)绝对可以在此任务上获得更好的性能。

这篇论文 (http://ttic.uchicago.edu/~jkeshet/papers/KeshetGrBe07.pdf) 讨论了一个与您类似的分类问题,并表明最大边距公式优于填充模型的生成方法。

可能没有什么开箱即用的东西可以做我所描述的,但是,通过一些努力,你也许可以扩展 svm-struct。(hmm-svm 实现不适用于您的问题,因为您需要提前指定隐藏状态结构,而不是学习任意连接的隐藏状态结构。)

于 2012-07-04T13:00:26.317 回答