Kaldi特征提取之-预处理
背景
- 本质上语音信号是一维的时间信号,随时间上下波动。现实中,人们再说话时会受到各种音素的干扰,为了进一步进行处理,我们必须进行必要的预处理以便之后的特征提取。诸如FBank,MFCC,PLP等都需要经过预处理步骤。本章将假设语音的格式为wav。
预处理
整个预处理过程如下图所示:
分帧
从图中可以看出我们需要将不定长的音频切分成固定长度的小段,这一步称为分帧。分帧的原因在于语音的长度通常不同,而我们无法对不同长度的序列进行建模(或者建模难度太大),但对长度固定的小段音频建模相对容易的多。参数 kaldi参数 常用值 意义 WINDOWSIZE frame_length_ms 25ms(毫秒) 每一帧的时间长度 TARGETRATE frame_shift_ms 10ms(毫秒) 帧之间移动过的时间长度 注意:段与段之间会有一些重叠的部分。
根据这些参数以及wav的一些属性,我们可以计算每段wav分帧之后有多少段以及每帧有多少个数。假设wav长度为1s,采样率 为16kHz,则这段wav可以切分为 (1*1000) / 10 = 100帧,每帧有(25 / 1000) * 16kHz = 400个数。
均值归一
在模拟信号到数字信号的转换过程中可能会增加一个DC偏移,表现为语音波形整体向上或者向下移动。通常,移除DC偏移是以帧为单位进行的,而非整段wav进行。预增强
预增强以帧为单位进行,目的在于加强高频。数学公式如下:
s(n)=s(n)−k∗s(n−1),∀n∈Nk是预增强系数,范围为[0, 1),常用0.97,N是每一帧的长度,从公式可以看出每一帧的第一个数需要特殊处理。加窗
加窗的目的在于减小帧与帧之间的过度更加平滑,本质上使用一个类似于sin、cos的对称函数与帧做卷积,Hamming窗公式如下图:注意:同时使用预增强 和 加窗同时使用时,要首先进行预增强。
添加随机噪声
有时候我们需要进行数据增强,会手动合成一些音频。某些人工合成(使用软件)的音频可能会造成一些数字错误,诸如underflow或者overflow。 这种情况下,通过添加随机噪声可以解决这一类问题。公式如下:
s(n)=s(n)+q∗rand()q用于控制添加噪声的强度,rand() 产生[-1.0, 1.0)的随机数。
注意:Kaldi中是在分帧之后的下一步添加随机噪声。术语汇总
采样率:每秒钟采集的数据的个数
帧:音频切分后的一小段称为一帧
帧长:每一帧的时间长度
帧移:帧与帧之间移动的时间长度