ASR-preprocess

前言

    语音信号预处理相关流程简介, 包括预加重、分帧加窗、DFT、FBank等

语音信号提取流程

(python代码可参考References部分的博客)

预加重

Question:为什么需要预加重?

    提高信号高频部分的能量,高频信号在传递过程中,衰减较快,包含更多的语音特征,n与n-1的变化幅度更大。

原理

    预加重是一个一阶高通滤波器,给定时域输入信号$x[n]$,预加重之后的信号为

    当信号为低频信号时,x变化较慢,$x[n]$与$x[n-1]$较为接近,低频信号的幅度会被大大抑制,同理,可保证高频信号特征的传递。

分帧加窗

Question:为什么需要分帧?

    1、语音信号为非平稳信号,统计属性随时间变化。
    2、语音信号同时具有短时平稳特性,一个声母/韵母的发音往往持续几十到几百毫秒。
    3、语音识别以较小发音单元的识别进行,通常为音素、字或字节,需要滑动窗来提取短时片段。

    对于采样率为16kHz的信号,帧长、帧移一般为25ms、10ms,即400和160个采样点
    帧长是一个窗口的长度,帧移是帧长减去连续两帧之间重叠的部分(overlap)。

原理

    分帧的过程,在时域上,即用一个窗函数和原始信号进行相乘:

$w[n]$称为窗函数,常用的窗函数有
矩形窗:

汉明窗(Hamming):

    使用汉明窗:加窗的过程,实际上是在时域上将信号截断,窗函数与信号在时域相乘,就等于对应的频域表示进行卷积(*),矩形窗主瓣窄,但是旁瓣较大,将其与原信号的频域表示进行卷积,就会导致频率泄漏

DFT

    将上一步分帧之后的语音帧,通过快速傅里叶变换由时域变换到频域,取DFT系数的模,得到谱特征,在此不做详细描述,可参考下列文章(压箱底系列)
    DFT: https://zhuanlan.zhihu.com/p/77347644
    C语言-FFT蝶形运算:https://zhuanlan.zhihu.com/p/135259438
    傅里叶变换的意义: https://blog.csdn.net/guyuealian/article/details/72817527
    复数的物理意义: https://www.zhihu.com/question/23234701
    信号频域与时域的区别:https://www.zhihu.com/question/21817515

FBank

    DFT得到了每个频带上信号的能量,但是人耳对频率的感知不是等间隔的,近似于对数函数

    将线性频率转换为梅尔频率,梅尔频率和线性频率转换关系

梅尔滤波器组设计

    (1)确定滤波器组个数P
    (2)根据采样率fs,DFT点数N,滤波器个数P,在梅尔域上等间隔的产生每个滤波器的起始频率、中间频率和截至频率,注意,上一个滤波器的中间频率为下一个滤波器的起始频率(存在overlap)
    (3)将梅尔域上每个三角滤波器的起始、中间和截止频率转换线性频率域,并对DFT之后的谱特征进行滤波,得到P个滤波器组能量,进行log 操作,得到Fbank特征

MFCC

MFCC特征组成(以40维为例):
    13维静态系数 + 13维一阶差分系数 + 13维二阶差分系数 + 1维帧能量

References

[1]《语音信号预处理及python代码实现博客:
    https://www.cnblogs.com/lxp-never/p/10918590.html#blogTitle7》