淺談MFCC/HMM/GMM/EM/LM

說起語音識別,大家的第一反應就是那些看起來眼熟卻總也搞不清楚的概念和公式,比如MFCC、HMM、GMM、Viterbi圖、解碼對齊等等,再往下深入,哪個是哪個,具體用途是什麼,就都說不清楚了,總覺得那得是業內大牛才能搞懂的。去網上搜索,各種說法又五花八門,看到最後越來越亂。那麼,語音識別到底是怎麼一回事?學習門檻真的那麼高么?讓我們暫時把公式拋開,先來理解一下這些概念,沒基礎別怕,你一定能看懂。


語音識別的基本流程

語音的識別對於人類來說是很自然的一個過程,但要讓機器「聽懂」卻十分困難。一段音頻文件,機器怎麼才能知道它代表的是什麼意思呢?
語音識別要做的事,就是組CP:根據音頻文件來判斷對應的文本。當然,要讓機器真正的「聽懂」和「理解」,還涉及到很多其他的知識,語音識別只是其中一個環節。
图片
那麼機器接收到左邊這段語音之後,是怎麼把它一口口吞下去,最後吐出來一個「two」呢?下圖中,我們以最經典的基於GMM-HMM的語音識別框架為例,可以看到,經過數據準備、特徵提取、訓練、再到解碼,就可以獲取最終的結果。
图片
流程看完,是不是有人要問了:我知道你有道理,但是為什麼有道理呢?我不想聽你說理論,就想知道,你這每一個步驟用來幹嘛的?
下面我們舉一個例子,形象化理解GMM和HMM怎麼用到語音識別裡面來,這流程的每一塊到底都有什麼作用。
假設有如下兩段音頻,「我愛你」和「我恨你」,波形為:
图片
我們首先要對音頻文件進行特徵提取,這裡使用的特徵是MFCC/Fbank。提取以後就變成下面這些類似撲克牌的方塊,讓我們跟著發音順序來想像,這兩段音頻前面一部分的特徵序列,代表的是「我」,中間是「愛/恨」,末尾是「你」。
從圖中也可以看到,這兩部分音頻提取特徵後頭尾部分的相似性很強(都是「我」和「你」)。
图片
對於機器來說,開始並不知道這兩句話對應的具體文本是什麼,於是我們使用GMM進行聚類,分成ABCD四類(當然我們從上帝視角知道,ABCD依次對應我,愛,恨,你)。
再使用HMM對序列進行建模,得到A+B+D=「我愛你」,A+C+D=「我恨你」。二者結合,就能知道未知音頻1是「我愛你」,音頻2是「我恨你」。是不是看起來還沒有那麼難?
图片
當然實際的訓練和解碼比這個例子要複雜,每個音頻語料都需要用HCLG進行處理,每個音素也要用多個狀態來代表,並且需要多次迭代更新,這裡先不細說。
好了,大概了解之後,我們來稍微具體地介紹一下各部分的概念。


  特徵提取(MFCC/Fbank)
上面說到從音頻文件變到「撲克牌」,這就是特徵提取。我們播放音樂時一般看到的是時域的波形(橫軸是時間,縱軸是幅度),就像上面綠色的那個音頻文件。
但是時域波形並不能很好地表示語音的特徵,例如男聲低沉,女聲尖銳,要怎樣才能很方便地區分這些特徵呢?
「橫看成嶺側成峰」,有個叫傅里葉的大神上場了,他搞了一個公式,能將訊號從時域變換到頻域。我們常聽到的MFCC和Fbank就是語音識別的經典頻域特徵。

图片


  GMM和HMM
雖然都是MM,但這兩個MM其實沒啥關係。
GMM(Gaussian Mixture Model)混合高斯模型,就是一堆不同分布的高斯模型按一定比例組合在一起,用來對特徵進行分類;

HMM(Hidden Markov Model)是隱馬爾可夫模型,用來對序列進行建模,從一個觀測序列,推出對應的狀態序列,也就是「由果找因」。這裡的「因」一般是隱藏的,無法簡單的看出來的(除非你有透視眼),所以叫Hidden,潛變數、隱變數也都是這個意思。


  訓練和解碼
以孤立詞為例(單獨的one,two這種),不涉及上下文。訓練是幹嘛?建模型啊。先來一堆已經配對好的CP(訓練數據),用它來建立模型(HMM-GMM模型)。
參數定下來以後,收到未知的音頻,扔到剛才這個模型裡面,算算算,最後就吐出來一個結果「two」,這就是解碼。這就是一個迷你的語音識別的系統,簡單吧?

图片


  單音素和三音素
理解了孤立詞訓練和解碼,我們再稍微加點難度。世界上有那麼多詞,一個個訓練,那模型該有多大啊,肯定不實用。小時候我們是怎麼學語文英語的?對了,先學拼音和音標啊,學好了發音才能准啊。
這時候音素就派上用場了。比如one,分成W--AA--N,這樣每個音素(Phone)再去單獨建模,就更好用了。訓練好了模型,丟進去解碼,和上面孤立詞也是類似的。
图片
图片

但是發音不是這麼簡單的一個字一個字吐的,還和上下文(Context)有關係,每個音素要考慮前一個和後一個的影響,所以就有了三音素(Triphone)。


DNN-HMM

上面提到分類,那我們自然就想到DNN(Deep Neural Networks)深度神經網路。它也是一個功能十分強大的分類神器,我們完全可以用它來替換前面用來分類的GMM。於是就有了DNN-HMM。看起來也沒有那麼難,對吧?
图片

图片


整理一下

好了,感覺涉及到的術語有點多有點亂?我們來用一個簡單的例子串起來,梳理一下:詞、音素、三音素、詞典、語言模型、HMM、GMM、DNN等。
图片

我們發現,上面圖裡還有一部分沒見過的,那就是語言模型(Language Model,LM)。為什麼要引入語言模型呢?


語言模型LM

語言模型的本質,是一種約束。前面講的都是聲學模型,對序列進行HMM建模,對每個音素用GMM或者DNN進行概率密度建模。
我們用下面的圖來表示,可以理解成用聲學模型可以對動物的「頭」和「身體」進行建模,後面還需要把「頭」和「身體」搭配起來才是完整的動物。
图片
但是只使用聲學模型的話,會導致什麼缺陷呢?貓頭配虎身,狗頭配猴身,不符合實際情況(無法發音)。我們需要增加一種約束,保證「貓頭」配「貓身」,「狗頭」配「狗身」。這就是語言模型。
图片
图片
聲學模型搭配語言模型,最後才能獲取正確的結果。我們知道從一段音頻,經過提取特徵,HMM,GMM或DNN等,可以獲取狀態。
之的聲學模型,也就是流程圖的上半部分。現在我們加入了下半部分的語言模型約束,雙管齊下,最終轉換為對應文本。
图片

感覺意猶未盡?好吧,再來說說常提的兩個演算法:EM演算法和Viterbi


兩個演算法

  EM演算法
像HMM和GMM都是隱變數模型,這種模型麻煩在哪裡呢,一般都會有很多的變數,而且隱變數和模型參數互相影響,扯不清,纏纏綿綿到天涯牽。不要緊,我們有神器啊,EM(Expectation Maximization)演算法來了。
舉個例子:有一堆人,現在只有他們的身高數值,但是不知道男女具體各多少人,也不知道某個身高對應的人是男是女,需要算出男生的平均身高該怎麼辦?
分成兩步走,一個是E步,另外一個自然就是M步了(為什麼叫這個,其實是有對應含義的,我們先不管)。一堆變數不用怕,只要按規矩來,不要瞎動搞亂了就行。原則就是:一動一靜,交替迭代,最後就收斂到最佳的狀態。

图片


  Viterbi演算法
訓練,解碼,對齊等時候,總是提到維特比(Viterbi)這個詞。Viterbi演算法,Viterbi對齊,Viterbi圖,那維特比是什麼呢?
看下圖,維特比就是最優路徑。比如從教室去食堂,有12345條路,你可以直接過去,也可以越過高山跨過河流繞一大圈過去,殊途同歸,最後都能到食堂。
Viterbi演算法,就是算出概率最大的最優的路徑(正常人趕時間都會走最短的直線,對吧?就是這條),也就是下圖紅圈的那些,其他的都捨去。有個這個圖,正著算,反著回溯,也就都可以了。
图片
還想了解更多細節?快來深藍學院語音識別課程,讓我們給你仔細講講。第三期馬上報名截止了,手慢無。

作者:深藍學院語音教研組