【问题标题】:How to use SAPI Speech Recognition C# to control a game如何使用 SAPI 语音识别 C# 来控制游戏
【发布时间】:2012-10-02 23:57:10
【问题描述】:

我一直在玩 quakelive.com,并且对我的键盘绑定感到沮丧,并希望改用语音命令进行绑定。

我想我会创建一个 C# 控制台应用程序在后台运行,并使用适用于 Windows 7 64 位的 SAPI 的内置语音识别引擎来完成所有繁重的语音工作。我的程序会监听 SpeechRecognized 事件并做出相应的响应。但是,我不确定在玩游戏时如何在后台运行控制台应用程序并结合 ms 语音识别?

这是我目前所写的:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Speech.Recognition;
using System.Text;
using System.Threading.Tasks;
using AutoItX3Lib;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            AutoItX3 autoit = new AutoItX3();

            // Create a default dictation grammar.
            DictationGrammar defaultDictationGrammar = new DictationGrammar();
            defaultDictationGrammar.Name = "default dictation";
            defaultDictationGrammar.Enabled = true;

            // Create our process
            autoit.Run("notepad.exe", "", autoit.SW_MAXIMIZE);
            autoit.WinWaitActive("Unbenannt - Editor");
            Console.WriteLine("its active");

            SpeechRecognizer sr = new SpeechRecognizer();
            sr.SpeechRecognized += (s, e) =>
            {
                foreach (RecognizedWordUnit word in e.Result.Words)
                {
                    Console.WriteLine(word.Text);
                    if (word.Text.Trim().ToLower() == "one")
                        autoit.Send(word.Text.ToLower() + "{LCTRL}+{LSHIFT}+a", 0);
                    else
                        autoit.Send(word.Text.ToLower() + " ", 0);
                }
            };
            sr.LoadGrammar(defaultDictationGrammar);
        }
    }
}

基本上,我希望在我的游戏运行时运行 ms 语音识别,并让我的控制台应用程序监听我说的特定单词。正如您在我的示例代码中看到的那样,我正在收听短语“one”,我使用 autoIt 将文本以及一些控制字符发送到记事本,以便在写入时选择所有文本。

到目前为止,它还没有工作。似乎我的控制台应用程序必须具有“焦点”或成为前台应用程序,即使这样,当我说“一个”或“两个”之类的词时,ms 语音识别也会尝试用我的应用程序执行“控制台命令”,而不仅仅是通过听写文本。例如,当我说“一个”这个词时,它一直在说“移动”,因为我认为它认为控制台不是文档,所以它必须是命令而不是听写。

谁能看到我做错了什么以及如何让它按我的意愿工作?

最终的解决方案是将控制字符发送到正在运行的“chrome.exe”进程而不是“记事本”,因为 quakelive 是在浏览器中运行的。所以我认为通过 autoIt 发送键盘命令足以让 chrome 进程将这些命令作为游戏键盘游戏输入(即键盘输入/击键)传递给 quakelive 插件。

感谢任何人提供任何帮助或建议。

【问题讨论】:

    标签: speech-recognition autoit sapi


    【解决方案1】:

    当您创建 SpeechRecognizer 时,您正在创建一个使用 Windows 桌面识别的共享识别器。当你说'(它)试图做“控制台命令”的东西'时,我怀疑这是因为你使用的是用于从桌面控制应用程序的共享识别器。如果您想使用专用于您的应用程序的语音,请改为创建 SpeechRecognitionEngine。共享的 recongizer 可能适用于您想要的,但我认为您需要有一个专用的语法才能正确控制您的应用程序。

    由于您为用户提供了一组有限的语音命令,因此如果您提供支持该词汇表的语法而不是使用听写语法,您将获得更好的成功。

    我不知道控制台应用程序是否需要在前台才能捕获声卡。我怀疑一旦您更改为 inproc 识别器,即使在后台,该应用程序也将继续运行。

    有关更多背景信息,请参阅http://msdn.microsoft.com/en-us/magazine/cc163663.aspx。这可能是迄今为止我找到的最好的介绍性文章。它有点过时了,但很有帮助。 (AppendResultKeyValue 方法在 beta 之后被删除。)http://msdn.microsoft.com/en-us/library/hh361625.aspx 是一个很好的起点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多