在GRXML中创建语音命令同义词

时间:2017-11-09 08:03:09

标签: uwp c++-cx grxml

我在C ++ / CX中创建了一个语音控制的UWP应用程序(对于Hololens,如果这很重要)。一个非常简单的,主要是根据一些样本,这是语音识别事件处理程序:

void MyAppMain::HasSpoken(SpeechContinuousRecognitionSession ^sender, SpeechContinuousRecognitionResultGeneratedEventArgs ^args)
{
    if (args->Result->Confidence == SpeechRecognitionConfidence::Medium
        || args->Result->Confidence == SpeechRecognitionConfidence::High)
    {
        process_voice_command(args->Result->Text);
    }
}

到目前为止一切正常,识别结果在args->Result->Text变量中。现在,我只需要支持一组非常有限的语音命令,而忽略其他所有内容,但在这组有限的命令中,我想要一些可变性。看来,this page上的最后一个例子正是如此。所以我根据它做了以下语法文件:

<grammar version="1.0" xml:lang="en-US" root="nextCommands" xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">

  <rule id="nextCommands">
    <item>
      <one-of>
        <item>next</item>
        <item>go</item>        
        <item>advance</item>
      </one-of>
      <tag>out="next";</tag>
    </item>
  </rule>

</grammar>

我想要的是,当我说&#34; next&#34;,&#34; go&#34;或者&#34;提前&#34;,识别引擎只返回&#34; next&#34;,所以它在上面的args->Result->Text。它现在对我的实际作用是将识别出的单词限制为这三个,但它只返回我说的单词,而不将其转换为&#34; next&#34;。看起来要么忽略<tag>元素,要么我必须在C ++ / CX程序中以不同的方式检索其内容。或者<tag>并不像我认为的那样工作。我应该改变什么才能使它发挥作用?

2 个答案:

答案 0 :(得分:1)

我找到了一种方法来做我想要的SRGS(至少对于问题中描述的非常简单的情况)。因此,似乎<tag>不会直接更改识别结果(至少不会使用tag-format="semantics/1.0",还有其他tag-format,例如,{{3} },他们可能会做其他事情)。相反,它会填充一些额外的属性集合。所以这就是我现在改变代码的方式:

<grammar version="1.0" xml:lang="en-US" 
root="nextCommands" xmlns="http://www.w3.org/2001/06/grammar" 
tag-format="semantics/1.0">

  <rule id="nextCommands">
    <item>
      <one-of>
        <item>next</item>
        <item>go</item>        
        <item>advance</item>
      </one-of>
      <tag>out.HONEY="bunny";</tag>
    </item>
  </rule>

</grammar>

现在,当识别出“next”,“go”或“advance”时,它仍会保持args->Result->Text不变,但args->Result->SemanticInterpretation->Properties中的HONEY也会有{ {1}}密钥和bunny值。我可以检查是否是

的情况
args->Result->SemanticInterpretation->Properties->HasKey("HONEY");

,如果是,请使用

检索它的值
args->Result->SemanticInterpretation->Properties->Lookup("HONEY")->GetAt(0); //returns "bunny"

答案 1 :(得分:0)

  

或者不像我认为的那样工作

标记是合法规则扩展,标记不影响由语法定义的合法字模式或识别语法或给定语法的其他输入的过程。详情请查看 Tags section of Speech Recognition Grammar Specification

  

我想要的是,当我说&#34; next&#34;,&#34; go&#34;或者&#34;提前&#34;,识别引擎只返回&#34;下一步&#34;

语音识别将用户说出的单词转换为表单输入的文本。 Constraints或语法定义语音识别器可以匹配的口语单词和短语。您使用的语法用于定义匹配世界。如果你想要&#34; next&#34;,&#34;去&#34;或者&#34;推进&#34;要执行相同的命令,您可以在处理文本结果时处理它们。例如,

// Start recognition.
Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
// Do something with the recognition result.
if (speechRecognitionResult.Text == "go" || speechRecognitionResult.Text == "next" || speechRecognitionResult.Text == "advance")
{

}

详情请参阅包含方法HandleRecognitionResult的官方样本的Scenario_SRGSConstraint