Kaldi特徵提取之-FBank
背景
- 人耳對聲音頻譜的響應是非線性的,經驗表明:如果我們能夠設計一種前端處理算法,以類似於人耳的方式對音頻進行處理,可以提高語音識別的性能。FilterBank分析就是這樣的一種算法。FBank特徵提取要在預處理之後進行,這時語音已經分幀,我們需要逐幀提取FBank特徵。
提取FBank特徵
傅里葉變換
我們分幀之後得到的任然是時域信號,爲了提取FBank特徵,首先需要將時域信號轉換爲頻域信號。傅里葉變換可以將信號從時域轉到頻域。傅里葉變換可以分爲連續傅里葉變換和離散傅里葉變換,因爲我們用的是數字音頻(而非模擬音頻),所以我們用到的是離散傅里葉變換。數學公式如下:
公式比較難以理解,可以想象一下傅里葉級數,一個函數可以用其他基本函數組合逼近。從公式可以看出,傅里葉變化的計算複雜度較高,因此我們通常使用的是快速傅里葉變換(fft)。X(k)=∑j=1Nx(j)w(j−1)(k−1)N - 關於傅里葉變換:
- 實數輸入,複數輸出
- 傅里葉變換的結果X(k) 與 X(N-k)爲共軛複數,可以利用這個性質節省存儲
- 快速傅里葉通常有基2、基4、分裂基(Kaldi中支持分裂基)
- 關於信號採樣率和信號頻率:
- 關於Nyquist定理:
- Nyquist定理: 如果想要從數字信號無損轉到模擬信號,我們需要以最高信號頻率的2倍的採樣頻率進行採樣。通常人的聲音的平率大概在3kHz~4kHz ,因此語音識別通常使用8k或者16k的wav提取特徵。16kHz採樣率的音頻,傅里葉變換之後的頻率範圍爲0-8KHz。
- 關於傅里葉變換:
計算能量譜
- 傅里葉變換完成後,我們的到的是頻域信號,每個頻帶範圍的能量大小不一,不同音素的能量譜不一樣。有兩種計算方法:
- a. magnitude = sqrt(real*real + image*image);
- b. power = real * real + image*image
注意:htk同時支持這兩種方式,kaldi只支持第二種。
- 傅里葉變換完成後,我們的到的是頻域信號,每個頻帶範圍的能量大小不一,不同音素的能量譜不一樣。有兩種計算方法:
Mel濾波
- Mel濾波的過程如下圖:
圖中m表示不同頻率處的能量,三角窗口表示濾波窗口。三角窗口可以覆蓋從0到Nyquist的整個頻率範圍,通常我們會設定頻率上限和下限,屏蔽掉某些不需要或者有噪聲的頻率範圍。三角形的數量表示Mel濾波之後特徵向量的維度。
工具 下限 上限 維度 kaldi low_freq high_freq num_bins htk klo khi numChans M(b)=∑j=1bjmelb(j)∗mb(j) - Mel濾波的過程如下圖:
- 取Log
Mlog(b)=log(M(b))