說(shuō)起語(yǔ)音識(shí)別,大家的第一反應(yīng)就是那些看起來(lái)眼熟卻總也搞不清楚的概念和公式,比如MFCC、HMM、GMM、Viterbi圖、解碼對(duì)齊等等,再往下深入,哪個(gè)是哪個(gè),具體用途是什么,就都說(shuō)不清楚了,總覺(jué)得那得是業(yè)內(nèi)大牛才能搞懂的。去網(wǎng)上搜索,各種說(shuō)法又五花八門,看到最后越來(lái)越亂。那么,語(yǔ)音識(shí)別到底是怎么一回事?學(xué)習(xí)門檻真的那么高么?讓我們暫時(shí)把公式拋開,先來(lái)理解一下這些概念,沒(méi)基礎(chǔ)別怕,你一定能看懂。 淺談MFCC/HMM/GMM/EM/LM 語(yǔ)音識(shí)別的基本流程 語(yǔ)音的識(shí)別對(duì)于人類來(lái)說(shuō)是很自然的一個(gè)過(guò)程,但要讓機(jī)器“聽懂”卻十分困難。一段音頻文件,機(jī)器怎么才能知道它代表的是什么意思呢?語(yǔ)音識(shí)別要做的事,就是組CP:根據(jù)音頻文件來(lái)判斷對(duì)應(yīng)的文本。當(dāng)然,要讓機(jī)器真正的“聽懂”和“理解”,還涉及到很多其他的知識(shí),語(yǔ)音識(shí)別只是其中一個(gè)環(huán)節(jié)。 那么機(jī)器接收到左邊這段語(yǔ)音之后,是怎么把它一口口吞下去,最后吐出來(lái)一個(gè)“two”呢?下圖中,我們以最經(jīng)典的基于GMM-HMM的語(yǔ)音識(shí)別框架為例,可以看到,經(jīng)過(guò)數(shù)據(jù)準(zhǔn)備、特征提取、訓(xùn)練、再到解碼,就可以獲取最終的結(jié)果。 流程看完,是不是有人要問(wèn)了:我知道你有道理,但是為什么有道理呢?我不想聽你說(shuō)理論,就想知道,你這每一個(gè)步驟用來(lái)干嘛的?下面我們舉一個(gè)例子,形象化理解GMM和HMM怎么用到語(yǔ)音識(shí)別里面來(lái),這流程的每一塊到底都有什么作用。 假設(shè)有如下兩段音頻,“我愛你”和“我恨你”,波形為: 我們首先要對(duì)音頻文件進(jìn)行特征提取,這里使用的特征是MFCC/Fbank。提取以后就變成下面這些類似撲克牌的方塊,讓我們跟著發(fā)音順序來(lái)想象,這兩段音頻前面一部分的特征序列,代表的是“我”,中間是“愛/恨”,末尾是“你”。從圖中也可以看到,這兩部分音頻提取特征后頭尾部分的相似性很強(qiáng)(都是“我”和“你”)。 對(duì)于機(jī)器來(lái)說(shuō),開始并不知道這兩句話對(duì)應(yīng)的具體文本是什么,于是我們使用GMM進(jìn)行聚類,分成ABCD四類(當(dāng)然我們從上帝視角知道,ABCD依次對(duì)應(yīng)我,愛,恨,你)。再使用HMM對(duì)序列進(jìn)行建模,得到A+B+D=“我愛你”,A+C+D=“我恨你”。二者結(jié)合,就知道未知音頻1是“我愛你”,音頻2是“我恨你”。是不是看起來(lái)還沒(méi)有那么難? 當(dāng)然實(shí)際的訓(xùn)練和解碼比這個(gè)例子要復(fù)雜,每個(gè)音頻語(yǔ)料都需要用HCLG進(jìn)行處理,每個(gè)音素也要用多個(gè)狀態(tài)來(lái)代表,并且需要多次迭代更新,這里先不細(xì)說(shuō)。 好了,大概了解之后,我們來(lái)稍微具體地介紹一下各部分的概念。 特征提?。∕FCC/Fbank) 上面說(shuō)到從音頻文件變到“撲克牌”,這就是特征提取。我們播放音樂(lè)時(shí)一般看到的是時(shí)域的波形(橫軸是時(shí)間,縱軸是幅度),就像上面綠色的那個(gè)音頻文件。但是時(shí)域波形并不能很好地表示語(yǔ)音的特征,例如男聲低沉,女聲尖銳,要怎樣才能很方便地區(qū)分這些特征呢?“橫看成嶺側(cè)成峰”,有個(gè)叫傅里葉的大神上場(chǎng)了,他搞了一個(gè)公式,能將信號(hào)從時(shí)域變換到頻域。我們常聽到的MFCC和Fbank就是語(yǔ)音識(shí)別的經(jīng)典頻域特征。 GMM和HMM 雖然都是MM,但這兩個(gè)MM其實(shí)沒(méi)啥關(guān)系。 GMM(Gaussian Mixture Model)混合高斯模型,就是一堆不同分布的高斯模型按一定比例組合在一起,用來(lái)對(duì)特征進(jìn)行分類; HMM(Hidden Markov Model)是隱馬爾可夫模型,用來(lái)對(duì)序列進(jìn)行建模,從一個(gè)觀測(cè)序列,推出對(duì)應(yīng)的狀態(tài)序列,也就是“由果找因”。這里的“因”一般是隱藏的,無(wú)法簡(jiǎn)單的看出來(lái)的(除非你有透視眼),所以叫Hidden,潛變量、隱變量也都是這個(gè)意思。 訓(xùn)練和解碼 以孤立詞為例(單獨(dú)的one,two這種),不涉及上下文。訓(xùn)練是干嘛?建模型啊。先來(lái)一堆已經(jīng)配對(duì)好的CP(訓(xùn)練數(shù)據(jù)),用它來(lái)建立模型(HMM-GMM模型)。參數(shù)定下來(lái)以后,收到未知的音頻,扔到剛才這個(gè)模型里面,算算算,最后就吐出來(lái)一個(gè)結(jié)果“two”,這就是解碼。這就是一個(gè)迷你的語(yǔ)音識(shí)別的系統(tǒng),簡(jiǎn)單吧? 單音素和三音素 理解了孤立詞訓(xùn)練和解碼,我們?cè)偕晕⒓狱c(diǎn)難度。世界上有那么多詞,一個(gè)個(gè)訓(xùn)練,那模型該有多大啊,肯定不實(shí)用。小時(shí)候我們是怎么學(xué)語(yǔ)文英語(yǔ)的?對(duì)了,先學(xué)拼音和音標(biāo)啊,學(xué)好了發(fā)音才能準(zhǔn)啊。這時(shí)候音素就派上用場(chǎng)了。比如one,分成W--AA--N,這樣每個(gè)音素(Phone)再去單獨(dú)建模,就更好用了。訓(xùn)練好了模型,丟進(jìn)去解碼,和上面孤立詞也是類似的。 但是發(fā)音不是這么簡(jiǎn)單的一個(gè)字一個(gè)字吐的,還和上下文(Context)有關(guān)系,每個(gè)音素要考慮前一個(gè)和后一個(gè)的影響,所以就有了三音素(Triphone)。 DNN-HMM 上面提到分類,那我們自然就想到DNN(Deep Neural Networks)深度神經(jīng)網(wǎng)絡(luò)。它也是一個(gè)功能十分強(qiáng)大的分類神器,我們完全可以用它來(lái)替換前面用來(lái)分類的GMM。于是就有了DNN-HMM??雌饋?lái)也沒(méi)有那么難,對(duì)吧? 整理一下 好了,感覺(jué)涉及到的術(shù)語(yǔ)有點(diǎn)多有點(diǎn)亂?我們來(lái)用一個(gè)簡(jiǎn)單的例子串起來(lái),梳理一下:詞、音素、三音素、詞典、語(yǔ)言模型、HMM、GMM、DNN等。 我們發(fā)現(xiàn),上面圖里還有一部分沒(méi)見過(guò)的,那就是語(yǔ)言模型(Language Model,LM)。為什么要引入語(yǔ)言模型呢? 語(yǔ)言模型LM 語(yǔ)言模型的本質(zhì),是一種約束。前面講的都是聲學(xué)模型,對(duì)序列進(jìn)行HMM建模,對(duì)每個(gè)音素用GMM或者DNN進(jìn)行概率密度建模。我們用下面的圖來(lái)表示,可以理解成用聲學(xué)模型可以對(duì)動(dòng)物的“頭”和“身體”進(jìn)行建模,后面還需要把“頭”和“身體”搭配起來(lái)才是完整的動(dòng)物。 但是只使用聲學(xué)模型的話,會(huì)導(dǎo)致什么缺陷呢?貓頭配虎身,狗頭配猴身,不符合實(shí)際情況(無(wú)法發(fā)音)。我們需要增加一種約束,保證“貓頭”配“貓身”,“狗頭”配“狗身”。這就是語(yǔ)言模型。 聲學(xué)模型搭配語(yǔ)言模型,最后才能獲取正確的結(jié)果。我們知道從一段音頻,經(jīng)過(guò)提取特征,HMM,GMM或DNN等,可以獲取狀態(tài)。之的聲學(xué)模型,也就是流程圖的上半部分?,F(xiàn)在我們加入了下半部分的語(yǔ)言模型約束,雙管齊下,最終轉(zhuǎn)換為對(duì)應(yīng)文本。 感覺(jué)意猶未盡?好吧,再來(lái)說(shuō)說(shuō)常提的兩個(gè)算法:EM算法和Viterbi 兩個(gè)算法 EM算法 像HMM和GMM都是隱變量模型,這種模型麻煩在哪里呢,一般都會(huì)有很多的變量,而且隱變量和模型參數(shù)互相影響,扯不清,纏纏綿綿到天涯牽。不要緊,我們有神器啊,EM(Expectation Maximization)算法來(lái)了。 舉個(gè)栗子:有一堆人,現(xiàn)在只有他們的身高數(shù)值,但是不知道男女具體各多少人,也不知道某個(gè)身高對(duì)應(yīng)的人是男是女,需要算出男生的平均身高該怎么辦? 分成兩步走,一個(gè)是E步,另外一個(gè)自然就是M步了(為什么叫這個(gè),其實(shí)是有對(duì)應(yīng)含義的,我們先不管)。一堆變量不用怕,只要按規(guī)矩來(lái),不要瞎動(dòng)搞亂了就行。原則就是:一動(dòng)一靜,交替迭代,最后就收斂到最佳的狀態(tài)。 Viterbi算法 訓(xùn)練,解碼,對(duì)齊等時(shí)候,總是提到維特比(Viterbi)這個(gè)詞。Viterbi算法,Viterbi對(duì)齊,Viterbi圖,那維特比是什么呢?看下圖,維特比就是最優(yōu)路徑。比如從教室去食堂,有12345條路,你可以直接過(guò)去,也可以越過(guò)高山跨過(guò)河流繞一大圈過(guò)去,殊途同歸,最后都能到食堂。Viterbi算法,就是算出概率最大的最優(yōu)的路徑(正常人趕時(shí)間都會(huì)走最短的直線,對(duì)吧?就是這條),也就是下圖紅圈的那些,其他的都舍去。有個(gè)這個(gè)圖,正著算,反著回溯,也就都可以了。 還想了解更多細(xì)節(jié)?快來(lái)深藍(lán)學(xué)院語(yǔ)音識(shí)別課程,讓我們給你仔細(xì)講講。第三期馬上報(bào)名截止了,手慢無(wú)。 作者:深藍(lán)學(xué)院語(yǔ)音教研組 |
|