首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#调用SAPI兑现语音识别的两种方法

2012-09-10 
C#调用SAPI实现语音识别的两种方法通过微软的SAPI,不仅仅可以实现语音合成TTS,同样可以实现语音识别SR。下

C#调用SAPI实现语音识别的两种方法
通过微软的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("创建语音识别失败");            }        }    }}

热点排行