为什么我的Microsoft语音识别结果的置信度总是等于-1?

时间:2011-03-07 13:26:36

标签: speech-recognition

我正在使用Microsoft Speech SDK来实现使用语音识别的软件。

我使用非常正常的语法为识别引擎提供信息,但是当启动引擎并说出正确的内容时,它会识别我所说的内容,但返回的Result对象的置信度值为-1。

此外,结果中包含的所有SemanticValue对象也具有-1置信度。

我无法在相关的MSDN页面中找到这种结果的含义,实际上只是写了典型的置信度值应介于0和1之间。

-1值是什么意思?它与语法有关吗?

编辑:其他信息:

  • 我正在使用System.Speech类与语音识别引擎进行交互。
  • 识别引擎是Microsoft English Recognizer v5.1。
  • 我在XP上运行该程序,因此Speech SDK也是5.1。
  • 输入是一个麦克风输入:我没有找到用文件提供这个识别引擎的可能性的痕迹,虽然这对我有很大帮助。

1 个答案:

答案 0 :(得分:2)

在SAPI中,SREngineConfidence试图将来自供应商特定语音引擎的短语置信度传递给独立于引擎的SAPI客户端。 SREngineConfidence在“Microsoft Speech SDK版本5.1 SR引擎供应商移植指南”中描述了一些有趣的行为

http://msdn.microsoft.com/en-us/library/ee431799(v=VS.85).aspx#_Toc503606917说:

  

可信度得分   要包含的信息   识别结果。在每个短语上   元素有两个信心   引擎可以设置的字段。这些   有信心(三级)   字段和SREngineConfidence   (浮点)字段。如果发动机   没有明确设置任何这些   值,SAPI将尝试生产   合理的默认值。它   将产生信心值   平均每个的水平   短语或财产中的单词,和   它将设置SREngineConfidence   值为-1.0。

后来说:

  

如果未使用此字段,则为   引擎将此置信度设置为-1.0。

可能为您提供一些见解的另一个资源是http://gotspeech.net/forums/thread/3613.aspx。一篇帖子说:

  

原则上,SREngineConfidence   得分是介于0.0和1.0之间的值   {更高的价值意味着更高   置信度}。但旧版本的   像5.1这样的SR引擎并不尊重这一点   合约,我不认为   这个值真的可以用来   那些引擎。只有Hi,Medium,   在另一个信心中得分低   字段可用。

     

如果我没记错的话,你需要更多   最近版本的SR引擎就像   Microsoft附带的版本   获得Office 2003或Vista   有意义的数字   SREngineConfidence字段。

编辑:

我认为System.Speech.Recognition实际上是围绕SAPI的.net包装器(参见http://msdn.microsoft.com/en-us/magazine/cc163663.aspx)。我怀疑上面引用的描述置信度为-1的评论可能仍然适用于使用System.Speech。我猜你所看到的-1是同一个问题。

我的理解是XP没有识别器。 Microsoft Office的版本附带了它。所以,我不确定你真正运行的识别器引擎。你安装了Office 2003吗?或者你有像Dragon这样的第三方引擎吗?

你说你安装了识别器5.1。上面的GotSpeech.NET链接说:

  

但旧版本的SR引擎   像5.1不尊重这份合同   确切地说,我并不认为这个价值   可以真正用于那些引擎。

我建议尝试以下方法:

还要补充一件。以下是从wav文件中识别的简短示例:

    SpeechRecognitionEngine myRecognizer = new SpeechRecognitionEngine();
    Grammar myGrammar = CreatePizzaGrammar();       // uses GrammarBuilder to create a pizza ordering grammar
    myRecognizer.LoadGrammar(myGrammar);
    myRecognizer.SetInputToWaveFile("LargeCheese.wav");     // recording of ordering a pizza
    RecognitionResult result = myRecognizer.Recognize();
    string s = result.Text;
    float confidence = result.Confidence;