2012-10-12 44 views
0

我一直在玩quakelive.com,并且因为我的键盘绑定而感到沮丧,并且想要使用语音命令进行绑定。如何使用SAPI语音识别C#来控制游戏

我以为我会创建一个c#控制台应用程序在后台运行,并使用SAPI的内置语音识别引擎的Windows 7 64位做所有沉重的演讲的东西。我的程序会监听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); 
     } 
    } 
} 

基本上我想毫秒的语音识别到我的游戏运行的同时运行,并为我的控制台应用程序来侦听特定的单词我说。正如您在示例代码中所看到的,我正在倾听使用autoIt文本以及一些控制字符在写入时选择所有文本的短语“one”。

到目前为止它不工作。看起来我的控制台应用程序必须具有“焦点”或是前台应用程序,即便如此,当我说“一”或“两”这样的单词时,语音识别会尝试使用我的应用程序执行“控制台指令”听写文本。例如,当我说单词“one”时,它一直说“移动”,因为我认为它认为控制台不是文档,所以它必须是命令而不是听写。

任何人都可以看到我做错了什么,以及如何得到这个工作,因为我想?

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

任何与任何帮助或建议的赞赏。

回答

0

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

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

我不知道如果控制台应用程序需要在前台捕捉声卡。我怀疑,一旦你改变了inproc识别器,该应用程序即使在后台也会继续运行。请参考http://msdn.microsoft.com/en-us/magazine/cc163663.aspx。这可能是迄今为止我发现的最好的介绍性文章。这是有点过时,但非常helfpul。 (AppendResultKeyValue方法在测试版后被删除。)和http://msdn.microsoft.com/en-us/library/hh361625.aspx是一个很好的开始。