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