轉:http://blog.csdn.net/wbgxx333/article/details/25778483
本翻譯原文http://kaldi.sourceforge.net/feat.html,由@煮八戒翻譯,@wbglearn校對和修改。
特征提取
簡介
我們做特征提取和波形讀取的這部分代碼,其目的是為了得到標准的MFCC(譯注:梅爾倒譜系數)和PLP(譯注:感知線性預測系數)特征,設置合理的默認值但留了一部分用戶最有可能想調整的選項(如梅爾濾波器的個數,最小和最大截止頻率等等)。這部分代碼只讀取wav文件里的pcm(譯注:脈沖編碼調制)數據。這類文件通常帶.wav或.pcm后綴(雖然有時.pcm后綴會用於sph文件;這種情況下必須轉換該文件)。假如源數據不是wav類文件,則用戶可自由選擇命令行工具來轉換,而我們提供的sph2pipe工具已能滿足一般的情況。
命令行工具compute-mfcc-feats和compute-plp-feats計算特征;同其它Kaldi工具一樣,不帶參數地運行它們會給出一個選項列表。例子腳本里顯示了這些工具的用法。
計算MFCC特征
這里我們介紹如何使用命令行工具compute-mfcc-feats計算MFCC參數。該程序需要兩個命令行參數:rspecifier是用來讀.wav數據(以發音為索引)和wspecifier是用來寫特征(以發音為索引);參見The Tableconcept和Specifying Table formats: wspecifiers and rspecifiers獲取更多關於這些術語的解釋。典型的用法是,將數據寫入一個大的“archive”文件,也寫到一個“scp”文件以便隨機存取;參見Writing an archive and a script file simultaneously解釋。程序沒有添加增量功能(如需添加,參見add-deltas)。它接收選項-channel來選擇通道(如–channel=0, –channel=1),該選項在讀取立體聲數據時很有用。
計算MFCC特征由Mfcc類型的對象完成,它有Compute()函數可以根據波形計算特征。
完整的MFCC計算如下所示:
· 計算出一個文件中幀的數目(通常幀長25ms幀移10ms)。
· 對每一幀:
o 提取數據,可選做dithering(注:直譯為抖動,在這里可以理解為類似歸一化的預處理),預加重和去除直流偏移,還可以和加窗函數相乘(此處支持多種選項,如漢明窗)
o 計算該點能量(假如用對數能量則沒有C0)
o 做FFT(譯注:快速傅里葉變換)並計算功率譜
o 計算每個梅爾濾波器的能量;如23個部分重疊的三角濾波器,其中心在梅爾頻域等間距
o 計算對數能量並作余弦變換,根據要求保留系數(如13個)
o 選做倒譜變換;它僅僅是比例變換,確保系數在合理范圍。
上下截止頻率根據三角濾波器界定,由選項–low-freq和–high-freq控制,通常分別設置為0Hz和奈奎斯特頻率附近,如對16kHz采樣的語音設置為–low-freq=20 和 –high-freq=7800。
Kaldi的特征和HTK的特征在很多方面不同,但是幾乎所有這些不同歸結於有不同的默認值。用選項–htk-compat=true並正確設置參數,能得到同HTK非常接近的特征。一個可能重要的選項是我們不支持能量最大歸一化。這是因為我們希望能把無狀態方式應用到歸一化方法,且希望從原理上計算一幀幀特征仍能給出相同結果。但是程序compute-mfcc-feats里有–subtract-mean選項來提取特征的均值。對每個語音做此操作;每個說話人可以有不同的方式來提取特征均值。(如在腳本里搜“cmvn”,表示倒譜均值和方差歸一化)。
計算PLP特征
計算PLP特征的算法與MFCC的算法前期是一樣的。稍后我們也許會在此部分增加些內容,但目前參見Hynek Hermansky《語音的感知線性預測(PLP)分析》,Journal ofthe Acoustical Society of America, vol. 87, no. 4, pages 1738–1752 (1990).
特征級聲道長度歸一化(VTLN)
程序compute-mfcc-feats和compute-plp-feats接收一個VTLN彎折因子選項。在目前的腳本中,這僅用作線性版的VTLN的初始化線性轉換的一種方法。VTLN通過移動三角頻率箱的中心頻率的位置來實現。移動頻率箱的彎折函數是一個在頻域空間分段線性的函數。為理解它,記住以下數量關系:
0 <= low-freq <=vtln-low < vtln-high < high-freq <= nyquist
此處,low-freq和high-freq分別是用於標准MFCC或PLP計算的最低和最高頻率(忽略更低和更高的頻率)。vtln-low和vtln-high是用於VTLN的截止頻率,它們的功能是確保所有梅爾濾波器有合適的寬度。
我們實現的VTLN彎折函數是一個分段線性函數,三個部分映射區間[low-freq,high-freq]至[low-freq, high-freq]。記彎折函數為W(f),f是頻率。中段映射f到f/scale,scale是VTLN彎折因子(通常范圍為0.8到1.2)。x軸上低段和中段的連接點是滿足min(f,W(f)) = vtln-low的f點。x軸上中段和高端的連接點是滿足max(f, W(f)) = vtln-high的f點。要求低段和高段的斜率和偏移是連續的且W(low-freq)=low-freq, W(high-freq)=high-freq。這個彎折函數和HTK的不同;HTK的版本中,"vtln-low"和"vtln-high"的數量關系是x軸上可以不連續的點,這意味着變量"vtln-high"必須基於彎折因子的可能范圍的先驗知識謹慎選擇(否則梅爾濾波器可能為空)。
一個合理的設置如下(以16kHz采樣的語音為例);注意這反映的是我們理解的合理值,並非任何非常細致的調試實驗的結果。
low-freq |
vtln-low |
vtln-high |
high-freq |
nyquist |
40 |
60 |
7200 |
7800 |
8000 |