现在的位置: 首页 > 综合 > 正文

语音识别计算机用微软件的程序

2013年02月22日 ⁄ 综合 ⁄ 共 5809字 ⁄ 字号 评论关闭

通过微软的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("创建语音识别失败"); 
                } 
            } 
        } 
    } 

抱歉!评论已关闭.