NLP入門之語音模型原理
這一篇文章其實(shí)是參考了很多篇文章之后寫出的一篇對(duì)于語言模型的一篇科普文,目的是希望大家可以對(duì)于語言模型有著更好地理解,從而在接下來的NLP學(xué)習(xí)中可以更順利的學(xué)習(xí).
1:傳統(tǒng)的語音識(shí)別方法:
這里我們講解一下是如何將聲音變成文字,如果有興趣的同學(xué),我們可以深入的研究.
首先我們知道聲音其實(shí)是一種波,常見的MP3等都是壓縮的格式,必須要轉(zhuǎn)化成非壓縮的純波形的文件來處理,下面以WAV的波形文件來示例:
在進(jìn)行語音識(shí)別之前,有的需要把首尾段的靜音進(jìn)行切除,進(jìn)行強(qiáng)制對(duì)齊,以此來降低對(duì)于后續(xù)步驟的干擾,整個(gè)靜音的切除技術(shù)一般稱為VAD,需要用到對(duì)于信號(hào)處理的一些技術(shù).
如果要對(duì)于聲音進(jìn)行分析,就需要對(duì)于聲音進(jìn)行分幀,也就是把聲音切成一小塊一小塊,每一小塊稱為一幀,分幀并不是簡(jiǎn)單地切開,而是使用的移動(dòng)窗函數(shù)來實(shí)現(xiàn)的,并且?guī)蛶g一般是有交疊的
就像上圖這樣
分幀之后,語音就變成了很多個(gè)小段,但是波形在時(shí)域上是沒有什么描述能力的,因此就必須要將波形進(jìn)行變換,常見的一種變換方法就是提取MFCC特征,然后根據(jù)人耳的生理特性,把每一幀波變成一個(gè)多維度向量,這個(gè)向量里是包含了這塊語音的內(nèi)容信息,這個(gè)過程叫做聲學(xué)特征的提取,但是實(shí)際方法有很多,基本類似.
至此,聲音就成了一個(gè)12行(假設(shè)聲學(xué)特征是12維)、N列的一個(gè)矩陣,稱之為觀察序列,這里N為總幀數(shù)。觀察序列如下圖所示,圖中,每一幀都用一個(gè)12維的向量表示,色塊的顏色深淺表示向量值的大小。
接下來就要介紹怎樣把這個(gè)矩陣變成文本了。首先要介紹兩個(gè)概念:
1:音素:
單詞的發(fā)音由音素構(gòu)成。對(duì)英語,一種常用的音素集是卡內(nèi)基梅隆大學(xué)的一套由39個(gè)音素構(gòu)成的音素集,參見The CMU Pronouncing Dictionary。漢語一般直接用全部聲母和韻母作為音素集,另外漢語識(shí)別還分有調(diào)無調(diào),不詳述。
1. 狀態(tài):這里理解成比音素更細(xì)致的語音單位就行啦。通常把一個(gè)音素劃分成3個(gè)狀態(tài)。
語音識(shí)別是怎么工作的呢?實(shí)際上一點(diǎn)都不神秘,無非是:
把幀識(shí)別成狀態(tài)(難點(diǎn))。
把狀態(tài)組合成音素。
把音素組合成單詞。
如下圖所示:
圖中,每個(gè)小豎條代表一幀,若干幀語音對(duì)應(yīng)一個(gè)狀態(tài),每三個(gè)狀態(tài)組合成一個(gè)音素,若干個(gè)音素組合成一個(gè)單詞。也就是說,只要知道每幀語音對(duì)應(yīng)哪個(gè)狀態(tài)了,語音識(shí)別的結(jié)果也就出來了。
那每幀音素對(duì)應(yīng)哪個(gè)狀態(tài)呢?有個(gè)容易想到的辦法,看某幀對(duì)應(yīng)哪個(gè)狀態(tài)的概率最大,那這幀就屬于哪個(gè)狀態(tài)。比如下面的示意圖,這幀在狀態(tài)S3上的條件概率最大,因此就猜這幀屬于狀態(tài)S3。
那這些用到的概率從哪里讀取呢?有個(gè)叫“聲學(xué)模型”的東西,里面存了一大堆參數(shù),通過這些參數(shù),就可以知道幀和狀態(tài)對(duì)應(yīng)的概率。獲取這一大堆參數(shù)的方法叫做“訓(xùn)練”,需要使用巨大數(shù)量的語音數(shù)據(jù),訓(xùn)練的方法比較繁瑣,這里不講。
但這樣做有一個(gè)問題:每一幀都會(huì)得到一個(gè)狀態(tài)號(hào),最后整個(gè)語音就會(huì)得到一堆亂七八糟的狀態(tài)號(hào)。假設(shè)語音有1000幀,每幀對(duì)應(yīng)1個(gè)狀態(tài),每3個(gè)狀態(tài)組合成一個(gè)音素,那么大概會(huì)組合成300個(gè)音素,但這段語音其實(shí)根本沒有這么多音素。如果真這么做,得到的狀態(tài)號(hào)可能根本無法組合成音素。實(shí)際上,相鄰幀的狀態(tài)應(yīng)該大多數(shù)都是相同的才合理,因?yàn)槊繋芏獭?/p>
解決這個(gè)問題的常用方法就是使用隱馬爾可夫模型(Hidden Markov Model,HMM)。這東西聽起來好像很高深的樣子,實(shí)際上用起來很簡(jiǎn)單: 第一步,構(gòu)建一個(gè)狀態(tài)網(wǎng)絡(luò)。 第二步,從狀態(tài)網(wǎng)絡(luò)中尋找與聲音最匹配的路徑。
這樣就把結(jié)果限制在預(yù)先設(shè)定的網(wǎng)絡(luò)中,避免了剛才說到的問題,當(dāng)然也帶來一個(gè)局限,比如你設(shè)定的網(wǎng)絡(luò)里只包含了“今天晴天”和“今天下雨”兩個(gè)句子的狀態(tài)路徑,那么不管說些什么,識(shí)別出的結(jié)果必然是這兩個(gè)句子中的一句。
那如果想識(shí)別任意文本呢?把這個(gè)網(wǎng)絡(luò)搭得足夠大,包含任意文本的路徑就可以了。但這個(gè)網(wǎng)絡(luò)越大,想要達(dá)到比較好的識(shí)別準(zhǔn)確率就越難。所以要根據(jù)實(shí)際任務(wù)的需求,合理選擇網(wǎng)絡(luò)大小和結(jié)構(gòu)。
搭建狀態(tài)網(wǎng)絡(luò),是由單詞級(jí)網(wǎng)絡(luò)展開成音素網(wǎng)絡(luò),再展開成狀態(tài)網(wǎng)絡(luò)。語音識(shí)別過程其實(shí)就是在狀態(tài)網(wǎng)絡(luò)中搜索一條最佳路徑,語音對(duì)應(yīng)這條路徑的概率最大,這稱之為“解碼”。路徑搜索的算法是一種動(dòng)態(tài)規(guī)劃剪枝的算法,稱之為Viterbi算法,用于尋找全局最優(yōu)路徑。
這里所說的累積概率,由三部分構(gòu)成,分別是:
觀察概率:每幀和每個(gè)狀態(tài)對(duì)應(yīng)的概率
轉(zhuǎn)移概率:每個(gè)狀態(tài)轉(zhuǎn)移到自身或轉(zhuǎn)移到下個(gè)狀態(tài)的概率
語言概率:根據(jù)語言統(tǒng)計(jì)規(guī)律得到的概率
其中,前兩種概率從聲學(xué)模型中獲取,最后一種概率從語言模型中獲取。語言模型是使用大量的文本訓(xùn)練出來的,可以利用某門語言本身的統(tǒng)計(jì)規(guī)律來幫助提升識(shí)別正確率。語言模型很重要,如果不使用語言模型,當(dāng)狀態(tài)網(wǎng)絡(luò)較大時(shí),識(shí)別出的結(jié)果基本是一團(tuán)亂麻。
這樣基本上語音識(shí)別過程就完成了。
2:端到端的模型
現(xiàn)階段深度學(xué)習(xí)在模式識(shí)別領(lǐng)域取得了飛速的發(fā)展,特別是在語音和圖像的領(lǐng)域,因?yàn)樯疃葘W(xué)習(xí)的特性,在語音識(shí)別領(lǐng)域中,基于深度學(xué)習(xí)的聲學(xué)模型現(xiàn)如今已經(jīng)取代了傳統(tǒng)的混合高斯模型GMM對(duì)于狀態(tài)的輸出進(jìn)行建模,因此在普通的深度神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)之上,基于長(zhǎng)短記憶網(wǎng)絡(luò)的遞歸神經(jīng)網(wǎng)絡(luò)對(duì)語音序列的強(qiáng)大的建模能力進(jìn)一步提高了語音識(shí)別的性能,但是這些方法依舊包含著最基礎(chǔ)的隱馬爾可夫HMM的基本結(jié)構(gòu),因此依舊會(huì)出現(xiàn)隱馬爾科夫模型的訓(xùn)練和解碼的復(fù)雜度問題.
基于深度學(xué)習(xí)的聲學(xué)模型訓(xùn)練過程必須是由傳統(tǒng)的混合高斯模型開始的,然后對(duì)訓(xùn)練數(shù)據(jù)集合進(jìn)行強(qiáng)制的對(duì)齊,然后進(jìn)行切分得到不同的聲學(xué)特征,其實(shí)傳統(tǒng)的方式并不利于對(duì)于整句話的全局優(yōu)化,并且這個(gè)方法也需要額外的語音學(xué)和語言學(xué)的知識(shí),比如發(fā)音詞典,決策樹單元綁定建模等等,搭建系統(tǒng)的門檻較高等問題.
一些科學(xué)家針對(duì)傳統(tǒng)的聲學(xué)建模的缺點(diǎn),提出了鏈接時(shí)序分類技術(shù),這個(gè)技術(shù)是將語音識(shí)別轉(zhuǎn)換為序列的轉(zhuǎn)換問題,這樣一來就可以拋棄了傳統(tǒng)的基于HMM的語音識(shí)別系統(tǒng)的一系列假設(shè),簡(jiǎn)化了系統(tǒng)的搭建流程,從而可以進(jìn)一步提出了端到端的語音識(shí)別系統(tǒng),減少了語音對(duì)于發(fā)音詞典的要求.
端到端的系統(tǒng)是由LSTM的聲學(xué)建模方法和CTC的目標(biāo)函數(shù)組成的,在CTC的準(zhǔn)則下,LSTM可以在訓(xùn)練過程中自動(dòng)的學(xué)習(xí)聲學(xué)的特征和標(biāo)注序列的對(duì)應(yīng)關(guān)系,也就不需要再進(jìn)行強(qiáng)制的對(duì)數(shù)據(jù)集合進(jìn)行對(duì)齊的過程了.并且可以根據(jù)各種語種的特點(diǎn),端到端識(shí)別直接在字或者單詞上進(jìn)行建模,但是因?yàn)槎说蕉说淖R(shí)別可能是意味著發(fā)展的趨勢(shì),但是因?yàn)橥耆葪壛苏Z音學(xué)的知識(shí),現(xiàn)如今在識(shí)別性能上仍然和傳統(tǒng)的基于深度學(xué)習(xí)的建模方法有著一定的差距,不過我最近在看的一篇論文中,基于端到端的藏語識(shí)別已經(jīng)達(dá)到甚至超過了現(xiàn)有的通用算法.
就拿藏語舉例,藏語是一種我國(guó)的少數(shù)民族語言,但是因?yàn)椴刈迦丝谳^少,相比起對(duì)于英文,漢語這樣的大語種來說,存在著語音數(shù)據(jù)收集困難的問題,在上一篇文章中我們可以知道,自然語言處理的最重要的需求就是語料,如果有很好的語料庫自然會(huì)事半功倍,這樣就導(dǎo)致了藏語的語音識(shí)別研究工作起步較晚,并且因?yàn)椴卣Z的語言學(xué)知識(shí)的匱乏進(jìn)一步阻礙了藏語語音識(shí)別的研究的進(jìn)展,在我國(guó),藏語是屬于一種單音節(jié)字的語言,在端到端的語音過程中,藏語是建模起來非常簡(jiǎn)單的一種語言,但是作為一種少數(shù)民族語言,語料不足會(huì)在訓(xùn)練過程中出現(xiàn)嚴(yán)重的稀疏性問題,并且很多人在研究現(xiàn)有的藏語詞典中發(fā)現(xiàn),如果完全崛棄現(xiàn)有的藏語發(fā)音詞典,完全不利用這樣的先驗(yàn)知識(shí),這樣其實(shí)也是不利于技術(shù)的發(fā)現(xiàn)的,因此現(xiàn)階段下,采用CTC和語言知識(shí)結(jié)合的方式來建模,可以解決在資源受限的情況下聲學(xué)的建模問題,使得基于端到端的聲學(xué)模型方法的識(shí)別率超過當(dāng)下基于隱馬爾科夫的雙向長(zhǎng)短時(shí)記憶模型.
在基于CD-DNN-HMM架構(gòu)的語音識(shí)別聲學(xué)模型中,訓(xùn)練DNN通常需要幀對(duì)齊標(biāo)簽。在GMM中,這個(gè)對(duì)齊操作是通過EM算法不斷迭代完成的,而訓(xùn)練DNN時(shí)需要用GMM進(jìn)行對(duì)齊則顯得非常別扭。因此一種不需要事先進(jìn)行幀對(duì)齊的方法呼之欲出。此外對(duì)于HMM假設(shè)一直受到詬病,等到RNN出現(xiàn)之后,使用RNN來對(duì)時(shí)序關(guān)系進(jìn)行描述來取代HMM成為當(dāng)時(shí)的熱潮。隨著神經(jīng)網(wǎng)絡(luò)優(yōu)化技術(shù)的發(fā)展和GPU計(jì)算能力的不斷提升,最終使用RNN和CTC來進(jìn)行建模實(shí)現(xiàn)了end-to-end語音識(shí)別的聲學(xué)模型。CTC的全稱是Connectionist Temporal Classification,中文翻譯大概是連接時(shí)序分類。它要達(dá)到的目標(biāo)就是直接將語音和相應(yīng)的文字對(duì)應(yīng)起來,實(shí)現(xiàn)時(shí)序問題的分類。
這里仍然可以描述為EM的思想:
E-step:使用BPTT算法優(yōu)化神經(jīng)網(wǎng)絡(luò)參數(shù);
M-step:使用神經(jīng)網(wǎng)絡(luò)的輸出,重新尋找最有的對(duì)齊關(guān)系。
CTC可以看成是一個(gè)分類方法,甚至可以看作是目標(biāo)函數(shù)。在構(gòu)建end-to-end聲學(xué)模型的過程中,CTC起到了很好的自動(dòng)對(duì)齊的效果。同傳統(tǒng)的基于CD-DNN-HMM的方法相比,對(duì)齊效果引用文章[Alex Graves,2006]中的圖是這樣的效果:
這幅圖可以理解:基于幀對(duì)齊的方法強(qiáng)制要求切分好的幀對(duì)齊到對(duì)應(yīng)的標(biāo)簽上去,而CTC則可以時(shí)幀的輸出為空,只有少數(shù)幀對(duì)齊到對(duì)應(yīng)的輸出標(biāo)簽上。這樣帶來的差別就是幀對(duì)齊的方法即使輸出是正確的,但是在邊界區(qū)域的切分也很難準(zhǔn)確,從而給DNN的訓(xùn)練引入錯(cuò)誤。c) End-to-end模型由于神經(jīng)網(wǎng)絡(luò)強(qiáng)大的建模能力,End-to-end的輸出標(biāo)簽也不再需要像傳統(tǒng)架構(gòu)一樣的進(jìn)行細(xì)分。例如對(duì)于中文,輸出不再需要進(jìn)行細(xì)分為狀態(tài)、音素或者聲韻母,直接將漢字作為輸出即可;對(duì)于英文,考慮到英文單詞的數(shù)量龐大,可以使用字母作為輸出標(biāo)簽。從這一點(diǎn)出發(fā),我們可以認(rèn)為神經(jīng)網(wǎng)絡(luò)將聲學(xué)符號(hào)到字符串的映射關(guān)系也一并建模學(xué)習(xí)了出來,這部分是在傳統(tǒng)的框架中時(shí)詞典所應(yīng)承擔(dān)的任務(wù)。針對(duì)這個(gè)模塊,傳統(tǒng)框架中有一個(gè)專門的建模單元叫做G2P(grapheme-to-phoneme),來處理集外詞(out of vocabulary,OOV)。在end-to-end的聲學(xué)模型中,可以沒有詞典,沒有OOV,也沒有G2P。這些全都被建模在一個(gè)神經(jīng)網(wǎng)絡(luò)中。另外,在傳統(tǒng)的框架結(jié)構(gòu)中,語音需要分幀,加窗,提取特征,包括MFCC、PLP等等。在基于神經(jīng)網(wǎng)絡(luò)的聲學(xué)模型中,通常使用更裸的Fbank特征。在End-to-en的識(shí)別中,使用更簡(jiǎn)單的特征比如FFT點(diǎn),也是常見的做法?;蛟S在不久的將來,語音的采樣點(diǎn)也可以作為輸入,這就是更加徹底的End-to-end聲學(xué)模型。除此之外,End-to-end的聲學(xué)模型中已經(jīng)帶有了語言模型的信息,它是通過RNN在輸出序列上學(xué)習(xí)得到的。但這個(gè)語言模型仍然比較弱,如果外加一個(gè)更大數(shù)據(jù)量的語言模型,解碼的效果會(huì)更好。因此,End-to-end現(xiàn)在指聲學(xué)模型部分,等到不需要語言模型的時(shí)候,才是完全的end-to-end。3、 語言模型(Language Model, LM)語言模型的作用可以簡(jiǎn)單理解為消解多音字的問題,在聲學(xué)模型給出發(fā)音序列之后,從候選的文字序列中找出概率最大的字符串序列。
4、 解碼傳統(tǒng)的語音識(shí)別解碼都是建立在WFST的基礎(chǔ)之上,它是將HMM、詞典以及語言模型編譯成一個(gè)網(wǎng)絡(luò)。解碼就是在這個(gè)WFST構(gòu)造的動(dòng)態(tài)網(wǎng)絡(luò)空間中,找到最優(yōu)的輸出字符序列。搜索通常使用Viterbi算法,另外為了防止搜索空間爆炸,通常會(huì)采用剪枝算法,因此搜索得到的結(jié)果可能不是最優(yōu)結(jié)果。在end-to-end的語音識(shí)別系統(tǒng)中,最簡(jiǎn)單的解碼方法是beam search。盡管end-to-end的聲學(xué)模型中已經(jīng)包含了一個(gè)弱語言模型,但是利用額外的語言模型仍然能夠提高識(shí)別性能,因此將傳統(tǒng)的基于WFST的解碼方式和Viterbi算法引入到end-to-end的語音識(shí)別系統(tǒng)中也是非常自然的。然而由于聲學(xué)模型中弱語言模型的存在,解碼可能不是最優(yōu)的。文章[yuki Kanda, 2016]提出在解碼的時(shí)候,需要將這個(gè)若語言模型減掉才能得到最優(yōu)結(jié)果。