kaldi mfcc

Kaldi特征提取之-预处理

背景

  • 本质上语音信号是一维的时间信号,随时间上下波动。现实中,人们再说话时会受到各种音素的干扰,为了进一步进行处理,我们必须进行必要的预处理以便之后的特征提取。诸如FBank,MFCC,PLP等都需要经过预处理步骤。本章将假设语音的格式为wav。

预处理

  1. 整个预处理过程如下图所示:

    预处理

  2. 分帧
    从图中可以看出我们需要将不定长的音频切分成固定长度的小段,这一步称为分帧。分帧的原因在于语音的长度通常不同,而我们无法对不同长度的序列进行建模(或者建模难度太大),但对长度固定的小段音频建模相对容易的多。

    参数 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个数。如果你想要修改kaldi中的这些参数,请前往kaldi/src/feat/feature-window.h中修改你想要改的参数。(修改完成之后要记得编译kaldi/src/feat文件夹和kaldi/src/featbin文件夹)

  3. 均值归一
    在模拟信号到数字信号的转换过程中可能会增加一个DC偏移,表现为语音波形整体向上或者向下移动。通常,移除DC偏移是以帧为单位进行的,而非整段wav进行。

  4. 预增强
    预增强以帧为单位进行,目的在于加强高频。数学公式如下:

    s(n)=s(n)ks(n1),n
k是预增强系数,范围为[0, 1),常用0.97,N是每一帧的长度,从公式可以看出每一帧的第一个数需要特殊处理。

加窗
加窗的目的在于减小帧与帧之间的过度更加平滑,本质上使用一个类似于sin、cos的对称函数与帧做卷积,Hamming窗公式如下图:

这里写图片描述

注意:同时使用预增强加窗同时使用时,要首先进行预增强

添加随机噪声
有时候我们需要进行数据增强,会手动合成一些音频。某些人工合成(使用软件)的音频可能会造成一些数字错误,诸如underflow或者overflow。 这种情况下,通过添加随机噪声可以解决这一类问题。公式如下:

s(n)=s(n)+qrand()
  1. q用于控制添加噪声的强度,rand() 产生[-1.0, 1.0)的随机数。
    注意:Kaldi中是在分帧之后的下一步添加随机噪声。
  2. 配套matlab代码
    matlab代码
    用到的wav

  3. 术语汇总
    采样率:每秒钟采集的数据的个数
    帧:音频切分后的一小段称为一帧
    帧长:每一帧的时间长度
    帧移:帧与帧之间移动的时间长度

参考

  1. wav
  2. 采样率
  3. Window function
  4. htkbook 3.4.1, Speech Input/Output, Speech Signal Processing

你可能感兴趣的:(kaldi)