2012-10-12 64 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是一個很好的開始。