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))