C#中调用SAPI实现语音识别的2种方法
程序员文章站
2022-06-14 17:26:32
通过微软的sapi,不仅仅可以实现语音合成tts,同样可以实现语音识别sr。下面我们就介绍并贴出相关代码。主要有两种方式:
1、使用com组件技术,不管是c++,c#,d...
通过微软的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("创建语音识别失败"); } } } }
上一篇: C#中简单的拆箱操作用法实例分析
下一篇: C#中简单的装箱操作实例分析