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