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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM