我正在尝试将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/