2014-03-19 43 views
1

我需要幫助。我想製作一個應用程序,它能夠識別我在說什麼,並且能夠做我說的東西。例如:帶有言論自由的語音識別

如果我說open [notepad],其中[notepad]可以是任何應用程序的名稱,它需要打開記事本。

我想我需要同時使用語法DictationGrammar,但我不知道怎麼辦。請幫幫我。謝謝。

我的代碼現在看起來像這樣:

string WelcomeSentence = "Hello sir, how are you today"; 
    SpeechSynthesizer sSynth = new SpeechSynthesizer(); 
    PromptBuilder pBuilder = new PromptBuilder(); 
    SpeechRecognitionEngine sRecognize = new SpeechRecognitionEngine(); 

    private void frmMain_Load(object sender, EventArgs e) 
    { 
     sSynth.SelectVoice("IVONA Amy"); 
     sSynth.SetOutputToDefaultAudioDevice(); 
     pBuilder.ClearContent(); 
     pBuilder.AppendText(WelcomeSentence); 
     sSynth.Speak(pBuilder); 

     Choices sList = new Choices(); 
     sList.Add(File.ReadAllLines(@"Commands.ekd")); 
     Grammar gr = new Grammar(new GrammarBuilder(sList)); 
     DictationGrammar dgr = new DictationGrammar(); 
     try 
     { 
      sRecognize.RequestRecognizerUpdate(); 
      sRecognize.LoadGrammar(gr); 
      sRecognize.SpeechRecognized += sRecognize_SpeechRecognized; 
      sRecognize.SetInputToDefaultAudioDevice(); 
      sRecognize.RecognizeAsync(RecognizeMode.Multiple); 
      sRecognize.Recognize(); 
     } 
     catch { return; } 
    } 
    private void sRecognize_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 
     if (e.Result.Text == "open notepad") 
     { 
      System.Diagnostics.Process.Start(@"C:\Windows\System32\Notepad.exe"); 
     } 
     else 
     { 
      pBuilder.ClearContent(); 
      pBuilder.AppendText(e.Result.Text); 
      sSynth.Speak(pBuilder); 
     } 
    } 

請幫助。

+0

在這個問題上,我給你添加代碼和創建一個可讀的問題的滿分。但我認爲它太廣泛了。你需要把你的問題縮小到更具體的語言。 – paqogomez

+0

FWIW ..你可能會在幾個月前對[我發佈的答案](http://stackoverflow.com/a/18605036/2589202)感興趣。 – paqogomez

+0

我不知道我還能說什麼。我只想讓應用程序將open命令識別爲命令,並將notepad識別爲未添加到語法中的應用程序。 – TheNeosrb

回答

1

以下連同回答I posted several months ago,我提供這個建議。

認識到我要放棄SpeechFactory課程和大部分MySpeechMethods課程,請從其他答案複製它。另外,正如在其他答案中指出的那樣,你必須做一些錯誤處理。有了這個警告,你可以用這種方式修改你自己的代碼。

private void sRecognize_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
{ 
    var methods = new MySpeechMethods(); 
    MethodInfo myMethod; 
    myMethod = SpeechFactory.GetSpeechMethod(e.Result.Text); 

    if(myMethod != null) return;   
    pBuilder.ClearContent(); 
    pBuilder.AppendText(e.Result.Text); 
    sSynth.Speak(pBuilder); 
} 

然後在MySpeechMethods你會有你的命令。

public class MySpeechMethods 
{ 
    [Speech("Open Notepad")] 
    public void OpenNotepad() 
    { 
     System.Diagnostics.Process.Start(@"C:\Windows\System32\Notepad.exe"); 
    } 
//... 
+0

我一定會執行這個,這很好。但這不是我正在尋找的。使用你的代碼,該方法將會被打開(執行應用程序的命令)。因此,用戶說開放,計算機將其識別爲一個命令,接下來他說是記事本,這是需要更改的應用程序的名稱。所以,使用你的代碼,我需要爲我想用我的應用程序運行的每個應用程序編寫一個方法。你知道我想要知道什麼嗎? – TheNeosrb

+0

@TheNeosrb是的,我要對此發表評論。它確實需要你映射每個命令。我不知道如何將程序的名稱翻譯成計算機上的路徑。這聽起來也不錯。容易說'刪除c:'。你應該知道你的程序正在啓動什麼程序。 – paqogomez

+0

@TheNeosrb如果它更容易,你可以從配置文件中讀取可能的文件,並以這種方式構建MySpeechMethods類。但這可能超出了這個問題的範圍。 – paqogomez