高斯混合模型

CSND已永久停更,最新版唯一來源點擊下面鏈接跳轉:
語音增強和語音識別網頁書

##可能遇到的工具問題

gsc@X250:~/kaldi/egs/timit/s5$ ./run.sh 
==============================
Data & Lexicon & Language Preparation                     
==============================
wav-to-duration --read-entire-file=true scp:train_wav.scp ark,t:train_dur.ark 
LOG (wav-to-duration[5.2.18~1-7fa5f]:main():wav-to-duration.cc:92) Printed duration for 3696 audio files.
LOG (wav-to-duration[5.2.18~1-7fa5f]:main():wav-to-duration.cc:94) Mean duration was 3.06336, min and max durations were 0.91525, 7.78881
awk: line 12: function gensub never defined
gsc@X250:~/kaldi/egs/timit/s5$ sudo apt-get install gawk
local/timit_prepare_dict.sh: Error: the IRSTLM is not available or compiled

這裏寫圖片描述
圖1
然後將當前目錄生成的env.sh拷貝到/kaldi/tools/,這麼做是可以看path.sh文件裏指明瞭irstlm工具的路徑。
如果是單機訓練,則cmd.sh按如下方式修改:
這裏寫圖片描述
圖2

run.sh也要進行修改,修改timit數據所在目錄,和jobs數量
這裏寫圖片描述

##聲學模型參數

numLeavesTri1=2500
numGaussTri1=15000
numLeavesMLLT=2500
numGaussMLLT=15000
numLeavesSAT=2500
numGaussSAT=15000
numGaussUBM=400
numLeavesSGMM=7000
numGaussSGMM=9000

kaldi聲學模型代碼的設計哲學是,支持傳統的聲學模型(如, diagonal GMMs 和Subspace Gaussian Mixture Models),但是也容易擴展到新的聲學模型,如DNN。

###高斯模型
####協方差矩陣
均值爲μ\mu,方差爲σ\sigma的概率密度函數分佈特徵如下圖:

這裏寫圖片描述
圖 3高斯概率密度函數
單高斯分佈的方差爲
σx2=1N1i=1N(xiμ)2=E[(xE(x))(xE(x))]=σ(x,x)\sigma_x^2=\frac{1}{N-1}\sum_{i=1}^{N}(x_i-\mu)^2=E[(x-E(x))(x-E(x))]=\sigma(x,x)
方差可用於解釋對應特徵空間軸上數據分佈。如下圖:
這裏寫圖片描述
圖4協方差數據的座標表示
可以計算沿着xx軸的方差σ(x,x)\sigma(x,x)yy軸的方差σ(y,y)\sigma(y,y)。然而沿着x軸或者y軸並不能很好的描述對角互相關關係。上圖中,x和y是有關係的,當x增大時,y也增大,這以關係可以由協方差來表示:
σ(x,y)=E[(xE(x))(yE(y))]\sigma(x,y)=E[(x-E(x))(y-E(y))]
對於二維數據,可以得到σ(x,x),σ(y,y),σ(x,y),σ(y,x)\sigma(x,x), \sigma(y,y), \sigma(x,y), \sigma(y,x),這四個值可以使用矩陣來表示:
(3)[σ(x,x)σ(x,y)σ(y,x)σ(y,y)] \left[ \begin{matrix} \sigma(x,x)& \sigma(x,y) \\ \sigma(y,x)& \sigma(y,y) \end{matrix} \right] \tag{3}
如果x,y互爲正相關,也就是σ(x,y)=σ(y,x)\sigma(x,y)=\sigma(y,x)。這協方差矩陣關於主對角線對稱。
這裏寫圖片描述
圖5協方差矩陣決定了數據的形狀,對角範圍有協方差決定,軸向範圍由方差決定
如上圖可以知道,協方差矩陣定義了範圍(方差)和方向(協方差),所以可以使用向量來表示數據關係。根據特徵值和特徵相關的關係:
v=λv\sum \vec v=\lambda \vec v
其中v\vec v是特徵向量,λ\lambda是對應的特徵向量。紅色和綠色是特徵向量。
這裏寫圖片描述
圖6協方差矩陣的特徵向量
如果非對角協方差矩陣,則有:
這裏寫圖片描述
圖7協方差和方差對比圖
####協方差矩陣做爲線性變換
圖5可以看成是圖8的變換。
這裏寫圖片描述
圖8單位協方差矩陣稱爲白數據。
設圖8中的協方差是DD,則圖5中的矩陣可以通過線性變換得到:
D=TDD^{'}=TD
其中TT是旋轉矩陣RR和縮放矩陣SS的組合。
T=RST=RS
(3)R=[cosθsinθsinθcosθ]R= \left[ \begin{matrix} \cos \theta& - \sin \theta \\ \sin \theta & \cos \theta \end{matrix} \right] \tag{3}
θ\theta是旋轉角度,
(3)S=[sx00sy]S= \left[ \begin{matrix} s_x& 0 \\ 0& s_y \end{matrix} \right] \tag{3}
sxs_xsys_y分別是x和y軸的縮放因子。
####單高斯多維分佈(single GaussianModel, SGM)
N(x;u;C)=1(2π)nCexp[12(xμ)TC1(xμ)]N(\mathbf{x};\mathbf{u};C)=\frac{1}{\sqrt{(2\pi)^n}|C|}exp[-\frac{1}{2}(x-\mu)^TC^{-1}(x-\mu)]
其中,xx是維度爲nn的樣本向量,μ\mathbf{\mu}是期望,CC是協方差。
。對一段語音將使用25ms窗長,以10ms爲滑動窗長,那麼按時間將得到一系列的數據:$(0-10ms), (10ms-20ms),(20ms-30ms)… $,對於元音頻域(STFT)裏其共振峯可以做爲有效的信息,這樣可以降低高斯分佈的維度,對上述的每段語音使用MFCC方法來表徵語音的特徵。

MFCC
設輸入語音數據是8KHz或者16KHz,對信號進行與加重(-6dB/十倍頻衰減)s(t)=s(t)0.97s(t1)s^{'}(t)=s(t)-0.97s(t-1),對信號加小噪聲(dither算法)。取25ms窗長,以10ms滑動一次,乘以窗函數(如hamming),做傅里葉變換,爲每一個拼點取對數,按頻率軸做梅爾縮放,做離散餘弦變換獲得“導譜”,每個頻率成分按三角窗窗平滑,保留導譜的前13個係數,

將某一個觀測樣本的觀測值帶入上式後,可以認爲概率最高的,就是那個類,也就是對應的發音。
對於同一段語音,同一個人說幾次,每次發音都有細微的差別,但是是趨於高斯分佈的,也就是在±σ+μ\pm \sigma+\mu範圍內是絕大多數發音情況,這時就可以使用高斯分佈來描述這一分佈特徵了,也就是前文提到的SGM模型,然而當要對多個說話人識別時,比如,男人,女人,小孩,他們的發音特徵均值是不一樣的,這時使用SGM並不合適,如果給每個類型語音分配一個SGM。然後根據訓練語料給每個SGM分配一個權重再將其混合,就會得到使用高斯混合模型來描述語音。
這裏寫圖片描述

####高斯混合模型(Gaussian Mixture Model,GMM)
圖3給出的高斯模型有一個峯值,然而實際中要分類的特徵並不一定是單峯值的,(如,人的發音就有諧振峯存在),那怎麼模擬這麼多的峯值呢?使用高斯混合模型,將多個單高斯模型加在一起,(通常3~5個),這樣就可以表示具有多個峯值分佈的特徵問題了。
p(xi)=j=1MαjNj(Xi;μj,Cj),j=1Mαj=1p(\mathbf{x}_i)=\sum_{j=1}^M\alpha_jN_j(X_i;\mu_j,C_j), {\sum}_{j=1}^M\alpha_j=1
其是M個單高斯多維分佈的加權和,第j個SGN的權重爲αj\alpha_j
φj=(αj,μj,Cj)\varphi_j=(\alpha_j,\mu_j,C_j),GMM共有M個SGM,則需要根據樣本集x\mathbf{x}來估計GMM的所有參數,Φ=(φ1,...,φM)T\Phi=(\varphi_1,...,\varphi_M)^T
通常使用EM(expactation maximum)算法對GMM參數估計。
1.初始化
協方差矩陣Cj0C_{j0}設爲單位矩陣,每個模型比例的鮮豔概率αj0=1M\alpha_{j0}=\frac{1}{M};均值μj0\mu_{j0}設爲隨機數。由於期望EM迭代過程對初始值敏感,通常採用k均值聚類算法進行初始化。
2.估計步驟
則數據集上參數θ\theta的估計如下:
θ=argmaxθp(Xθ)\theta^{*}=\mathop{\arg\max}_{\theta}p(X|\theta)
根據貝葉斯準則,使用後驗概率進行估計參數:
θ=argmaxθp(θX)=argmaxθp(Xθ)p(θ)p(X)=argmaxθp(Xθ)p(θ)\theta^{*}=\mathop{\arg\max}_{\theta}p(\theta|X)=\mathop{\arg\max}_{\theta}\frac{p(X|\theta)p(\theta)}{p(X)}=\mathop{\arg\max}_{\theta}p(X|\theta)p(\theta)
αj\alpha_j的後驗概率爲:
βij=αjNj(xi;θ)k=1MαkNk(xi;θ),1in,1jn,\beta_{ij}=\frac{\alpha_jN_j(x_i;\theta^{*})}{\sum_{k=1}^M\alpha_kN_k(x_i;\theta^{*})}, 1 \leq i \leq n, 1 \leq j \leq n,

3.最大化步驟
αj=i=1NβijN\alpha_j=\frac{\sum_{i=1}^N\beta_{ij}}{N}
更新權值
μj=i=1Nxiβiji=1Nβij\mu_j=\frac{\sum_{i=1}^Nx_i\beta_{ij}}{\sum_{i=1}^N\beta_{ij}}
更新方差
Cj=i=1Nβij(xiμjT)(xiμjT)Ti=1NβijC_j=\frac{\sum_{i=1}^N\beta_{ij}(x_i-\mu_j^T)(x_i-\mu_j^T)^T}{\sum_{i=1}^N\beta_{ij}}
4.收斂條件
重複2,3,直到
P(Xθ)P(Xθ)<ϵP(X| \theta^{*} )-P(X| \theta )^{*'} \lt \epsilon
ϵ=105\epsilon=10^{-5}
####如何根據音頻文件,轉換成對應的文本
將使用統計模型,根據給定的訓練數據集,訓練該數據集對應的統計模型,該模型將爲句子-發音對分配概率,這樣當給定發音文件時,就可以譯碼成最有可能的句子。

數據準備
訓練數據集要求是經過標註過的,訓練數據集合要包括測試集合的所有發音。還要準備對應的發音字典,發音字典每個條目都是單詞-音素序列對,音素序列表示的是單詞的發音,這裏的音素只是一種記號。此外,還需要一些文本進行語言模型訓練。

訓練數據
LDC數據集合需要錢,發音字典有免費的,如CMUDict。如果是數百小時的語音數據訓練集合,則最好在集羣服務器上訓練。
##生成MFCC特徵

gsc@X250:~/kaldi/egs/yesno/s5$ head -5 exp/make_mfcc/train_yesno/make_mfcc_train_yesno.1.log 
# compute-mfcc-feats --verbose=2 --config=conf/mfcc.conf scp,p:exp/make_mfcc/train_yesno/wav_train_yesno.1.scp ark:- | copy-feats --compress=true ark:- ark,scp:/home/gsc/kaldi/egs/yesno/s5/mfcc/raw_mfcc_train_yesno.1.ark,/home/gsc/kaldi/egs/yesno/s5/mfcc/raw_mfcc_train_yesno.1.scp 
# Started at Sat Jun 17 18:55:58 CST 2017
#
copy-feats --compress=true ark:- ark,scp:/home/gsc/kaldi/egs/yesno/s5/mfcc/raw_mfcc_train_yesno.1.ark,/home/gsc/kaldi/egs/yesno/s5/mfcc/raw_mfcc_train_yesno.1.scp 
compute-mfcc-feats --verbose=2 --config=conf/mfcc.conf scp,p:exp/make_mfcc/train_yesno/wav_train_yesno.1.scp ark:- 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章