如何使用SAPI语音识别C#来控制游戏

时间:2012-10-12 07:46:14

标签: speech-recognition autoit sapi

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

我以为我会创建一个c#console应用程序在后台运行,并使用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语音识别在我的游戏运行时运行,并且我的控制台应用程序听我说的特定单词。正如你在我的示例代码中看到的那样,我正在使用autoIt文本以及一些控制字符来监听我发送到记事本的短语“one”,以便在写入时选择所有文本。

到目前为止它还没有用。看起来我的控制台应用程序必须具有“焦点”或成为前台应用程序,甚至当我说像“一个”或“两个”ms语音识别的单词试图用我的应用程序做“控制台命令”的东西而不是仅仅通过听写文本。例如,当我说“one”这个词时,它一直说“移动”,因为我认为它认为控制台不是文件所以它必须是命令而不是听写。

任何人都可以看到我做错了什么以及如何按照我的意愿使用它?

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

任何有任何帮助或建议的人都会感激。

1 个答案:

答案 0 :(得分:0)

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

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

我不知道控制台应用程序是否需要在前台捕获声卡。我怀疑一旦你改变到inproc识别器,即使在后台,应用程序仍将继续运行。

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

相关问题