C#中挪用SAPI完成語音辨認的2種辦法。本站提示廣大學習愛好者:(C#中挪用SAPI完成語音辨認的2種辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中挪用SAPI完成語音辨認的2種辦法正文
經由過程微軟的SAPI,不只僅可以完成語音分解TTS,異樣可以完成語音辨認SR。上面我們就引見並貼出相干代碼。重要有兩種方法:
1、應用COM組件技巧,不論是C++,C#,Delphi都能玩的轉,開辟出來的器械在XP和WIN7都能跑。(留意要引入體系組件SpeechLib,XP要裝置辨認引擎)
2、應用WIN7的windows api,其實終究照樣挪用了SAPI,所以開辟出來的器械就只能在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) //創立症結詞語列表 { 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("創立語音辨認掉敗"); } } private void InitializeSpeechRecognitionEngine(string[] fg) { recognizer.SetInputToDefaultAudioDevice();//選擇默許的音頻輸出裝備 Grammar customGrammar = CreateCustomGrammar(fg); //依據症結字數組樹立語法 recognizer.UnloadAllGrammars(); recognizer.LoadGrammar(customGrammar); //加載語法 recognizer.SpeechRecognized += new EventHandler <SpeechRecognizedEventArgs>(recognizer_SpeechRecognized); recognizer.SpeechHypothesized += new EventHandler <SpeechHypothesizedEventArgs>(recognizer_SpeechHypothesized); } public void BeginRec(Control tbResult)//聯系關系窗口控件 { TurnSpeechRecognitionOn(); TurnDictationOn(); cDisplay = tbResult; } public void over()//停滯語音辨認引擎 { TurnSpeechRecognitionOff(); } public virtual Grammar CreateCustomGrammar(string[] fg) //發明自界說語法 { GrammarBuilder grammarBuilder = new GrammarBuilder(); grammarBuilder.Append(new Choices(fg)); return new Grammar(grammarBuilder); } private void TurnSpeechRecognitionOn()//啟動語音辨認函數 { if (recognizer != null) { recognizer.RecognizeAsync(RecognizeMode.Multiple); //辨認形式為持續辨認 } else { MessageBox.Show("創立語音辨認掉敗"); } } private void TurnSpeechRecognitionOff()//封閉語音辨認函數 { if (recognizer != null) { recognizer.RecognizeAsyncStop(); TurnDictationOff(); } else { MessageBox.Show("創立語音辨認掉敗"); } } 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("創立語音辨認掉敗"); } } private void TurnDictationOff() { if (dictationGrammar != null) { recognizer.UnloadGrammar(dictationGrammar); //卸載天然語法 } else { MessageBox.Show("創立語音辨認掉敗"); } } } }