语音识别的两种方法(转)

通过微软的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#代码  收藏代码
  1. public class SpRecognition  
  2.     {  
  3.         private static SpRecognition _Instance = null;  
  4.         private SpeechLib.ISpeechRecoGrammar isrg;  
  5.         private SpeechLib.SpSharedRecoContextClass ssrContex = null;  
  6.   
  7.         public delegate void StringEvent(string str);  
  8.         public StringEvent SetMessage;  
  9.   
  10.         private SpRecognition()  
  11.         {  
  12.             ssrContex = new SpSharedRecoContextClass();  
  13.             isrg = ssrContex.CreateGrammar(1);  
  14.             SpeechLib._ISpeechRecoContextEvents_RecognitionEventHandler recHandle =  
  15.                  new _ISpeechRecoContextEvents_RecognitionEventHandler(ContexRecognition);  
  16.             ssrContex.Recognition += recHandle;  
  17.         }  
  18.         public void BeginRec()  
  19.         {  
  20.             isrg.DictationSetState(SpeechRuleState.SGDSActive);  
  21.         }  
  22.         public static SpRecognition instance()  
  23.         {  
  24.             if (_Instance == null)  
  25.                 _Instance = new SpRecognition();  
  26.             return _Instance;  
  27.         }  
  28.         public void CloseRec()  
  29.         {  
  30.             isrg.DictationSetState(SpeechRuleState.SGDSInactive);  
  31.         }  
  32.         private void ContexRecognition(int iIndex, object obj, SpeechLib.SpeechRecognitionType type, SpeechLib.ISpeechRecoResult result)  
  33.         {  
  34.             if (SetMessage != null)  
  35.             {  
  36.                 SetMessage(result.PhraseInfo.GetText(0, -1, true));  
  37.             }  
  38.         }  
  39.     }  


第二种同样需要引入,不过引入的是Win7中的.NET3.5类库 

C# 代码  收藏代码
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5. using System.Speech;  
    6. using System.Speech.Recognition;  
    7. using System.Globalization;  
    8. using System.Windows.Forms;  
    9.   
    10. namespace StudyBeta  
    11. {  
    12.     public class SRecognition  
    13.     {  
    14.         public SpeechRecognitionEngine recognizer = null;//语音识别引擎  
    15.         public DictationGrammar dictationGrammar = null; //自然语法  
    16.         public System.Windows.Forms.Control cDisplay; //显示控件  
    17.   
    18.         public SRecognition(string[] fg) //创建关键词语列表  
    19.         {  
    20.             CultureInfo myCIintl = new CultureInfo("en-US");  
    21.             foreach (RecognizerInfo config in SpeechRecognitionEngine. InstalledRecognizers())//获取所有语音引擎  
    22.             {  
    23.         if (config.Culture.Equals(myCIintl) && config.Id == "MS-1033-80-DESK" )  
    24.                 {  
    25.                     recognizer = new SpeechRecognitionEngine(config);  
    26.                     break;  
    27.                 }//选择美国英语的识别引擎  
    28.             }  
    29.             if (recognizer != null)  
    30.             {  
    31.                 InitializeSpeechRecognitionEngine(fg);//初始化语音识别引擎  
    32.                 dictationGrammar = new DictationGrammar();  
    33.             }  
    34.             else  
    35.             {  
    36.                 MessageBox.Show("创建语音识别失败");  
    37.             }  
    38.         }  
    39.         private void InitializeSpeechRecognitionEngine(string[] fg)  
    40.         {  
    41.             recognizer.SetInputToDefaultAudioDevice();//选择默认的音频输入设备  
    42.             Grammar customGrammar = CreateCustomGrammar(fg);  
    43.             //根据关键字数组建立语法  
    44.             recognizer.UnloadAllGrammars();  
    45.             recognizer.LoadGrammar(customGrammar);  
    46.             //加载语法  
    47. recognizer.SpeechRecognized += new EventHandler <SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);  
    48. recognizer.SpeechHypothesized += new EventHandler <SpeechHypothesizedEventArgs>(recognizer_SpeechHypothesized);  
    49.         }  
    50.         public void BeginRec(Control tbResult)//关联窗口控件  
    51.         {  
    52.             TurnSpeechRecognitionOn();  
    53.             TurnDictationOn();  
    54.             cDisplay = tbResult;  
    55.         }  
    56.         public void over()//停止语音识别引擎  
    57.         {  
    58.             TurnSpeechRecognitionOff();  
    59.         }  
    60.         public virtual Grammar CreateCustomGrammar(string[] fg) //创造自定义语法  
    61.         {  
    62.             GrammarBuilder grammarBuilder = new GrammarBuilder();  
    63.             grammarBuilder.Append(new Choices(fg));  
    64.             return new Grammar(grammarBuilder);  
    65.         }  
    66.         private void TurnSpeechRecognitionOn()//启动语音识别函数  
    67.         {  
    68.             if (recognizer != null)  
    69.             {  
    70.                 recognizer.RecognizeAsync(RecognizeMode.Multiple);   
    71. //识别模式为连续识别  
    72.             }  
    73.             else  
    74.             {  
    75.                 MessageBox.Show("创建语音识别失败");  
    76.             }  
    77.         }  
    78.         private void TurnSpeechRecognitionOff()//关闭语音识别函数  
    79.         {  
    80.             if (recognizer != null)  
    81.             {  
    82.                 recognizer.RecognizeAsyncStop();  
    83.                 TurnDictationOff();  
    84.             }  
    85.             else  
    86.             {  
    87.                 MessageBox.Show("创建语音识别失败");  
    88.             }  
    89.         }  
    90. private void recognizer_SpeechRecognized(object sender, SpeechRecognized EventArgs e)  
    91.         {  
    92.             //识别出结果完成的动作,通常把识别结果传给某一个控件  
    93.             string text = e.Result.Text;  
    94.             cDisplay.Text = text;  
    95.         }  
    96.         private void TurnDictationOn()  
    97.         {  
    98.             if (recognizer != null)  
    99.             {  
    100.                 recognizer.LoadGrammar(dictationGrammar);  
    101.                 //加载自然语法  
    102.             }  
    103.             else  
    104.             {  
    105.                 MessageBox.Show("创建语音识别失败");  
    106.             }  
    107.         }  
    108.         private void TurnDictationOff()  
    109.         {  
    110.             if (dictationGrammar != null)  
    111.             {  
    112.                 recognizer.UnloadGrammar(dictationGrammar);  
    113.                 //卸载自然语法  
    114.             }  
    115.             else  
    116.             {  
    117.                 MessageBox.Show("创建语音识别失败");  
    118.             }  
    119.         }  
    120.     }  
    121. }  

posted on 2013-05-20 09:29  秋毫  阅读(689)  评论(0编辑  收藏  举报

导航