.Net Framework 4 语音识别——使用小语法时的误报
Posted
技术标签:
【中文标题】.Net Framework 4 语音识别——使用小语法时的误报【英文标题】:.Net Framework 4 speech recognition – false positives when using small grammar 【发布时间】:2015-11-15 16:09:00 【问题描述】:我正在使用 System.Speech.Recognition 中的类来开发一个应用程序,该应用程序使用的语法非常小,仅由几句话组成。用户说出这些句子中的一个,应用程序应该识别出用户说的是哪一个。但是,如果用户说了一些不同的东西,而不是这些句子之一,那么应用程序应该什么都不会识别。
在尝试 SpeechRecognitionEngine 类时,我注意到一个问题:当用户只说出句子的开头,然后继续说其他单词时,识别引擎会将其识别为预定义句子之一。例如,假设语法只有两个句子:
-
“狗吃它的食物”。
“猫坐在沙发上”。
如果用户说“狗在睡觉”,识别引擎会将其识别为“狗在吃东西”。我希望引擎能够识别出这不是上述两句话之一。识别“无”。
按照here 的建议,我尝试添加一个 DictationGrammar。但是,在此之后,该应用程序在识别预定义句子时遇到了问题。用户说“狗吃了它的食物”,但识别引擎识别出其他内容,例如“狗很粗鲁”。
最后这件事并不让我感到惊讶,因为当我使用 windows 附带的语音识别软件(当然,使用 System.Speech)时,我在听写时得到的识别结果很差,即使我已经训练了它(我用的是win 7)。
有什么建议吗?
更新:
正如 NineBerry 所指出的,检查结果的 Confidence 级别 (RecognitionResult.Confidence) 非常有帮助。当用户说出预定义的句子“狗吃它的食物”时,我得到的置信度比他说“狗在睡觉”时更高(分别为~0.9 vs ~0.7)。
但是,如果只有 最后一个词是错误的,例如“狗吃掉它的腿”,我会得到与预定义的“狗吃掉它的食物”相同的置信度。所以我还是有问题。
【问题讨论】:
您是否查看了语音识别结果的“置信度”属性,看看您是否可以使用阈值来确定命中? @NineBerry - 你给了我一个很好的建议。查看我的更新。 相关:***.com/questions/10377054/… 【参考方案1】:如果要验证语音中是否存在关键字,语音识别并不是一个很好的解决方案,因为它不能可靠地过滤其他语音。在存在其他语音的情况下很难识别小的语法。有专门设计的关键字发现算法。此类算法允许您为关键字配置阈值,以平衡误报和误报。
例如看CMUSphinx documentation的对应部分。
关键字发现算法的一个示例是 Google 在 android 上使用的“Ok Google”关键词。请注意,它是静态关键词而不是语法,因为即使 Google 也无法可靠地实现语法检测。
一旦关键字被识别,您就可以切换到语法识别并执行用户任务。
【讨论】:
我认为关键字定位不适合我的应用程序,因为用户每次只能说一个句子(从一组三个句子中)。这个应用程序与许多其他语音控制应用程序相似,有一个很大的不同:我不仅需要识别用户说的是哪句话; 我还需要验证他说的是否正确。 不幸的是,SpeechRecognitionEngine 似乎在尝试识别句子时对句子开头的重视程度比在句子结尾的重视程度更高。以上是关于.Net Framework 4 语音识别——使用小语法时的误报的主要内容,如果未能解决你的问题,请参考以下文章
我是不是需要安装 Speech SDK 才能进行语音识别,即使我使用的是 .NET Speech Recognition 命名空间?