我相信你的逻辑太复杂了。不过,我可能过于简化了... :)
您可以将所有语法包含在一个文件中。当你监听你的初始命令时,在你的代码中设置一个标志,然后监听后续。
这是一个(简化的)语法集:
<grammar version="1.0" xml:lang="en-US" root="rootRule" tag-format="semantics/1.0" xmlns="http://www.w3.org/2001/06/grammar">
<rule id="rootRule">
<one-of>
<item>
<tag>out.SysCommand = "STATUS";</tag>
Computer what is the system status
</item>
<item>
<tag>out.SysCommand = "PASSWORD";</tag>
Gamma
<one-of>
<item>Four</item>
<item>Forty</item>
</one-of>
Seven Echo
</item>
</one-of>
</root>
</grammar>
您的回调可能如下所示:
private void OnSpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result.Confidence >= ConfidenceThreshold)
{
if (IsListening)
{
if (e.Result.Semantics["SysCommand"] != null)
{
switch (e.Result.Semantics["SysCommand"].Value.ToString())
{
case "PASSWORD":
// The was waiting for this, now you can act on it
break;
default:
// something else was said, reset!
break;
}
}
}
else if (e.Result.Semantics["SysCommand"] != null)
{
if (e.Result.Semantics["SysCommand"].Value.ToString() == "STATUS")
{
// do stuff that prompts user for password
IsListening = true;
}
}
}
}
您的回调会查找“IsListening”标志。如果未设置,它会检查您是否询问状态。如果你这样做了,它会设置标志,现在等待密码。
您可以简化上面的代码。我复制了它并用我做过的类似的东西做了一些快速的编辑。就我而言,我执行以下操作:
- 聆听系统的名称(“Floyd”)
- 设置“IsListening”标志
- 在屏幕上显示提示(与 IsListening 标志绑定的可见性)显示可能的后续命令
- 聆听这些命令并采取适当的行动
您可以根据需要加载和卸载新语法,但是,除非您的语法文件变得很大,否则这些加载/卸载的开销将开始迅速赶上仅在一组中查看一些额外的语法规则。