(4)語(yǔ)言模型訓(xùn)練:
語(yǔ)言模型是用來計(jì)算一個(gè)句子出現(xiàn)概率的概率模型。它主要用于決定哪個(gè)詞序列的可能性更大,或者在出現(xiàn)了幾個(gè)詞的情況下預(yù)測(cè)下一個(gè)即將出現(xiàn)的詞語(yǔ)的內(nèi)容。換一個(gè)說法說,語(yǔ)言模型是用來約束單詞搜索的。它定義了哪些詞能跟在上一個(gè)已經(jīng)識(shí)別的詞的后面(匹配是一個(gè)順序的處理過程),這樣就可以為匹配過程排除一些不可能的單詞。
語(yǔ)言建模能夠有效的結(jié)合漢語(yǔ)語(yǔ)法和語(yǔ)義的知識(shí),描述詞之間的內(nèi)在關(guān)系,從而提高識(shí)別率,減少搜索范圍。語(yǔ)言模型分為三個(gè)層次:字典知識(shí),語(yǔ)法知識(shí),句法知識(shí)。
對(duì)訓(xùn)練文本數(shù)據(jù)庫(kù)進(jìn)行語(yǔ)法、語(yǔ)義分析,經(jīng)過基于統(tǒng)計(jì)模型訓(xùn)練得到語(yǔ)言模型。語(yǔ)言建模方法主要有基于規(guī)則模型和基于統(tǒng)計(jì)模型兩種方法。統(tǒng)計(jì)語(yǔ)言模型是用概率統(tǒng)計(jì)的方法來揭示語(yǔ)言單位內(nèi)在的統(tǒng)計(jì)規(guī)律,其中N-Gram模型簡(jiǎn)單有效,被廣泛使用。它包含了單詞序列的統(tǒng)計(jì)。
N-Gram模型基于這樣一種假設(shè),第n個(gè)詞的出現(xiàn)只與前面N-1個(gè)詞相關(guān),而與其它任何詞都不相關(guān),整句的概率就是各個(gè)詞出現(xiàn)概率的乘積。這些概率可以通過直接從語(yǔ)料中統(tǒng)計(jì)N個(gè)詞同時(shí)出現(xiàn)的次數(shù)得到。常用的是二元的Bi-Gram和三元的Tri-Gram。
Sphinx中是采用二元語(yǔ)法和三元語(yǔ)法的統(tǒng)計(jì)語(yǔ)言概率模型,也就是通過前一個(gè)或兩個(gè)單詞來判定當(dāng)前單詞出現(xiàn)的概率P(w2| w1),P(w3| w2, w1)。
(5)語(yǔ)音解碼和搜索算法:
解碼器:即指語(yǔ)音技術(shù)中的識(shí)別過程。針對(duì)輸入的語(yǔ)音信號(hào),根據(jù)己經(jīng)訓(xùn)練好的HMM聲學(xué)模型、語(yǔ)言模型及字典建立一個(gè)識(shí)別網(wǎng)絡(luò),根據(jù)搜索算法在該網(wǎng)絡(luò)中尋找最佳的一條路徑,這個(gè)路徑就是能夠以最大概率輸出該語(yǔ)音信號(hào)的詞串,這樣就確定這個(gè)語(yǔ)音樣本所包含的文字了。所以解碼操作即指搜索算法:是指在解碼端通過搜索技術(shù)尋找最優(yōu)詞串的方法。
連續(xù)語(yǔ)音識(shí)別中的搜索,就是尋找一個(gè)詞模型序列以描述輸入語(yǔ)音信號(hào),從而得到詞解碼序列。搜索所依據(jù)的是對(duì)公式中的聲學(xué)模型打分和語(yǔ)言模型打分。在實(shí)際使用中,往往要依據(jù)經(jīng)驗(yàn)給語(yǔ)言模型加上一個(gè)高權(quán)重,并設(shè)置一個(gè)長(zhǎng)詞懲罰分?jǐn)?shù)。當(dāng)今的主流解碼技術(shù)都是基于Viterbi搜索算法的,Sphinx也是。
基于動(dòng)態(tài)規(guī)劃的Viterbi算法[url=]在每個(gè)時(shí)間點(diǎn)上的各個(gè)狀態(tài),計(jì)算解碼狀態(tài)序列對(duì)觀察序列的后驗(yàn)概率,保留概率最大的路徑[/url],并在每個(gè)節(jié)點(diǎn)記錄下相應(yīng)的狀態(tài)信息以便最后反向獲取詞解碼序列。Viterbi算法本質(zhì)上是一種動(dòng)態(tài)規(guī)劃算法,該算法遍歷HMM狀態(tài)網(wǎng)絡(luò)并保留每一幀語(yǔ)音在某個(gè)狀態(tài)的最優(yōu)路徑得分。
連續(xù)語(yǔ)音識(shí)別系統(tǒng)的識(shí)別結(jié)果是一個(gè)詞序列。解碼實(shí)際上是對(duì)詞表的所有詞反復(fù)搜索。詞表中詞的排列方式會(huì)影響搜索的速度,而詞的排列方式就是字典的表示形式。Sphinx系統(tǒng)中采用音素作為聲學(xué)訓(xùn)練單元,通常字典就用來記錄每個(gè)單詞由哪些個(gè)音素組成,也可以理解為對(duì)每個(gè)詞的發(fā)音進(jìn)行標(biāo)注。
N-best搜索和多遍搜索:為在搜索中利用各種知識(shí)源,通常要進(jìn)行多遍搜索,第一遍使用代價(jià)低的知識(shí)源(如聲學(xué)模型、語(yǔ)言模型和音標(biāo)詞典),產(chǎn)生一個(gè)候選列表或詞候選網(wǎng)格,在此基礎(chǔ)上進(jìn)行使用代價(jià)高的知識(shí)源(如4階或5階的N-Gram、4階或更高的上下文相關(guān)模型)的第二遍搜索得到最佳路徑。
對(duì)于語(yǔ)音識(shí)別過程個(gè)人的理解:
例如我對(duì)電腦說:“幫我打開“我的電腦”!”然后電腦得理解我說了什么,然后再執(zhí)行打開“我的電腦”的操作,那怎么實(shí)現(xiàn)呢?
這個(gè)得預(yù)先有一個(gè)工作,就是電腦得先學(xué)會(huì)“幫我打開“我的電腦”!”這句語(yǔ)音(實(shí)際上是一個(gè)波形)所代表的文字就是“幫我打開“我的電腦”!”這句詞串。那么如何讓它學(xué)會(huì)呢?
如果以音節(jié)(對(duì)漢語(yǔ)來說就是一個(gè)字的發(fā)音)為語(yǔ)音基元的話,那么電腦就是一個(gè)字一個(gè)字地學(xué)習(xí),例如“幫”字、“我”字等等,那么“幫”字怎么學(xué)習(xí)呢?也就是說電腦接收到一個(gè)“幫”字的語(yǔ)音波形,怎么分析理解才知道它代表的是“幫”字呢?首先我們需要建立一個(gè)數(shù)學(xué)模型來表示這個(gè)語(yǔ)音。因?yàn)檎Z(yǔ)音是連續(xù)的不平穩(wěn)的信號(hào),但是在短的時(shí)間內(nèi)可以認(rèn)為是平穩(wěn)的,所以我們需要分割語(yǔ)音信號(hào)為一幀一幀,假如大概25ms一幀,然后為了讓每一幀平穩(wěn)過渡,我們就讓每幀見存在重疊,假如重疊10ms。這樣每幀的語(yǔ)言信號(hào)就是平穩(wěn)的了,再?gòu)拿繋Z(yǔ)音信號(hào)中提取反映語(yǔ)音本質(zhì)特征的信息(去除語(yǔ)音信號(hào)中對(duì)于語(yǔ)音識(shí)別無用的冗余信息,同時(shí)達(dá)到降維)。那么采用什么特征最能表達(dá)每一幀的語(yǔ)音呢?MFCC是用的比較多的一種,這里不介紹了。然后我們就提取每一幀語(yǔ)音的MFCC特征,得到了是一系列的系數(shù),大概四五十個(gè)這樣,sphinx中是39個(gè)數(shù)字,組成了特征向量。好,那么我們就通過39個(gè)數(shù)字來描述每一幀的語(yǔ)音了,那不同的語(yǔ)音幀就會(huì)有不同的39個(gè)數(shù)字的組合,那我們用什么數(shù)學(xué)模型去描述這39個(gè)數(shù)字的分布情況呢?這里我們可以用一個(gè)混合高斯模型來表示著39個(gè)數(shù)字的分布,而混合高斯模型就存在著兩個(gè)參數(shù):均值和方差;那么實(shí)際上每一幀的語(yǔ)音就對(duì)應(yīng)著這么一組均值和方差的參數(shù)了。呵呵,挺啰嗦的啊。
好了,這樣“幫”字的語(yǔ)音波形中的一幀就對(duì)應(yīng)了一組均值和方差(HMM模型中的觀察序列),那么我們只需要確定“幫”字(HMM模型中的隱含序列)也對(duì)應(yīng)于這一組均值和方差就可以了。那么后者是怎么對(duì)應(yīng)的呢?這就是訓(xùn)練的作用了!我們知道描述一個(gè)HMM模型需要三個(gè)參數(shù):初始狀態(tài)概率分布π、隱含狀態(tài)序列的轉(zhuǎn)移矩陣A(就是某個(gè)狀態(tài)轉(zhuǎn)移到另一個(gè)狀態(tài)的概率觀察序列中的這個(gè)均值或者方差的概率)和某個(gè)隱含狀態(tài)下輸出觀察值的概率分布B(也就是某個(gè)隱含狀態(tài)下對(duì)應(yīng)于);而聲學(xué)模型可以用HMM模型來建模,也就是對(duì)于每一個(gè)建模的語(yǔ)音單元,我們需要找到一組HMM模型參數(shù)(π,A,B)就可以代表這個(gè)語(yǔ)音單元了。那么這三個(gè)參數(shù)怎么確定呢?訓(xùn)練!我們給出一個(gè)語(yǔ)音的數(shù)據(jù)庫(kù),指明說這個(gè)語(yǔ)音代表這個(gè)詞,然后讓電腦去學(xué)習(xí),也就是對(duì)數(shù)據(jù)庫(kù)進(jìn)行統(tǒng)計(jì),得到(π,A,B)這三個(gè)參數(shù)。
好了,一個(gè)字(建模單元)的聲學(xué)模型建立了。那漢語(yǔ)是不是有很多個(gè)字啊,那我們就得對(duì)每一個(gè)建立聲學(xué)模型了。假設(shè)就有幾千個(gè)模型,然后每個(gè)模型就有了三個(gè)或者5個(gè)HMM狀態(tài),那么如果你說的句子有10個(gè)字,那我們就得搜索這所有可能的模型去匹配你的語(yǔ)音,那是多么大的搜索空間了,這非常耗時(shí)。那我們就需要采用一個(gè)比較優(yōu)的搜索算法了(這里是Viterbi-Beam算法),它每搜索到一個(gè)狀態(tài)點(diǎn),就保留概率最大的,然后舍棄之前的狀態(tài)點(diǎn),這樣就裁剪了很多的搜索路徑,但因?yàn)楹雎粤酥暗穆窂?,所以它就只能得到一個(gè)局部的最優(yōu)解。
那假如出現(xiàn)以下情況呢?例如,It’s a nice day,從語(yǔ)音上可能會(huì)被識(shí)別為:It sun niced A,或者是It son ice day。從聲學(xué)模型來看它是無法區(qū)別這些結(jié)果,因?yàn)槠洳煌幹皇窃谟诿總€(gè)單詞的邊界劃分位置不同造成的。這時(shí)候語(yǔ)言模型就該閃亮登場(chǎng)了,從語(yǔ)義上判斷那個(gè)結(jié)果出現(xiàn)的概率最大,即為搜索結(jié)果。語(yǔ)言模型N-Gram基于這樣一種假設(shè),第n個(gè)詞的出現(xiàn)只與前面N-1個(gè)詞相關(guān),而與其它任何詞都不相關(guān),整句的概率就是各個(gè)詞出現(xiàn)概率的乘積。這些概率可以通過直接從語(yǔ)料中統(tǒng)計(jì)N個(gè)詞同時(shí)出現(xiàn)的次數(shù)得到。這樣就可以約束搜索,增加識(shí)別的準(zhǔn)確率了。