2012-01-17 97 views
1

我正在使用一個簡單的語音識別應用程序來控制通過並行端口的中繼,這是它應該如何工作的基本程序。在.NET中的語音識別不起作用

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Speech.Synthesis; 
using Microsoft.Speech.Recognition; 

namespace speechHardware 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Create a new SpeechRecognitionEngine instance. 
      var sre = new SpeechRecognitionEngine(); 
      SpeechSynthesizer s = new SpeechSynthesizer(); 
      Console.WriteLine("starting recognizer......."); 
      s.Speak("starting recognizer."); 

      // Create a simple grammar that recognizes "light on", "light off", or "fan on","fan off". 
      Choices colors = new Choices(); 
      Console.WriteLine("option list......."); 
      colors.Add("light on"); 
      colors.Add("light off"); 
      colors.Add("fan on"); 
      colors.Add("fan off"); 

      GrammarBuilder gb = new GrammarBuilder(); 
      gb.Append(colors); 
      Console.WriteLine("starting grammer builder......."); 

      // Create the actual Grammar instance, and then load it into the speech recognizer. 
      Grammar g = new Grammar(gb); 
      sre.LoadGrammar(g); 

      // Register a handler for the SpeechRecognized event. 
      sre.SpeechRecognized += SreSpeechRecognized; 
      //sre.SetInputToWaveFile("C:\Users\Raghavendra\Documents\MATLAB\test.wav"); 
      sre.SetInputToDefaultAudioDevice(); 
      Console.WriteLine("input device recognised.......");   
      s.Speak("input device recognised."); 
     sre.RecognizeAsync(RecognizeMode.Multiple); 
      Console.ReadLine(); 
      Console.WriteLine("stopping recognizer....."); 
      sre.RecognizeAsyncStop(); 

     } 
     static void SreSpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
     { 
      SpeechSynthesizer s = new SpeechSynthesizer(); 
      Console.WriteLine("\nSpeech Recognized: \t{0}" + e.Result.Confidence, e.Result.Text); 

      if (e.Result.Confidence < 0.85) 
       return; 

      switch (e.Result.Text) 
      { 
       case "light on": 
        light(1);      
        s.Speak("the light has been turned on."); 
        break; 
       case "light off": 
        light(0); 
        s.Speak("the light has been turned off."); 
        break; 
       case "fan on": 
        fan(1); 
        s.Speak("the fan has been turned on."); 
        break; 
       case "fan off": 
        fan(0); 
        s.Speak("the fan has been turned off."); 
        break; 
       default: 

        break; 
      } 
     } 
     static void light(int val) 
     { 
      Console.WriteLine("\nSpeech Recognized:light "); 
     } 

     static void fan(int val) 
     { 
      Console.WriteLine("\nSpeech Recognized: fan"); 
     } 


    } 
} 

這工作完全我的朋友的計算機上,但在我的電腦不承認什麼,我說,也許這是沒有得到的輸入。我們都有幾乎相同的配置。麥克風也運作良好,我不知道什麼是錯的。

我已經安裝了微軟 語音平臺 - 軟件開發工具包(SDK),10.2版(86版) 微軟語音平臺 - 服務器運行時,10.2版(86版)

請幫助我。

+0

嘗試記錄置信度值。看看它輸出什麼。 – WoLfulus 2012-01-17 12:54:51

+0

「我們都擁有幾乎相同的配置」。有什麼不同?如果您可以使配置相同並查看問題是否消失。當你知道有什麼不同時,你可以看到* *是否導致問題。 – ChrisF 2012-01-17 12:57:57

+0

您是否在控制面板 - 語音識別中運行了「訓練您的計算機以更好地理解您」? – 2012-01-17 13:45:38

回答

0

試着把一個較低的值置於信心之中。也許你的麥克風有太多的噪音,甚至靜音? :)

+0

我保持麥克風非常接近。 它給我幾乎0.9我的朋友 我也調試使用F11,它工作正常。我只是不明白什麼是錯的 – 2012-01-17 14:12:04

1

您正在調用sre.RecognizeAsyncStop();然後纔有機會識別任何演講。記住異步是非阻塞的,所以它不會等到語音被識別。刪除該行,它應該工作。

+0

我保持一個Console.ReadLine();聲明所以只有當我給它一些輸入程序的進展,所以我認爲這不是問題。 – 2012-01-17 14:18:39

2

我剛剛將Microsoft.Speech.Recognition替換爲System.Speech.Recognition並且工作正常。

不明白什麼是錯的。

0

我懷疑你的朋友正在運行windows xp,而你正在運行vista或7.我認爲微軟實際上已經將語音識別作爲os包中的一部分包含在xp中。這可能是您爲什麼必須將包含從Microsoft更改爲System的可能答案。