C# 为什么Microsoft语音识别SemanticValue.Confidence值始终为1?

C# 为什么Microsoft语音识别SemanticValue.Confidence值始终为1?,c#,.net,speech-recognition,speech,C#,.net,Speech Recognition,Speech,我正在尝试使用带有自定义语法的SpeechRecognitor来处理以下模式: “能否打开{item}?”其中{item}使用听写语法 我正在使用Vista和.NET4.0中内置的语音引擎 我希望能够获取返回的语义值的机密信息。见下面的例子 如果我只使用“recognizer.AddGrammar(new DictationGrammar())”,我就可以浏览e.Results.Alternates并查看每个alternate的置信值。如果听写语法是最高级的,那就行了 虚构的例子: 你能打开

我正在尝试使用带有自定义语法的SpeechRecognitor来处理以下模式:

“能否打开{item}?”其中{item}使用听写语法

我正在使用Vista和.NET4.0中内置的语音引擎

我希望能够获取返回的语义值的机密信息。见下面的例子


如果我只使用“recognizer.AddGrammar(new DictationGrammar())”,我就可以浏览e.Results.Alternates并查看每个alternate的置信值。如果听写语法是最高级的,那就行了

虚构的例子:

  • 你能打开Firefox吗。九十五
  • 你能打开费尔法克斯吗。九十三
  • 你能打开文件传真吗。七十二
  • 你会写Firefox吗。八十五
  • 你能锁定费尔法克斯吗。63
但如果我构建的语法查找“您能打开{semanticValue Key='item'GrammarBuilder=new DictationGrammar()}吗?”,那么我得到以下结果:

  • 你能打开Firefox吗。91-Semantics={GrammarBuilder.Name=“您能打开吗”}
  • 你能打开费尔法克斯吗。91-Semantics={GrammarBuilder.Name=“您能打开吗”}
  • 你能打开文件传真吗。91-Semantics={GrammarBuilder.Name=“您能打开吗”}
  • 你会写Firefox吗。85-语义=null
  • 你能锁定费尔法克斯吗。63-语义=null
91向我展示了它是多么自信,它匹配了“Canyouopen{item}?”的模式,但没有进一步区分

然而,如果我再看看e.Result.Alternates.Semantics.Where(s=>s.Key==“item”),并查看它们的可信度,我会得到以下结果:

  • 火狐1.0
  • 费尔法克斯1.0
  • 文件传真1.0
这对我没什么帮助

当我查看匹配语义值的可信度时,我真正想要的是这样的:

  • Firefox.95
  • 费尔法克斯,93
  • 文件传真:85
看起来应该是这样的

我做错什么了吗?在演讲框架内是否有这样做的方法?


我希望有一些内在的机制,这样我就可以做它的“正确”的方式

至于另一种可能有效的方法

  • 使用SemanticValue方法匹配模式
  • 对于与该模式匹配的任何内容,提取{item}的原始音频(使用RecognitionResult.Words和RecognitionResult.GetAudioForWordRange)
  • 使用听写语法通过SpeechRecognitor运行{item}的原始音频,以获得信心

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

    我认为听写语法只做转录。它在不提取语义的情况下实现了从语音到文本的转换,因为根据定义,听写语法支持所有单词,并且没有任何特定语义映射的线索。您需要使用自定义语法来提取语义。如果您提供SRGS语法或在代码中或使用SpeechServer工具构建SRGS语法,则可以为某些单词和短语指定语义映射。然后,识别器可以提取语义,并为您提供语义信心

    您应该能够从识别器获取识别的置信度值,请尝试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.)或Microsoft.Speech文档,网址为

    对于SemanticValue类,它表示:

    基于全语音平台的识别 引擎输出提供有效的实例 对于所有已识别的 输出,即使是没有显式 语义结构

    的SemanticValue实例 短语是使用语义获取的 可识别短语上的属性 对象(或从中继承的对象) 它包括(例如识别结果)

    为获取的SemanticValue对象 没有语义的已识别短语 结构的特点是:

    没有子女(计数为0)

    Value属性为null

    1.0的人工置信水平 (信心十足地返回)

    通常,应用程序创建 间接语义值的实例, 通过以下方式将它们添加到语法对象 使用SemanticResultValue,以及 中的SemanticResultKey实例 连接、选择和 GrammarBuilder对象

    直接构造 SemanticValue在测试过程中非常有用 强类型文法的创建

    当您在语法中使用语义值功能时,您通常会尝试将不同的短语映射到单个意义。在您的情况下,“I.E”或“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;
    }
    

    我举例说明了这个问题。评论中没有足够的空间,所以我把它放在上面。看,我想我是在试图使用错误的工具来解决问题。感谢您解释了语音中的整个语义设计是如何工作的。我要寻找的是支持通用模式匹配的东西,它能够1)识别模式,2)识别模式中的组件;“你能不能{动词}这个{名词}”,用一种语法来表示{动词}和另一种语法来表示{名词},然后计算出总的置信度值和过程,我想你可能已经了解了一些东西。我只是向你展示了最基本的使用方法。我现在明白你想做什么了。你可能会有一个创造性的解决方案。我不知道你需要运行音频