通過微軟的SAPI,不僅僅可以實現(xiàn)語音合成TTS,同樣可以實現(xiàn)語音識別SR。下面我們就介紹并貼出相關代碼。主要有兩種方式:
1、使用COM組件技術(shù),不管是C++,C#,Delphi都能玩的轉(zhuǎn),開發(fā)出來的東西在XP和WIN7都能跑。(注意要引入系統(tǒng)組件SpeechLib,XP要安裝識別引擎) 
2、使用WIN7的windows api,其實最終還是調(diào)用了SAPI,所以開發(fā)出來的東西就只能在WIN7上面跑。
其實不管是哪一種,都是調(diào)用SAPI,可能后一種代碼比較簡單。
使用第一種方式,需要注意在COM選項卡里面的Microsoft Speech object library引用
public class SpRecognition  {    private static SpRecognition _Instance = null;    private SpeechLib.ISpeechRecoGrammar isrg;    private SpeechLib.SpSharedRecoContextClass ssrContex = null;    public delegate void StringEvent(string str);    public StringEvent SetMessage;    private SpRecognition()    {      ssrContex = new SpSharedRecoContextClass();      isrg = ssrContex.CreateGrammar(1);      SpeechLib._ISpeechRecoContextEvents_RecognitionEventHandler recHandle =         new _ISpeechRecoContextEvents_RecognitionEventHandler(ContexRecognition);      ssrContex.Recognition += recHandle;    }    public void BeginRec()    {      isrg.DictationSetState(SpeechRuleState.SGDSActive);    }    public static SpRecognition instance()    {      if (_Instance == null)        _Instance = new SpRecognition();      return _Instance;    }    public void CloseRec()    {      isrg.DictationSetState(SpeechRuleState.SGDSInactive);    }    private void ContexRecognition(int iIndex, object obj, SpeechLib.SpeechRecognitionType type, SpeechLib.ISpeechRecoResult result)    {      if (SetMessage != null)      {        SetMessage(result.PhraseInfo.GetText(0, -1, true));      }    }  }第二種同樣需要引入,不過引入的是Win7中的.NET3.5類庫
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Speech;using System.Speech.Recognition;using System.Globalization;using System.Windows.Forms;namespace StudyBeta{  public class SRecognition  {    public SpeechRecognitionEngine recognizer = null;//語音識別引擎    public DictationGrammar dictationGrammar = null; //自然語法    public System.Windows.Forms.Control cDisplay; //顯示控件    public SRecognition(string[] fg) //創(chuàng)建關鍵詞語列表    {      CultureInfo myCIintl = new CultureInfo("en-US");      foreach (RecognizerInfo config in SpeechRecognitionEngine. InstalledRecognizers())//獲取所有語音引擎      {    if (config.Culture.Equals(myCIintl) && config.Id == "MS-1033-80-DESK" )        {          recognizer = new SpeechRecognitionEngine(config);          break;        }//選擇美國英語的識別引擎      }      if (recognizer != null)      {        InitializeSpeechRecognitionEngine(fg);//初始化語音識別引擎        dictationGrammar = new DictationGrammar();      }      else      {        MessageBox.Show("創(chuàng)建語音識別失敗");      }    }    private void InitializeSpeechRecognitionEngine(string[] fg)    {      recognizer.SetInputToDefaultAudioDevice();//選擇默認的音頻輸入設備      Grammar customGrammar = CreateCustomGrammar(fg);  //根據(jù)關鍵字數(shù)組建立語法      recognizer.UnloadAllGrammars();      recognizer.LoadGrammar(customGrammar);  //加載語法recognizer.SpeechRecognized += new EventHandler <SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);recognizer.SpeechHypothesized += new EventHandler <SpeechHypothesizedEventArgs>(recognizer_SpeechHypothesized);    }    public void BeginRec(Control tbResult)//關聯(lián)窗口控件    {      TurnSpeechRecognitionOn();      TurnDictationOn();      cDisplay = tbResult;    }    public void over()//停止語音識別引擎    {      TurnSpeechRecognitionOff();    }    public virtual Grammar CreateCustomGrammar(string[] fg) //創(chuàng)造自定義語法    {      GrammarBuilder grammarBuilder = new GrammarBuilder();      grammarBuilder.Append(new Choices(fg));      return new Grammar(grammarBuilder);    }    private void TurnSpeechRecognitionOn()//啟動語音識別函數(shù)    {      if (recognizer != null)      {        recognizer.RecognizeAsync(RecognizeMode.Multiple); //識別模式為連續(xù)識別      }      else      {        MessageBox.Show("創(chuàng)建語音識別失敗");      }    }    private void TurnSpeechRecognitionOff()//關閉語音識別函數(shù)    {      if (recognizer != null)      {        recognizer.RecognizeAsyncStop();        TurnDictationOff();      }      else      {        MessageBox.Show("創(chuàng)建語音識別失敗");      }    }private void recognizer_SpeechRecognized(object sender, SpeechRecognized EventArgs e)    {  //識別出結(jié)果完成的動作,通常把識別結(jié)果傳給某一個控件      string text = e.Result.Text;      cDisplay.Text = text;    }    private void TurnDictationOn()    {      if (recognizer != null)      {        recognizer.LoadGrammar(dictationGrammar);  //加載自然語法      }      else      {        MessageBox.Show("創(chuàng)建語音識別失敗");      }    }    private void TurnDictationOff()    {      if (dictationGrammar != null)      {        recognizer.UnloadGrammar(dictationGrammar);  //卸載自然語法      }      else      {        MessageBox.Show("創(chuàng)建語音識別失敗");      }    }  }}新聞熱點
疑難解答