中文語音識別技術在c#中的應用(二)
2024-07-21 02:17:59
供稿:網友
接上篇《中文語音識別技術在c#中的應用(一)》………但是,這個方法本身并不知道你給的字符串是什么語言,所以需要我們它這個字符串用什么語言讀出。spvoiceclass 類的voice 屬性就是用來設置語種的,我們可以通過spvoiceclass 的getvoices方法得到所有的語種列表,然后在根據參數選擇相應的語種,比如設置語種為漢語如下所示:
private void setchinavoice()
{
voice.voice = voice.getvoices(string.empty,string.empty).item(0) ;
}
0表示是漢用,1234都表示英語,就是口音不同。
這樣,我們就設置了語種,如果結合發音方法,我們就可以設計出一個只發漢語語音的方法。
private void speakchina(string strspeak)
{
setchinavoice() ;
speak(strspeak) ;
}
只發英語語音的方法也是類似的,上面程序里有。
對于一段中英文混合的語言,我們讓程序讀出混合語音的方法就是:編程把這段語言的中英文分開,對于中文調用speakchina方法,英文調用speakenglishi方法;至于怎樣判斷一個字符是英文還是中文,我采用的是判斷asc碼的方法,具體的類方法是通過analysespeak實現的。
這樣,對于一段中英文混合文字,我們只需把它作為參數傳遞給analysespeak就可以了,他能夠完成中英文的混合發音。
當然,對于發音的暫定、繼續、停止等操作,上面也給出了簡單的方法調用,很容易明白。
下面簡單介紹一下中文語音識別的方法:
先把該語音識別的類源代碼貼在下面,然后再做說明:
public class sprecognition
{
private static sprecognition _instance = null ;
private speechlib.ispeechrecogrammar isrg ;
private speechlib.spsharedrecocontextclass ssrcontex =null;
private system.windows.forms.control cdisplay ;
private sprecognition()
{
ssrcontex = new spsharedrecocontextclass() ;
isrg = ssrcontex.creategrammar(1) ;
speechlib._ispeechrecocontextevents_recognitioneventhandler rechandle =
new _ispeechrecocontextevents_recognitioneventhandler(contexrecognition) ;
ssrcontex.recognition += rechandle ;
}
public void beginrec(control tbresult)
{
isrg.dictationsetstate(speechrulestate.sgdsactive) ;
cdisplay = tbresult ;
}
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)
{
cdisplay.text += result.phraseinfo.gettext(0,-1,true) ;
}
}
我們定義了ssrcontex 和isrg為語音識別的上下文和語法,通過設置isrg的dictationsetstate方法,我們可以開始或結束識別,在上面的程序中是beginrec和closerec方法。cdisplay 是我們用來輸出識別結果的地方,為了能夠在大部分控件上都可以顯示結果,我用了一個control 類來定義它。當然,每次語音識別后都會觸發ispeechrecocontextevents_recognitioneventhandler 事件,我們定義了一個這樣的方法contexrecognition來響應事件,并且在這個方法里輸出識別結果。
這樣,中文語音處理的一些最基本的問題就有了一個簡單的解決方法,當然,這種方法還有很多不完善的地方,希望大家多提出批評意見,共同提高。