原文:http://kevin19900306.iteye.com/blog/1206534

通过微软的SAPI,不仅仅可以实现语音合成TTS,同样可以实现语音识别SR。下面我们就介绍并贴出相关代码。主要有两种方式: 
1、使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑。(注意要引入系统组件SpeechLib,XP要安装识别引擎) 
2、使用WIN7的windows api,其实最终还是调用了SAPI,所以开发出来的东西就只能在WIN7上面跑。
 
其实不管是哪一种,都是调用SAPI,可能后一种代码比较简单。 

使用第一种方式,需要注意在COM选项卡里面的Microsoft Speech  object  library引用 

C#代码  收藏代码
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类库 

C# 代码  收藏代码
 
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("创建语音识别失败");  
            }  
        }  
    }  
}