软件编程
位置:首页>> 软件编程>> C#编程>> C#中调用SAPI实现语音识别的2种方法

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

作者:junjie  发布时间:2023-01-15 02:19:39 

标签:C#,SAPI,语音识别

通过微软的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
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com