【问题标题】:C# Speech Recognition - Recognizing Speech and Performing TaskC# 语音识别 - 识别语音并执行任务
【发布时间】:2018-03-20 15:58:21
【问题描述】:

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

一旦引发了 SpeechRecognized 事件,并且您执行了一项任务,您如何暂停该任务、要求用户发出另一个命令以及恢复或放弃之前的任务?

我目前的思路主要集中在更改加载的语法并接受新命令,然后将其传递回之前的操作(如果有意义的话)。

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

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

【问题讨论】:

    标签: c# windows speech-recognition


    【解决方案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. 听取这些命令并采取适当的行动

    您可以根据需要加载和卸载新语法,但除非您的语法文件变得很大,否则这些加载/卸载的开销将很快赶上仅查看一组中的一些额外语法规则。

    【讨论】:

      猜你喜欢
      • 2018-02-23
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多