這一篇文章實際上是參考了不少篇文章以後寫出的一篇對於語言模型的一篇科普文,目的是但願你們能夠對於語言模型有着更好地理解,從而在接下來的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。三、 語言模型(Language Model, LM)語言模型的做用能夠簡單理解爲消解多音字的問題,在聲學模型給出發音序列以後,從候選的文字序列中找出機率最大的字符串序列。
四、 解碼傳統的語音識別解碼都是創建在WFST的基礎之上,它是將HMM、詞典以及語言模型編譯成一個網絡。解碼就是在這個WFST構造的動態網絡空間中,找到最優的輸出字符序列。搜索一般使用Viterbi算法,另外爲了防止搜索空間爆炸,一般會採用剪枝算法,所以搜索獲得的結果可能不是最優結果。在end-to-end的語音識別系統中,最簡單的解碼方法是beam search。儘管end-to-end的聲學模型中已經包含了一個弱語言模型,可是利用額外的語言模型仍然可以提升識別性能,所以將傳統的基於WFST的解碼方式和Viterbi算法引入到end-to-end的語音識別系統中也是很是天然的。然而因爲聲學模型中弱語言模型的存在,解碼可能不是最優的。文章[yuki Kanda, 2016]提出在解碼的時候,須要將這個若語言模型減掉才能獲得最優結果。
這篇文章語音識別的技術原理是什麼?來自於這個問題的多個答案,之間加上了個人一些理解,也但願請這方面的專家可以多多指教.