2015-07-13 90 views
3

有2個部分給我的問題。使用語音命令啓用和禁用語音識別

  1. 有沒有辦法使用語音命令啓用語音識別。

  2. 是否有一種方法可以禁用語音識別功能,同時還可以讓其保持監聽或啓用命令以告訴它何時再次啓用語音識別功能。

這是我的想法是:

case "Stop Listening": 
    synthesizer.speakasync("Ok"); 
    recEngine.RecognizeAsyncStop(); 
    //Command or code here that wait's for the command "Start Listening" 
    recEngine.RecognizeAsyncStop "until" case "Start Listening" 
    break; 

我知道這是行不通的,因爲沒有「直到」命令,這樣我怎麼能去這樣做?

+0

如果沒有辦法按照我上面建議的方式做,那麼請給我另外的想法。謝謝。 – Sachin

回答

1

我處理這個的方式是讓它始終傾聽;我認爲這可能是'大傢伙'也是這樣做的,按照定義,如果您想使用語音命令開始收聽,那麼已經已經必須正在收聽。

在我的情況下,我想要一個程序總是在運行,所以我在構造函數中設置它。這聽起來像是你在做什麼:它有助於在這裏有一個明確的名稱添加到短語(想想說「嘿Cortana」或「確定谷歌」,它可以幫助它知道你正在嘗試用它)。假設你希望你的開頭詞是「嘿拉里,開始聽我說」。你會有第二個SpeechRecognitionEngine這個總是在那裏,但如果你使用主引擎關閉,當你想讓你的主引擎停止時再打開。

public partial class Form1 : Form 
    { 
     private Choices onOff = new Choices(); 
     private Choices recChoices = new Choices(); 
     private SpeechRecognitionEngine alwaysOnListener = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US")); 
     private SpeechRecognitionEngine recEngine = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US")); 

     public Form1() 
     { 
      InitializeComponent(); 
      onOff.Add(new string[] {"Hey Larry start listening to me"}); 
      GrammarBuilder gb = new GrammarBuilder(); 
      gb.Append(onOff); 
      Grammar g = new Grammar(gb); 
      alwaysOnListener.LoadGrammar(g); 
      alwaysOnListener.SpeechRecognized += alwaysOnListener_SpeechRecognized; 


      recChoices.Add(new string[] {"Stop Listening"}); 
      GrammarBuilder gb2 = new GrammarBuilder(); 
      gb2.Append(recChoices); 
      Grammar recGrammar = new Grammar(gb2); 
      recEngine.LoadGrammar(recGrammar); 
      recEngine.SpeechRecognized += recEngine_SpeechRecognized; 
     } 

     void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
     { 
      if (e.Result.Text.Equals("Stop Listening")) 
      { 
       recEngine.RecognizeAsyncStop(); 
       alwaysOnListener.RecognizeAsync(RecognizeMode.Multiple); 
      } 

     } 

     void alwaysOnListener_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
     { 
      if (e.Result.Text.Equals("Hey Larry start listening to me")) 
      { 
       recEngine.RecognizeAsync(RecognizeMode.Multiple); 
       alwaysOnListener.RecognizeAsyncStop(); 
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      alwaysOnListener.EmulateRecognize("Hey Larry start listening to me"); 
     } 

     private void btnStop_Click(object sender, EventArgs e) 
     { 
      recEngine.EmulateRecognize("Stop Listening"); 
     } 
    } 
+0

嘿。謝謝,我有點明白你的意思,但請你舉個簡單的例子。我明白你的意思。 – Sachin

+0

np,添加了一些示例代碼,並稍微改變了答案,以便更容易理解。 – DrewJordan

+0

當我嘗試運行我的程序時,它提出了一個說break的窗口。 – Sachin