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

来源:互联网 发布:阿里云 cdn 七牛 编辑:程序博客网 时间:2024/05/03 20:30
通过微软的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.     }  

0 0
原创粉丝点击