C#语音识别 - 识别语音和执行任务

时间:2012-08-11 09:30:45

标签: c# windows speech-recognition

感谢您抽出宝贵时间查看我的查询。我正在使用Expression Blend 4和Visual Studio 2010在C#WPF .NET 4中编写程序。我正在使用System.Speech.Recognition来监听来自用户的命令并执行任务。我的问题是;

一旦发出SpeechRecognized事件并执行任务,您如何暂停任务,让用户发出另一个命令,然后恢复或放弃上一个任务?

我目前的思路主要围绕更改已加载的语法并接受新命令,然后将其传递回上一个操作(如果这有意义的话)。

为了让您知道我想要做什么,我正在听取诸如“计算机,系统状态是什么”之类的命令。我想向用户发出一个声音响应,要求输入另一个命令,例如(输入授权码),一旦用户这样做,它将在返回某个命令(代码)时执行响应(例如, “Gamma 47 Echo”),拒绝命令(代码)或超时并重新加载以前的语法(我正在使用外部XML语法文件)。

我已将此处的代码上传到PasteBin http://pastebin.com/X3vJJJrM。我是编程新手,有一些Java经验。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我相信你的逻辑太复杂了。我可能过度简化它了...... :)

您可以将所有语法都包含在一个文件中。在您收听初始命令时,请在代码中设置一个标志,然后监听后续操作。

这是一个(简化的)语法集:

<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”标志。如果未设置,则会检查您是否要求提供状态。如果你这样做,它会设置标志,现在等待密码。

您可以简化上述代码。我复制了它,并做了一些与我类似的快速编辑。就我而言,我会做以下事情:

  1. 聆听系统名称(“Floyd”)
  2. 设置“IsListening”标志
  3. 在屏幕上显示提示(绑定到IsListening标志的可见性),显示可能的后续命令
  4. 聆听这些命令并对其采取适当行动
  5. 您可以根据需要加载和卸载新语法,但是,除非您的语法文件变得庞大,否则这些加载/卸载的开销将很快赶上,只需在单个集合中查看一些额外的语法规则。