我正在使用System.Speech.Recognition中的类来开发一个使用非常小的语法的应用程序,该语法只包含几个句子。用户说出这些句子中的一个,应用程序应该识别用户说的是哪一个。但是,如果用户说出不同的内容(这不是这些句子中的一个),应用程序应该不识别任何内容。
在尝试使用SpeechRecognitionEngine类时,我注意到一个问题:当用户只说出句子的开头,然后继续其他一些单词时,识别引擎会将其识别为预定义句子之一。例如,假设语法只有两个句子:
如果用户说“狗正在睡觉”,识别引擎会将其识别为“狗吃它的食物”。我希望引擎能够识别出不是以上两个句子中的一个。认识到“没有”。
我尝试按照建议here添加DictationGrammar。然而,在此之后,应用程序在识别预定义句子时存在问题。用户说“狗吃它的食物”,但识别引擎识别出其他东西,比如“狗很粗鲁”。
这最后一件事并不让我感到惊讶,因为当我使用Windows附带的语音识别软件(当然,使用System.Speech)时,即使在我训练之后,我在口述时也会得到很差的识别结果(我用win 7)。
有什么建议吗?
正如NineBerry指出的那样,检查 Confidence 级别的结果(RecognitionResult.Confidence)非常有帮助。当用户说出预定义的句子"狗吃掉它的食物时,我得到的置信水平高于他说的时候#34;狗正在睡觉" (分别为~0.9 vs~0.7)。
但是,如果只有最后一个单词是错误的,就像在"狗吃掉它的腿#34;,我得到与预定义"相同的置信水平。狗吃它的食物"。所以我还有问题。
答案 0 :(得分:1)
如果您想验证语音中是否存在关键字,语音识别并不是一个好的解决方案,因为它无法可靠地过滤其他语音。在其他语音存在的情况下很难识别小语法。有特定的关键字定位算法,其设计考虑了目的。此类算法允许您配置关键字的阈值,以在误报和误检测之间取得平衡。
例如,请参阅CMUSphinx documentation的相应部分。
关键字定位算法的一个例子是“Google,Google +”。谷歌在Android上使用的关键短语。请注意,它只是一个静态密钥而不是语法,因为即使Google也无法可靠地实现语法识别。
识别关键字后,您可以切换到语法识别并执行用户任务。