首页 > 编程 > C# > 正文

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

2020-01-24 01:47:18
字体:
来源:转载
供稿:网友

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表