1. 程式人生 > >C#中呼叫SAPI實現語音識別的2種方法

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