C#中調用SAPI實現(xiàn)語音識別的2種方法
通過微軟的SAPI,不僅僅可以實現(xiàn)語音合成TTS,同樣可以實現(xiàn)語音識別SR。下面我們就介紹并貼出相關代碼。主要有兩種方式:
1、使用COM組件技術,不管是C++,C#,Delphi都能玩的轉,開發(fā)出來的東西在XP和WIN7都能跑。(注意要引入系統(tǒng)組件SpeechLib,XP要安裝識別引擎)
2、使用WIN7的windows api,其實最終還是調用了SAPI,所以開發(fā)出來的東西就只能在WIN7上面跑。
其實不管是哪一種,都是調用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) { //識別出結果完成的動作,通常把識別結果傳給某一個控件 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)建語音識別失敗"); } } } }