語音識別ASR入門知識點
知乎live 語音識別的前世今生
GMM + HMM
應用場景,做輸入法,輸入一段話,變成文字,智慧地往裡面加標點符號。
特徵提取 最常用MFCC
一幀frame訊號,通常20-50ms(2-3個週期,人說話頻率100Hz),一個音素之內。
音素:音標的一個音,比如ei、si等
MFCC維度越高,幅度越小,13維最好。
孤立詞識別
對每一幀(有用資訊:音色(包絡))進行傅立葉變換 ➡️三角濾波得到filterbank output,基本可以作為特徵了➡️取對數log、離散餘弦變換DCT
壓縮成更小的規模,13個取樣點表示40個點的資訊➡️MFCC語音的表示方式。
即一幀資訊,轉換成一個13維的向量。
MFCC序列是最常用的特徵。主要描述頻譜包絡。
改進:一階二階差分,相鄰兩幀做差,得到上下文關係;各種歸一化
怎樣計算兩個特徵序列的距離?
動態彎演算法 DTW
- 讓待識別語音中的每一幀與模板中最相似的一幀匹配(模板,比如一個yes、no語音,待識別語音去匹配)
- 但要保持順序
- 動態規劃演算法
- 總距離為各幀的歐氏距離之和
GMM (高斯混合模型)
每次說yes可能是不一樣的,所以要多錄幾次yes,如果每個詞有多個模板,但總不能每個模板都去和待識別語音比較,最後取一個最好的吧,所以怎麼辦?
答:把模板壓縮成模型。把每個模板切成5段,比如把其中一個模板當成待識別語音,和上下兩個模板匹配,匹配的結果是吧某些向量放在同一個階段,
把每個階段的向量彙總起來。
五個階段(五個狀態)
簡略的表示這些向量:用高斯混合模型來擬合這些向量(13維空間的點)用模型來擬合在高維空間分佈的情況,哪些多,哪些少。
GMM迴圈訓練,要訓練好多輪,為什麼不是一次就達到最優解?:這是一個雞生蛋蛋生雞問題,由對齊方式更新模型引數,由模型引數更新對齊方式。首先瞎猜一個對齊方式,第一步得到的模型引數是在這個對齊方式下最優的,但這個對齊方式本身不是很優,所以在這個模型引數下去得到一個更好的對齊方式,然後又是更新的模型引數,迴圈到收斂。
決策樹
決策樹和HMM怎麼耦合的?:決策樹主要用在上下文有關模型裡,比如five裡的i和nine裡的i不一樣,nine裡的i和mine裡的i一樣,決策,就是進行一些提問,分開不同類,比如問是不是鼻音。
決策樹的演算法,比如根據最大資訊增益來分類結點,一開始所有上下文有關音素全在根結點,問一些問題,把音素分成兩批,最後放到葉子結點上。
訓練模型
- 把模板切分成多個段落(怎麼切?)
- 用高斯分佈的疊加擬合每段中特徵向量的分佈。對任一特徵向量,可給出概率密度,用概率密度代替向量間的歐式距離。
如何用模型識別未知語音?
- 用“動態彎”演算法對齊待識別語音與模型。
- 用GMM概率密度代替特徵向量間的歐氏距離;
- 相乘得到 P(待識別語音|模型)(這裡隱含了一個獨立性假設)
取概率最大的模型為識別結果
HMM (隱馬爾可夫模型)
語言模型
n-gram,比如Bigram(2-gram)、trigram:每個詞只與前n-1個詞有關。
- Bigram是馬爾可夫模型:
- 下一個詞只與當前詞有關;馬爾可夫:在HMM中,也說HMM是馬爾可夫模型,是指下一個狀態和觀測向量只與當前狀態有關。
- 模型是遍歷的,不是單向的。
- 可與單詞的聲學模型複合
- 得到一門語言的HMM。
把語言模型看成一個馬爾可夫模型的好處:可以與單詞的聲學模型複合。 比如PPT上,皮的三個狀態,是皮的聲學模型,聲學模型和語言模型複合後,就得到一個大的複合模型。大的轉移概率中,留在自身0.6,轉移出去概率0.4,皮到卡是0.5,所以皮到卡是0.4*0.5 = 0.2
;皮到丘是0.4*0.3 = 0.12
;
連續語音識別:
對於待識別語音(很多單詞),只需要在大的複合模型上走,一邊走一邊和待識別語音匹配,匹配過程就是計算狀態觀測概率的過程。最匹配的就是最佳路徑。可用viterbi解碼解決。有了最佳路徑之後,看最佳路徑上經過了哪些單詞的聲學模型,把單詞串起來,就是一句話的識別結果。
大詞彙量語音識別
當詞彙量大時,為每個單詞訓練HMM不現實。(因為每個單詞的模型是對這個單詞錄很多次音來訓練出來的),所以不能以單詞為單位訓練HMM,而要用更小的單位:音素
兩步:音素HMM拼接成單詞HMM(用詞典拼),單詞HMM複合成語言HMM。HCLG:H:HMM C:上下文 L:詞典 G:gram語言模型
得到大規模模型後,這個模型怎樣進行訓練和解碼?:
- 訓練
- 給定許多語音和對應的音素串,求模型引數
- 每個音素串的HMM是單向的,仍用EM演算法。 每句話的音素串已知,所以模型還是單向的,不需要知道語言模型。所以訓練過程和之前一樣的(EM演算法),即先瞎猜一個對齊,比如均勻分割,由它求出模型引數,用模型引數來更新對齊方式,由對齊方式再更新模型引數,這樣迭代到收斂。
- 解碼
- 給定一門語言的HMM(包括語言模型、詞典、聲學模型)和一條語音,求單詞串。
- (在剛才那個巨大的圖中)用Viterbi演算法求最佳路徑(beam search剪枝(因為路徑有太多了)):用狀態得到特徵向量,得到特徵向量最大概率。beam:每條路徑和當前最好路徑的差別,如果這條路徑離最好的概率相差太大,就放棄這條路徑,就剪枝。
- 最佳路徑經過的單詞為識別結果(也可以得到n-best list或lattice)
區分式訓練 (P32)
- EM演算法是最大似然估計
– 最大化P(X|W),W是訓練文字
– 但P(X|W’)可能更大了,W’是W的競爭者
– 導致P(W|X)不一定最大化 - 區分式訓練 (discriminative training)
– 讓P(X|W)大,同時讓P(X|W’)小
– 競爭者從哪兒來?
- 來自最大似然系統輸出的n-best list或lattice
比如W是訓練的yes,X是語音yes,W‘是訓練的no(競爭者),可能出現P(X|W’)比P(X|W)更大的情況,這是不希望發生的,所以要讓P(X|W)儘可能大,可以讓no的P小,但對於孤立詞識別還好,對於連續語音,就沒辦法設定競爭者了,因為數量太多了。所以用最大似然系統輸出n-best,比如hello world,競爭者就是halou world,hello word這種讀音接近的語音,讓它們的P小。
神經網路
神經元:
y = σ (w1 x1 + w2 x2 + w3 x3 + b)
σ
是非線性函式,稱為 “啟用函式” (activation function)
一層神經網路,寫成向量形式:
y = σ (Wx + b)
前饋神經網路 (feed-forward neural network):許多層神經網路摞起來
y = σ3 (W3 σ2 (W2 σ1 (W1 x + b1 ) + b2 ) + b3 )
多層非線性讓網路具有強大的擬合能力,但需要大量訓練資料
如何訓練神經網路?
- 神經網路是一個帶引數(W, b)的函式
- 設計損失函式 (loss function) (與W、b有關)
- 梯度下降法 (gradient descent) (損失函式對所有引數的導數)
- 反向傳播 (back-propagation) (鏈式法則)
Tandem結構 (P42)
神經網路不用MFCC
提取特徵了,用DNN
提取特徵。
語音訊號➡️特徵提取(DNN)➡️解碼器(聲學模型(GMM+HMM)、詞典、語言模型(Bigram))➡️識別結果
- 用神經網路提取特徵
- 輸入:
- 連續若干幀的濾波器組輸出 (濾波器:上文MFCC特徵提取需要濾波d)
– 甚至直接輸入波形
- 連續若干幀的濾波器組輸出 (濾波器:上文MFCC特徵提取需要濾波d)
- 輸出:
- 上下文有關音素的分佈(多類判別問題)(幾千個音素,幾千類判別問題)(給它周圍的連續若干幀濾波器組輸出,或給這一幀以及它周圍輸入的波形,讓神經網路去判決是哪一個上下文有關音素)
- 標準答案由GMM+HMM系統提供(先讓GMM+HMM跑一遍,得到一個還湊合的對齊方式,知道了每一幀所對應的上下文有關音素,用它來作為神經網路的標準答案)
- 特徵來自瓶頸層:醉翁之意不在酒(神經網路訓練好了之後,特徵從哪兒來:拿中間維數很小的一層出來作為特徵(代替MFCC))(後面幾層就沒用了)
Hybrid結構 (P44)
語音訊號➡️解碼器(聲學模型(DNN+HMM)、詞典、語言模型(Bigram))➡️識別結果 (去掉特徵提取)
- 不再進行特徵提取
– 輸入為濾波器組輸出或波形 DNN+HMM
聲學模型
– 原先,GMM
提供P(特徵|狀態)
– 現在,DNN
提供P(狀態|輸入)- 成品系統中沒有
GMM
– 但訓練DNN
時需要GMM+HMM
系統提供標答
Grapheme系統 (P53)
詞典:每個單詞怎麼發音,字元和音素之間的對應關係。
語言模型:單詞和單詞之間怎麼連線,哪些單詞連線概率大。上下文的任務。
kaldi的全部資料_v0.7
pdf:概率密度函式
SGMM:子空間高斯混合模型 (P55)
聲學建模程式碼 (P53)
kaldi裡的類:
DiagGmm:是一個簡單的、被動的物件,負責儲存高斯混合模型的參 數,並且有一個用於計算似然度的成員函式。它完全不知道自己會被如何使用, 它只提供獲取其成員的介面。它不獲取累計量 (Accumulation),不更新引數 (對於引數更新,參見 MlEstimateDiagGmm 類)。DiagGmm 類儲存引數的方式 是:方差的倒數,以及均值乘以方差倒數的結果。這意味著,通過簡單的內積操 作就可以計算似然度。
AmSgmm:一組 GMM 的集合。將其與HMM組合在一起由其他程式碼負責,主要是負責拓撲結構和轉移概率部分的程式碼以及負責整合解碼圖的程式碼
Karel 的深度神經網路訓練實現 (P59)
Karel Vesely 的 DNN 實現需要以下的技術:
- 基於 RBMS(受限波爾茲蔓機),每一層進行預訓練
- 每一幀進行交叉熵訓練
- 用格子框架通過 sMBR 準則(狀態的最小貝葉斯風險),對序列的區分性訓練
Sequence-discriminative training (sMBR)
這個階段,神經網路被訓練用來正確的對整個句子分類。sMBR 的目標就是最大化我們期望的正確率,但需要從參考的 transcriptions 的狀態標籤獲得。我們使用 lattice framework 來表 示 competing hypothesis。