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("创建语音识别失败");
      }
    }
  }
}
(0)

相关推荐

  • c#中SAPI使用总结——SpVoice的使用方法

    要使用SAPI,首先添加引用DotNetSpeech,请自行下载DotNetSpeech.dll. 初始化对象,SpVoice voice = new DotNetSpeech.SpVoiceClass(); 朗读时,使用 voice.Speak(string,SpeechVoiceSpeakFlags.SVSFlagsAsync); 暂停,使用 voice.Pause(); 从暂停中继续刚才的朗读,使用 voice.Resume(); 停止功能是大多资料都没有写清楚的,而且在网上很少能找到,这

  • 使用C#实现RTP数据包传输 参照RFC3550

    闲暇时折腾IP网络视频监控系统,需要支持视频帧数据包在网络内的传输.未采用H.264或MPEG4等编码压缩方式,直接使用Bitmap图片.由于对帧的准确到达要求不好,所以采用UDP传输.如果发生网络丢包现象则直接将帧丢弃.为了记录数据包的传输顺序和帧的时间戳,所以研究了下RFC3550协议,采用RTP包封装视频帧.并未全面深究,所以未使用SSRC和CSRC,因为不确切了解其用意.不过目前的实现情况已经足够了. 复制代码 代码如下: /// <summary>   /// RTP(RFC3550

  • RFC2702 Requirements for Traffic Engineering over MPLS

    基于MPLS的流量工程要求 (RFC2702   Requirements for Traffic Engineering over MPLS) 1. 介绍 2. 流量工程 2.1 流量工程性能指标 2.2 流量与资源控制 2.3 现有IGP控制机制的局限性 3. MPLS和流量工程  3.1MPLS导图  3.2 基于MPLS流量工程的基本问题 4.基于MPLS流量工程的增强功能 5.流量主干的属性和特征  5.1 双向的流量主干  5.2 对流量主干的基本操作 5.3 统计与性能监测 5.4

  • C#如何通过RFC连接sap系统

    先理解一下 RFC(Romote Function Call)远程函数调用 调用前提: 1.要想通过C# 通过RFC调用SAP端,SAP端要存在RFC远程调用的函数才行(例如SAP端通过SE37创建),要不然是无法调用的. 2.C#调用RFC要有NCO DLL支持(我们使用NCO3.0,VS2013,framework2.0才行否则会报错) 注:好多人64位系统,开发的时候报错,到处找支持64位的NCO3.0,这里可以说一下,是木有的,报错是困为Framework的原因.NCO3.0只支持2.0

  • C#中调用SAPI实现语音合成的2种方法

    我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方式有两种: 1.使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑.(要引入SpeechLib,好像在项目上点引用,然后选到系统COM吧,好久没弄,记不清楚了) 2.使用WIN7的windows api,其实最终还是调用了SAPI,所以开发出来的东西就只能在WIN7上面跑. 其实不管是哪一种,都是调用SAPI

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

    通过微软的SAPI,不仅仅可以实现语音合成TTS,同样可以实现语音识别SR.下面我们就介绍并贴出相关代码.主要有两种方式: 1.使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑.(注意要引入系统组件SpeechLib,XP要安装识别引擎) 2.使用WIN7的windows api,其实最终还是调用了SAPI,所以开发出来的东西就只能在WIN7上面跑. 其实不管是哪一种,都是调用SAPI,可能后一种代码比较简单. 使用第一种方式,需要注意在COM

  • 详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 Shell. exec 在同一个 Shell 内执行,但是父脚本中 exec 行之后的内容就不会再执行了 source 在同一个 Shell 中执行,在被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用,相当于合并两个脚本在执行. 第一种:fork 特点:会生成子PID而且可重复被

  • Flask中获取小程序Request数据的两种方法

    Flask中获取小程序Request数据的两种方法 作为后端屌对于前端确实讳莫如深,JS中的类型Object竟然不能直接通过POST传入到后台Flask中,您会发现获取的是[object Object],这货在Flask中只是个Str,哈哈... 于是,开始寻求解决方案: 方案一,通过GET或者POST传参,将Object转换为Str请求数据: 1.在util.js中定义一个JS函数: function json2Form(json) { var str = []; for (var p in

  • Android中获取控件宽高的4种方法集合

    借鉴自开发艺术 1.onWindowFocusChanged 这个方法会被调用多次,在View初始化完毕后会调用,当Activity的窗口得到焦点和失去焦点都会被调用一次(Activity继续执行和暂停执行时). @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { int width = view.getMeasur

  • ECharts调用接口获取后端数据的四种方法总结

    目录 方法一:在mounted中使用定时器调用eacharts方法(定时器可以获取到data中的数据) 方法二:在调用数据的时候调用图表(一个页面的所有数据都在这一个接口中) 方法三:使用chartes中的dataset数据集 方法四:在对应图表中,用ajax请求 注意 总结 使用eacharts做大屏,需要使用后端数据,下面的方法是自己试过有效的,有什么不对的,望各位大佬指点. 方法一:在mounted中使用定时器调用eacharts方法(定时器可以获取到data中的数据) mounted (

  • ASP.Net中利用CSS实现多界面的两种方法

    本文实例讲述了ASP.Net中利用CSS实现多界面的两种方法.分享给大家供大家参考.具体实现方法如下: 可以通过使页面动态加载不同CSS来实现多界面的效果: 方法一: 复制代码 代码如下: <%@page language="C#"%> <%@import namespace="System.Data"%> <script language="c#" runat="server"> publ

  • Python中字典(dict)合并的四种方法总结

    本文主要给大家介绍了关于Python中字典(dict)合并的四种方法,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍: 字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型. 字典类型与序列类型的区别: 1. 存取和访问数据的方式不同. 2. 序列类型只用数字类型的键(从序列的开始按数值顺序索引

  • python3中获取文件当前绝对路径的两种方法

    方法1: import sys print(sys.argv) 得到文件当前绝对路径字符串的一个列表 ['D:/pycharm/PracticeProject/ClientServerNetworking.py'] 方法2: import os print(os.getcwd()) print(os.listdir()) print(os.path.join(os.getcwd(),os.listdir()[1])) D:\pycharm\PracticeProject ['.idea', 'C

  • JavaScript检查数据中是否存在相同的元素(两种方法)

    这里是两个用于数组中查找重复元素的demo,可以看看啦 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="text" id="Values" style=

  • python 统计list中各个元素出现的次数的几种方法

    利用字典dict来完成统计 举例: a = [1, 2, 3, 1, 1, 2] dict = {} for key in a: dict[key] = dict.get(key, 0) + 1 print dict 输出结果: >>>{1: 3, 2: 2, 3: 1} 利用Python的collection包下Counter的类 举例: from collections import Counter a = [1, 2, 3, 1, 1, 2] result = Counter(a)

随机推荐