MFCC一些知識與Kaldi中的MFCC特徵解讀

因爲想用Kaldi去實現一個GMM-UBM的說話人識別和loglike打分,所以想把Kaldi計算的統計量對一對,

看能不能把二進制文件裏的數值單獨拿出來,自己寫個代碼做結合Kaldi中的MAP做統計量計算,然後再放回去。


但是當把訓練好的UBM打開看看,發現他的矩陣不是人們常說的

MFCC生成的特徵向量是39維而是60維,所以特意返回去再把MFCC和信號處理給梳理一遍。

並且把kaldi跟特徵有關的,維度有關都調查了一遍。


當用下面的命令打開 訓練好的UBM後,把它存在final_dubm.txt中

gmm-global-copy --binary=false final.dubm final_dubm.txt

順路說說,爲什麼用diag的ubm而不是full的ubm是因爲一下這個paper說

GMM-UBM paper

1。因爲高維FUll相當於更高維度的DIAG協方差矩陣

2。DIAG協方差矩陣計算速度更快,因爲假設特徵之間沒有相關性,相互獨立

3。DIAG協方差的效果好過FULL


回正題,打開之後就看Mean_InVar那一個矩陣,會發現每一個高斯分量,他都有60維, 如圖所示。



這個常識中的我的理解D=39維有點出入,這是爲什麼呢?因爲我跑的demo主動設置了MFCC的配置。

然後打開 v1/conf/mfcc.conf 會發現:(以前沒有特別想法去看CONF,發現這些個配置文件都還蠻重要的)

--sample-frequency=16000
--num-mel-bins=40 #higher than the default which is 23
--num-ceps=20 # higher than the default which is 12.

這裏配置設置了有40個MEL三角形濾波器,有20個梅爾係數,delta3次後得到20*3=60

啥是delta?

標準的倒譜參數MFCC只反映了語音參數的靜態特性,語音的動態特性可以用這些靜態特徵的差分譜即delta來描述。實驗證明:把動、靜態特徵結合起來纔能有效提高系統的識別性能。一般會有2個delta,加上原來的就是20*3,後面有配圖和陪命令解釋,這裏餘弦知道一下

因爲做MFCC時一般會取40個濾波器使原始聲音變成梅爾刻度(聽覺音高單位),梅爾刻度是一種基於人耳對等距的音高變化的感官判斷而定的非線性m刻度。


然後因爲MFCC 最後一步式DCT,所以DCT的結果也是40個點;實際中,一般僅保留前13~20個,這就進一步壓縮了數據。得到梅爾倒譜。


爲了進一步驗證呢,我們用原數據MFCC,並把MFCC的管道ark結果打開看看維度!

 steps/make_mfcc.sh --cmd "$train_cmd" --nj 10 data/train exp/make_mfcc/train $mfccdir
copy-feats ark:raw_mfcc_train.7.ark   ark,t:-  | less

打開得到該圖,行是一條語音有多少幀的幀數,每行有20列


那麼你們這時候就會疑惑,不是說60嗎? 那爲什麼mfcc之後只有20呢?

Fuck sogoupinyin in Ubuntu!!!!!!

if you want to print out 2-deltas, enter the following can see

copy-feats ark:raw_mfcc_test_hires.1.ark ark:- | add-deltas ark:- ark,t:- | head


各位看官稍安勿燥。

在運行

./sid/train_diag_ubm.sh

打開該腳本發現配置如下

vim /sid/train_diag_ubm.sh
# Begin configuration section.
nj=4
cmd=run.pl
num_iters=4
stage=-2
num_gselect=30 # Number of Gaussian-selection indices to use while training
               # the model.
num_frames=500000 # number of frames to keep in memory for initialization
num_iters_init=20
initial_gauss_proportion=0.5 # Start with half the target number of Gaussians
subsample=5 # subsample all features with this periodicity, in the main E-M phase.
cleanup=true
min_gaussian_weight=0.0001
remove_low_count_gaussians=true # set this to false if you need #gauss to stay fixed.
num_threads=32
delta_window=3
delta_order=2
apply_cmn=true # If true, apply sliding window cepstral mean normalization
# End configuration section.
已經定義好了
delta_window=3
delta_order=2
後面對特徵的差分定義和特徵的倒譜歸一化以及各種處理如下,我們就看有delta的部分:
delta_opts="--delta-window=$delta_window --delta-order=$delta_order"
all_feats="ark,s,cs:add-deltas $delta_opts scp:$data/feats.scp ark:- | apply-cmvn-sliding --norm-vars=false --center=true --cmn-window=300 ark:- ark:- | select-voiced-frames ark:- scp,s,cs:$data/vad.scp ark:- |"
feats="ark,s,cs:add-deltas $delta_opts scp:$sdata/JOB/feats.scp ark:- | apply-cmvn-sliding --norm-vars=false --center=true --cmn-window=300 ark:- ark:- | select-voiced-frames ark:- scp,s,cs:$sdata/JOB/vad.scp ark:- | subsample-feats --n=$subsample ark:- ark:- |"

檢查一下:

若各位 查看一下訓練diag_ubm的日誌的話

 vim /v1/exp/diag_ubm_1024/log
日誌log中會自動執行下面這條命令
gmm-global-acc-stats "--gselect=ark,s,cs:gunzip -c exp/diag_ubm_1024/gselect.1.gz|" exp/diag_ubm_1024/0.dubm "ark,s,cs:add-deltas --delta-window=3 --delta-order=2 scp:data/train/split10/1/feats.scp ark:- | apply-cmvn-sliding --norm-vars=false --center=true --cmn-window=300 ark:- ark:- | select-voiced-frames ark:- scp,s,cs:data/train/split10/1/vad.scp ark:- | subsample-feats --n=5 ark:- ark:- |" exp/diag_ubm_1024/0.1.acc 

然後你會發現中間有個參數是:

cs:add-deltas --delta-window=3 --delta-order=2

就像之前解釋的delta一樣,動靜結合:

2個delta=20*2 加上原來自己的靜態20=60,這裏就是後期60列的由來了!!!

下面主要說一下MFCC的流程:

MFCC主要是模仿人耳生理特性, 那爲什麼呢,因爲人的耳朵對低頻的聲音敏感度比高頻的高, 然後又因爲低頻的能量比高頻的高,所以需要進行信號處理去使得高頻的能力與低頻能力相當,降低信噪比,然後更平滑. 後續的Mel濾波又是根據人的耳朵不同敏感度取得,所以 前幾個敏感度的標準係數高,後幾個可以忽略,大體就是這個思路. 具體的在下面,不貼公式,網上自己找一下把


MFCC特徵提取的步驟:

1.預加重:

語音信號,因爲聲門氣流波的影響,每倍頻衰減12dB,脣腔輻射使每倍頻增加6dB,抵消後總的每倍頻衰減6dB,將語音信號通過高通濾波器,提升高頻部分使高頻和低頻相等,來消除發聲過程中聲帶和嘴脣的影響,補償語音信號收到發音系統所抑制的高頻部分,突出了高頻的共振峯。 Y[n]=s[n]-0.95*s[n-1]. 

2.分幀: 

因爲語音信號是快速變化的,而 fourier tansform 適用於分析平穩的信號,利用語音的短時平穩性(在每一時刻所有階差分都是一樣的),在語音識別中一般去幀長爲20ms~50ms(一般取25ms),這樣一幀內既有足夠多的週期,又不會變化很劇烈, 一般幀移取10ms, 也就是說幀與幀之間有15ms是重複的,(s - 15)/ 10 = 幀數, 其中 s 爲一段語音的毫秒數.

先將N個採樣點集合成一個觀測單位,稱爲幀。通常情況下N的值爲256或512,涵蓋的時間約爲20~30ms左右。爲了避免相鄰兩幀的變化過大,因此會讓兩相鄰幀之間有一段重疊區域,此重疊區域包含了M個取樣點,通常M的值約爲N的1/2或1/3。通常語音識別所採用語音信號的採樣頻率爲8KHz或16KHz,以8KHz來說,若幀長度爲256個採樣點,則對應的時間長度是256/8000 1000=32ms。

3.加窗:

因爲之後要做FFT,而一個信號的FFT與 這個信號的週期信號的FFT相同,所以如果這個信號邊緣不平話,那麼這個信號的週期信號在顯示中式很少遇到的,就沒有意義了,所以每frame的信號有餘一個平滑的窗函數相乘,讓frame兩端平滑的衰減到零,取得更高質量的頻譜,常選用的窗函數: Hamming window,Hanning window。好的窗函數也能減弱頻譜泄漏


4.補零:
因爲做FFT(快速傅里葉變化)要求信號長度爲2^n,所以如果採樣率爲16000Hz,16000*0.025=400,要補0使長度爲512。


5.快速傅里葉變換:
將時域譜轉化
爲頻率譜,縱座標變爲能量。fourier transform逐幀進行的,爲的是取得每一幀的頻譜。一般只保留幅度譜,丟棄相位譜。



由於信號在時域上的變換通常很難看出信號的特性,所以通常將它轉換爲頻域上的能量分佈來觀察,不同的能量分佈,就能代表不同語音的特性。所以在乘上漢明窗後,每幀還必須再經過快速傅里葉變換以得到在頻譜上的能量分佈。對分幀加窗後的各幀信號進行快速傅里葉變換得到各幀的頻譜。並對語音信號的頻譜取模平方得到語音信號的功率譜。設語音信號的DFT爲:


6.梅爾轉換:

然後要轉化到梅爾刻度(聽覺音高單位),梅爾刻度是一種基於人耳對等距的音高變化的感官判斷而定的非線性m刻度。人耳對低頻聲音的變化比高頻的變化更敏感,所以要做一個轉化, 具體做法爲讓原始信號通過一系列濾波器,實驗中取40個,這40個濾波器的橫軸在單位爲梅爾時是均勻的。

三角帶通濾波器有兩個主要目的:對頻譜進行平滑化,並消除諧波的作用,突顯原先語音的共振峯。(因此一段語音的音調或音高,是不會呈現在MFCC 參數內,換句話說,以MFCC 爲特徵的語音辨識系統,並不會受到輸入語音的音調不同而有所影響)此外,還可以降低運算量。

這一步有如下幾個效果:
1) 傅里葉變換得到的序列很長(一般爲幾百到幾千個點),把它變換成每個三角形下的能量,可以減少數據量(一般取40個三角形);
2) 頻譜有包絡和精細結構,分別對應音色與音高。對於語音識別來講,音色是主要的有用信息,音高一般沒有用。在每個三角形內積分,就可以消除精細結構,只保留音色的信息。當然,對於有聲調的語言來說,音高也是有用的,所以在MFCC特徵之外,還會使用其它特徵刻畫音高。

3) 三角形是低頻密、高頻疏的,這可以模仿人耳在低頻處分辨率高的特性。


7.log能量

此外,一幀的音量(即能量),也是語音的重要特徵,而且非常容易計算。因此,通常再加上一幀的對數能量(定義:一幀內信號的平方和,再取以10爲底的對數值,再乘以10)使得每一幀基本的語音特徵就多了一維,包括一個對數能量和剩下的倒頻譜參數。這一步就是取上一步結果的對數。由於高頻部分的能量比較低,低頻部分的能量比較高,可以放大低能量處的能量差異;更深層次地,這是在模仿倒譜(cepstrum)的計算步驟。

注:若要加入其它語音特徵以測試識別率,也可以在此階段加入,這些常用的其它語音特徵包含音高、過零率以及共振峯等。


8.動態查分參數的提取(包括一階差分和二階差分)

標準的倒譜參數MFCC只反映了語音參數的靜態特性,語音的動態特性可以用這些靜態特徵的差分譜來描述。實驗證明:把動、靜態特徵結合起來纔能有效提高系統的識別性能。差分參數的計算可以採用下面的公式:


9.DCT

求倒譜時這一步仍然用的是傅里葉變換。計算MFCC時使用的離散餘弦變換(discrete cosine transform,DCT)是傅里葉變換的一個變種,好處是結果是實數,沒有虛部。DCT還有一個特點是,對於一般的語音信號,這一步的結果的前幾個係數特別大,後面的係數比較小,可以忽略。上面說了一般取40個三角形,所以DCT的結果也是40個點;實際中,一般僅保留前13~20個,這就進一步壓縮了數據。得到梅爾倒譜。


因此,MFCC的全部組成其實是由:

N維MFCC參數(N/3MFCC係數+ N/3一階差分參數+ N/3二階差分參數)+幀能量(此項可根據需求替換)


如有任何錯誤和疑點,請指出糾正!謝謝各位


Ref:

1. http://lufo.me/2015/06/ASR1/

2.https://blog.csdn.net/jojozhangju/article/details/18678861

3.https://blog.csdn.net/zjm750617105/article/details/5169036

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章