我正在尝试将SpeechRecognizer与自定义语法一起使用以处理以下模式:

“您可以打开{item}吗?”其中{item}使用DictationGrammar。

我正在使用Vista和.NET 4.0中内置的语音引擎。

我希望能够对返回的SemanticValues充满信心。请参见下面的示例。



如果仅使用“ recognizer.AddGrammar(new DictationGrammar())”,则可以浏览e.Results.Alternates并查看每个替代项的置信度值。如果DictationGrammar在顶层,则该方法有效。

编造的例子:


可以打开Firefox吗? .95
你可以打开费尔法克斯吗? .93
可以打开文件传真吗? .72
你可以写火狐浏览器吗? .85
你可以固定费尔法克斯吗? .63


但是,如果我建立一个语法,寻找“可以打开{semanticValue Key ='item'GrammarBuilder = new DictationGrammar()}?”的语法,那么我得到:


可以打开Firefox吗? .91-语义= {GrammarBuilder.Name =“您可以打开”}
你可以打开费尔法克斯吗? .91-语义= {GrammarBuilder.Name =“您可以打开”}
可以打开文件传真吗? .91-语义= {GrammarBuilder.Name =“您可以打开”}
你可以写火狐浏览器吗? .85-语义= null
你可以固定费尔法克斯吗? .63-语义= null


.91向我展示了它与“您可以打开{item}吗?”模式相匹配的信心。但没有进一步区别。

但是,如果我再看一下e.Result.Alternates.Semantics.Where(s => s.Key ==“ item”),并查看其置信度,则会得到:


Firefox 1.0
费尔法克斯1.0
文件传真1.0


这对我没有多大帮助。

当我查看匹配的SemanticValues的置信度时,我真正想要的是这样的东西:


Firefox .95
费尔法克斯.93
文件传真.85


似乎应该以这种方式工作...

难道我做错了什么?在语音框架中甚至有办法做到这一点吗?



我希望有一些内置的机制,以便我可以“正确”的方式进行操作。

至于另一种可能可行的方法...


使用SemanticValue方法匹配模式
对于与该模式匹配的任何内容,请提取{item}的原始音频(使用RecognitionResult.Words和RecognitionResult.GetAudioForWordRange)
通过带DictationGrammar的SpeechRecognizer运行{item}的原始音频,以获得置信度


...但这比我真正想做的要多。

最佳答案

我认为听写语法只会抄录。它可以对文本讲话,而无需提取语义,因为根据定义,听写语法支持所有单词,并且对您的特定语义映射没有任何线索。您需要使用自定义语法来提取语义。如果您提供SRGS语法或以代码形式或使用SpeechServer工具构建一个,则可以为某些单词和短语指定语义映射。然后,识别器可以提取语义并给您语义信任。

您应该能够从识别器上的识别器中获得置信度值,请尝试使用System.Speech.Recognition.RecognitionResult.Confidence。

Microsoft Server Speech Platform 10.2 SDK随附的帮助文件具有更多详细信息。 (这是用于服务器应用程序的Microsoft.Speech API,与用于客户端应用程序的System.Speech API非常相似)。请参阅(http://www.microsoft.com/downloads/en/details.aspx?FamilyID=1b1604d3-4f66 -4241-9a21-90a294a5c9a4。)或位于http://msdn.microsoft.com/en-us/library/microsoft.speech.recognition.semanticvalue(v=office.13).aspx的Microsoft.Speech文档

对于SemanticValue类,它表示:


  基于所有语音平台的识别
  引擎输出提供有效实例
  所有公认的SemanticValue的值
  输出,甚至没有显式短语
  语义结构。
  
  的SemanticValue实例
  短语是使用语义获得的
  属性在RecognizedPhrase上
  对象(或继承自
  (例如RecognitionResult)。
  
  获得的SemanticValue对象
  没有语义的公认短语
  结构的特点是:
  
  没有孩子(计数为0)
  
  Value属性为null。
  
  人工置信度为1.0
  (由信心返回)
  
  通常,应用程序创建
  间接的SemanticValue实例,
  通过将它们添加到语法对象
  使用SemanticResultValue,以及
  中的SemanticResultKey实例
  与选择和结合
  GrammarBuilder对象。
  
  直接构造一个
  SemanticValue在
  创建强类型语法


当您在语法中使用SemanticValue功能时,通常会尝试将不同的短语映射为单个含义。在您的情况下,短语“ IE”或“ Internet Explorer”都应映射到相同的语义。您可以在语法中设置选择,以理解可以映射为特定含义的每个短语。这是一个简单的Winform示例:

private void btnTest_Click(object sender, EventArgs e)
{
    SpeechRecognitionEngine myRecognizer = new SpeechRecognitionEngine();

    Grammar testGrammar = CreateTestGrammar();
    myRecognizer.LoadGrammar(testGrammar);

    // use microphone
    try
    {
        myRecognizer.SetInputToDefaultAudioDevice();
        WriteTextOuput("");
        RecognitionResult result = myRecognizer.Recognize();

        string item = null;
        float confidence = 0.0F;
        if (result.Semantics.ContainsKey("item"))
        {
            item = result.Semantics["item"].Value.ToString();
            confidence = result.Semantics["item"].Confidence;
            WriteTextOuput(String.Format("Item is '{0}' with confidence {1}.", item, confidence));
        }

    }
    catch (InvalidOperationException exception)
    {
        WriteTextOuput(String.Format("Could not recognize input from default aduio device. Is a microphone or sound card available?\r\n{0} - {1}.", exception.Source, exception.Message));
        myRecognizer.UnloadAllGrammars();
    }

}

private Grammar CreateTestGrammar()
{
    // item
    Choices item = new Choices();
    SemanticResultValue itemSRV;
    itemSRV = new SemanticResultValue("I E", "explorer");
    item.Add(itemSRV);
    itemSRV = new SemanticResultValue("explorer", "explorer");
    item.Add(itemSRV);
    itemSRV = new SemanticResultValue("firefox", "firefox");
    item.Add(itemSRV);
    itemSRV = new SemanticResultValue("mozilla", "firefox");
    item.Add(itemSRV);
    itemSRV = new SemanticResultValue("chrome", "chrome");
    item.Add(itemSRV);
    itemSRV = new SemanticResultValue("google chrome", "chrome");
    item.Add(itemSRV);
    SemanticResultKey itemSemKey = new SemanticResultKey("item", item);

    //build the permutations of choices...
    GrammarBuilder gb = new GrammarBuilder();
    gb.Append(itemSemKey);

    //now build the complete pattern...
    GrammarBuilder itemRequest = new GrammarBuilder();
    //pre-amble "[I'd like] a"
    itemRequest.Append(new Choices("Can you open", "Open", "Please open"));

    itemRequest.Append(gb, 0, 1);

    Grammar TestGrammar = new Grammar(itemRequest);
    return TestGrammar;
}

关于c# - 为什么Microsoft语音识别SemanticValue.Confidence值始终为1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5415262/

10-12 03:07