1.2.2 上述步骤的作用
语音信号是时变的信号,为了便于处理,我们假设在一个很短的时间范围内它是一个稳定的(stationary)系统。因此我们通常把语音信号分成20-40毫秒(ms)的帧,为什么是这个长度呢?因为如果太短了每一帧的样本不够,无法估计频谱;而太长了则它的变化会太大从而不是我们假设的稳定系统。
下一步就是计算每一帧的功率谱。这是受人耳蜗(cochlea)的启发——根据输入声音的不同,它会在不同的地方共振。而根据共振位置的不同,不同的神经元会向大脑发送不同的信号告诉大脑这个声音对应哪些频率。我们用周期图来估计功率谱就是为了达到类似的效果。
但是上面得到的功率谱仍然包含了很多对于语音识别无用的信息。比如耳蜗不会太细微的区分两个频率,尤其是对于高频的信号,耳蜗的区分度就越小。因此我们会把频率范围划分成不同的桶(bin),我们把所有落到这个桶范围内的能量都累加起来。这就是通过Mel滤波器组来实现的:第一个滤波器非常窄,它会收集频率接近0Hz的频率;而越往后,滤波器变得越宽,它会收集更大范围内的频率,具体频率范围是怎么划分的后面我们会介绍。
接下来对于滤波器组的能量,我们对它取log。这也是受人类听觉的启发:人类对于声音大小(loudness)的感受不是线性的。为了使人感知的大小变成2倍,我们需要提高8倍的能量。这意味着如果声音原来足够响亮,那么再增加一些能量对于感知来说并没有明显区别。log这种压缩操作使得我们的特征更接近人类的听觉。为什么是log而不是立方根呢?因为log可以让我们使用倒谱均值减(cepstral mean subtraction)这种信道归一化技术(这可以归一化掉不同信道的差别)。
最后一步是对这些能量进行DCT变换。因为不同的Mel滤波器是有交集的,因此它们是相关的,我们可以用DCT变换去掉这些相关性,从而后续的建模时可以利用这一点(比如常见的GMM声学模型我们可以使用对角的协方差矩阵,从而简化模型)。为什么只取第2-13个系数呢?因为后面的能量表示的是变化很快的高频信号,在实践中发现它们会使识别的效果变差。
学员评价