語(yǔ)音識(shí)別的兩個(gè)方法
通過微軟的SAPI,不僅僅可以實(shí)現(xiàn)語(yǔ)音合成TTS,同樣可以實(shí)現(xiàn)語(yǔ)音識(shí)別SR。下面我們就介紹并貼出相關(guān)代碼。主要有兩種方式:
1、使用COM組件技術(shù),不管是C++,C#,Delphi都能玩的轉(zhuǎn),開發(fā)出來(lái)的東西在XP和WIN7都能跑。(注意要引入系統(tǒng)組件SpeechLib,XP要安裝識(shí)別引擎)
2、使用WIN7的windows api,其實(shí)最終還是調(diào)用了SAPI,所以開發(fā)出來(lái)的東西就只能在WIN7上面跑。
其實(shí)不管是哪一種,都是調(diào)用SAPI,可能后一種代碼比較簡(jiǎn)單。
使用第一種方式,需要注意在COM選項(xiàng)卡里面的Microsoft Speech object library引用
C#代碼 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類庫(kù)
C# 代碼
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;//語(yǔ)音識(shí)別引擎
public DictationGrammar dictationGrammar = null; //自然語(yǔ)法
public System.Windows.Forms.Control cDisplay; //顯示控件
public SRecognition(string[] fg) //創(chuàng)建關(guān)鍵詞語(yǔ)列表
{
CultureInfo myCIintl = new CultureInfo(“en-US”);
foreach (RecognizerInfo config in SpeechRecognitionEngine. InstalledRecognizers())//獲取所有語(yǔ)音引擎
{
if (config.Culture.Equals(myCIintl) && config.Id == “MS-1033-80-DESK” )
{
recognizer = new SpeechRecognitionEngine(config);
break;
}//選擇美國(guó)英語(yǔ)的識(shí)別引擎
}
if (recognizer != null)
{
InitializeSpeechRecognitionEngine(fg);//初始化語(yǔ)音識(shí)別引擎
dictationGrammar = new DictationGrammar();
}
else
{
MessageBox.Show(“創(chuàng)建語(yǔ)音識(shí)別失敗”);
}
}
private void InitializeSpeechRecognitionEngine(string[] fg)
{
recognizer.SetInputToDefaultAudioDevice();//選擇默認(rèn)的音頻輸入設(shè)備
Grammar customGrammar = CreateCustomGrammar(fg);
//根據(jù)關(guān)鍵字?jǐn)?shù)組建立語(yǔ)法
recognizer.UnloadAllGrammars();
recognizer.LoadGrammar(customGrammar);
//加載語(yǔ)法
recognizer.SpeechRecognized += new EventHandler 《SpeechRecognizedEventArgs》(recognizer_SpeechRecognized);
recognizer.SpeechHypothesized += new EventHandler 《SpeechHypothesizedEventArgs》(recognizer_SpeechHypothesized);
}
public void BeginRec(Control tbResult)//關(guān)聯(lián)窗口控件
{
TurnSpeechRecognitionOn();
TurnDictationOn();
cDisplay = tbResult;
}
public void over()//停止語(yǔ)音識(shí)別引擎
{
TurnSpeechRecognitionOff();
}
public virtual Grammar CreateCustomGrammar(string[] fg) //創(chuàng)造自定義語(yǔ)法
{
GrammarBuilder grammarBuilder = new GrammarBuilder();
grammarBuilder.Append(new Choices(fg));
return new Grammar(grammarBuilder);
}
private void TurnSpeechRecognitionOn()//啟動(dòng)語(yǔ)音識(shí)別函數(shù)
{
if (recognizer != null)
{
recognizer.RecognizeAsync(RecognizeMode.Multiple);
//識(shí)別模式為連續(xù)識(shí)別
}
else
{
MessageBox.Show(“創(chuàng)建語(yǔ)音識(shí)別失敗”);
}
}
private void TurnSpeechRecognitionOff()//關(guān)閉語(yǔ)音識(shí)別函數(shù)
{
if (recognizer != null)
{
recognizer.RecognizeAsyncStop();
TurnDictationOff();
}
else
{
MessageBox.Show(“創(chuàng)建語(yǔ)音識(shí)別失敗”);
}
}
private void recognizer_SpeechRecognized(object sender, SpeechRecognized EventArgs e)
{
//識(shí)別出結(jié)果完成的動(dòng)作,通常把識(shí)別結(jié)果傳給某一個(gè)控件
string text = e.Result.Text;
cDisplay.Text = text;
}
private void TurnDictationOn()
{
if (recognizer != null)
{
recognizer.LoadGrammar(dictationGrammar);
//加載自然語(yǔ)法
}
else
{
MessageBox.Show(“創(chuàng)建語(yǔ)音識(shí)別失敗”);
}
}
private void TurnDictationOff()
{
if (dictationGrammar != null)
{
recognizer.UnloadGrammar(dictationGrammar);
//卸載自然語(yǔ)法
}
else
{
MessageBox.Show(“創(chuàng)建語(yǔ)音識(shí)別失敗”);
}
}
}
}
語(yǔ)音識(shí)別的應(yīng)用有哪些
語(yǔ)音識(shí)別技術(shù)應(yīng)用有哪些?語(yǔ)音識(shí)別技術(shù)有著非常廣泛的應(yīng)用領(lǐng)域和市場(chǎng)前景。在語(yǔ)音輸入控制系統(tǒng)中,它使得人們可以甩掉鍵盤,通過識(shí)別語(yǔ)音中的要求、請(qǐng)求、命令或詢問來(lái)作出正確的響應(yīng),這樣既可以克服人工鍵盤輸入速度慢,極易出差錯(cuò)的缺點(diǎn),又有利于縮短系統(tǒng)的反應(yīng)時(shí)間,使人機(jī)交流變得簡(jiǎn)便易行,比如用于聲控語(yǔ)音撥號(hào)系統(tǒng)、聲控智能玩具、智能家電等領(lǐng)域。
在智能對(duì)話查詢系統(tǒng)中,人們通過語(yǔ)音命令,可以方便地從遠(yuǎn)端的數(shù)據(jù)庫(kù)系統(tǒng)中查詢與提取有關(guān)信息,享受自然、友好的數(shù)據(jù)庫(kù)檢索服務(wù),例如信息網(wǎng)絡(luò)查詢、醫(yī)療服務(wù)、銀行服務(wù)等。語(yǔ)音識(shí)別技術(shù)還可以應(yīng)用于自動(dòng)口語(yǔ)翻譯,即通過將口語(yǔ)識(shí)別技術(shù)、機(jī)器翻譯技術(shù)、語(yǔ)音合成技術(shù)等相結(jié)合,可將一種語(yǔ)言的語(yǔ)音輸入翻譯為另一種語(yǔ)言的語(yǔ)音輸出,實(shí)現(xiàn)跨語(yǔ)言交流。
語(yǔ)音識(shí)別技術(shù)在軍事斗爭(zhēng)領(lǐng)域里也有著極為重要的應(yīng)用價(jià)值和極廣闊的應(yīng)用空間。一些語(yǔ)音識(shí)別技術(shù)就是著眼于軍事活動(dòng)而研發(fā),并在軍事領(lǐng)域首先應(yīng)用、首獲成效的,軍事應(yīng)用對(duì)語(yǔ)音識(shí)別系統(tǒng)的識(shí)別精度、響應(yīng)時(shí)間、惡劣環(huán)境下的頑健性都提出了更高的要求。
目前,語(yǔ)音識(shí)別技術(shù)已在軍事指揮和控制自動(dòng)化方面得以應(yīng)用。比如,將語(yǔ)音識(shí)別技術(shù)應(yīng)用于航空飛行控制,可快速提高作戰(zhàn)效率和減輕飛行員的工作負(fù)擔(dān),飛行員利用語(yǔ)音輸人來(lái)代替?zhèn)鹘y(tǒng)的手動(dòng)操作和控制各種開關(guān)和設(shè)備,以及重新改編或排列顯示器上的顯示信息等,可使飛行員把時(shí)間和精力集中于對(duì)攻擊目標(biāo)的判斷和完成別的操作上來(lái),以便更快獲得信息來(lái)發(fā)揮戰(zhàn)術(shù)優(yōu)勢(shì)。
評(píng)論
查看更多