Kaldi特征提取之-FBank

时间:2024-05-20 13:39:43

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滤波的过程如下图:
      Kaldi特征提取之-FBank
      图中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中可能看到的公式如下图:
      Kaldi特征提取之-FBank
      这是因为这里的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滤波计算