Kaldi特徵提取之-FBank

Kaldi特徵提取之-FBank

背景

  • 人耳對聲音頻譜的響應是非線性的,經驗表明:如果我們能夠設計一種前端處理算法,以類似於人耳的方式對音頻進行處理,可以提高語音識別的性能。FilterBank分析就是這樣的一種算法。FBank特徵提取要在預處理之後進行,這時語音已經分幀,我們需要逐幀提取FBank特徵。

提取FBank特徵

  1. 傅里葉變換
    我們分幀之後得到的任然是時域信號,爲了提取FBank特徵,首先需要將時域信號轉換爲頻域信號。傅里葉變換可以將信號從時域轉到頻域。傅里葉變換可以分爲連續傅里葉變換和離散傅里葉變換,因爲我們用的是數字音頻(而非模擬音頻),所以我們用到的是離散傅里葉變換。數學公式如下:

    X(k)=j=1Nx(j)w(j1)(k1)N
    公式比較難以理解,可以想象一下傅里葉級數,一個函數可以用其他基本函數組合逼近。從公式可以看出,傅里葉變化的計算複雜度較高,因此我們通常使用的是快速傅里葉變換(fft)
    • 關於傅里葉變換:
      • 實數輸入,複數輸出
      • 傅里葉變換的結果X(k) 與 X(N-k)爲共軛複數,可以利用這個性質節省存儲
      • 快速傅里葉通常有基2、基4、分裂基(Kaldi中支持分裂基)
    • 關於信號採樣率和信號頻率:
      • 信號頻率 : 組合產生複雜信號的簡單信號的頻率,通常簡單信號平率範圍很廣
      • 採樣頻率 : 模擬到數字的轉換過程中,需要對模擬信號進行採樣,每秒內的採樣點數量就是採樣頻率
    • 關於Nyquist定理:
      • Nyquist定理: 如果想要從數字信號無損轉到模擬信號,我們需要以最高信號頻率的2倍的採樣頻率進行採樣。通常人的聲音的平率大概在3kHz~4kHz ,因此語音識別通常使用8k或者16k的wav提取特徵。16kHz採樣率的音頻,傅里葉變換之後的頻率範圍爲0-8KHz。
  2. 計算能量譜

    • 傅里葉變換完成後,我們的到的是頻域信號,每個頻帶範圍的能量大小不一,不同音素的能量譜不一樣。有兩種計算方法:
      • a. magnitude = sqrt(real*real + image*image);
      • b. power = real * real + image*image
        注意:htk同時支持這兩種方式,kaldi只支持第二種。
  3. 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係數計算, 濾波計算參考濾波計算
    • mel倒譜公式
      Mel(f)=2595log10(1+f700)
    • 注意:在kaldi中可能看到的公式如下圖:
      這裏寫圖片描述
      這是因爲這裏的logf是自然對數。2595 / 1127 約等於 loge(a)/log10(a)
  4. 取Log
    Mlog(b)=log(M(b))

資源

  1. matlab代碼
  2. wav

參考

  1. 時域
  2. 頻域
  3. 傅里葉變換
  4. 快速傅里葉變換
  5. 信號頻率
  6. 採樣頻率
  7. Nyquist定理
  8. mel係數計算
  9. mel濾波計算
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章