zoukankan      html  css  js  c++  java
  • C#中调用SAPI实现语音识别的2种方法

    通过微软的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("创建语音识别失败");
          }
        }
      }
    }
    *********转载:https://m.jb51.net/article/67278.htm


  • 相关阅读:
    ElasticSearch 基础<转载>
    计算文本相似度方法总结(一)
    Java入门1---关键字、标识符、变量、运算符、流程控制、数组
    IntelliJ IDEA安装
    java代码转python代码
    python2和python3切换
    在markdown中插入github仓库中的图片
    MySQL:管理MySQL、事务(三)
    MySQL:查询、修改(二)
    MySQL:主键、外键、索引(一)
  • 原文地址:https://www.cnblogs.com/linybo/p/10126742.html
Copyright © 2011-2022 走看看