Speech recognition 如何使用SAPI语音识别C控制游戏

Speech recognition 如何使用SAPI语音识别C控制游戏,speech-recognition,autoit,sapi,Speech Recognition,Autoit,Sapi,我一直在玩quakelive.com,对我的键盘绑定感到沮丧,我想用语音命令来绑定 我想我应该创建一个c控制台应用程序在后台运行,并使用SAPI for windows 7 64位内置的语音识别引擎来完成所有繁重的语音任务。我的程序将听取演讲,并做出相应的回应。但是,我不知道如何在玩游戏时在后台运行我的console应用程序,同时使用ms语音识别 这是我到目前为止写的: using System; using System.Collections.Generic; using System.Di

我一直在玩quakelive.com,对我的键盘绑定感到沮丧,我想用语音命令来绑定

我想我应该创建一个c控制台应用程序在后台运行,并使用SAPI for windows 7 64位内置的语音识别引擎来完成所有繁重的语音任务。我的程序将听取演讲,并做出相应的回应。但是,我不知道如何在玩游戏时在后台运行我的console应用程序,同时使用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语音识别在我的游戏运行时运行,让我的控制台应用程序听我说的特定单词。正如您在我的示例代码中所看到的,我正在侦听短语1,我使用autoIt将文本以及一些控制字符发送到记事本,以在写入文本时选择所有文本

到目前为止它还不起作用。似乎我的控制台应用程序必须有焦点或是前台应用程序,即使这样,当我说一两个ms语音识别之类的词时,也会尝试用我的应用程序进行控制台通信,而不仅仅是向它传递听写文本。例如,当我说单词one时,它一直在说moving,因为我认为它认为console不是文档,所以它必须是命令,而不是听写

有人能看出我做错了什么,以及如何让它按我的意愿工作吗

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


任何有任何帮助或建议的人都将不胜感激。

创建SpeechRecognitor时,您正在创建一个使用Windows桌面识别的共享识别器。当你说“它试图做控制台comand之类的事情”时,我怀疑这是因为你使用的是shared Recogizer,它用于从桌面控制应用程序。如果要使用专用于应用程序的语音,请创建SpeechRecognitionEngine。共享的Recogizer可以满足您的需要,但我认为您需要有一个专门的语法来正确控制您的应用程序

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

我不知道控制台应用程序是否需要在前台捕捉声卡。我怀疑,一旦您切换到inproc识别器,即使在后台,应用程序也会继续运行

有关更多背景信息,请参见。这可能是迄今为止我找到的最好的介绍性文章。这有点过时,但很有用。AppendResultKeyValue方法在测试后被删除。这是一个很好的起点