end-to-end-asr-pro

项目结构

asr.py

asr.py 文件的类结构如下,该文件下存在着 4 个类,每个类都继承了 nn.Module 模块

ASR

ASR 类为语音识别模型,里面定义了编码器、注意力机制、和解码器,以及定义了模型之间的前向传播过程。

Decoder

Decoder 类是解码器的实现,解码器使用的是 LSTM,他的输入为 Attention 的输出和 LSTM 上一时刻的输出。

Attention

Attention 是注意力机制的实现,里面对注意力的机制的前半部分过程进行操作,例如获取 key 的值。注意力机制在项目中又分了 ScaleDotAttention 和 LocationAwareAttention

Encoder

Encoder 类为编码器,主要是将声学特征转化为输出。编码器的实现有 4 种方式,具体结构如下

最下面的两层两两组合可以产生 4 种结构,一旦第二层的结构确定了,那么 3、4、5、6层的结构也会确定,他的结构和第二层的结构是一样的,比如第二层选择 LSTM,那么 3、4、5、6层也是 LSTM。

module.py

module.py 文件的类结构如下,该文件下存在着 4 个类,前 4 个类继承了 nn.Module 模块,后两个类继承了 BaseAttention 模块。

VGGExtractor

VGGExtractor 类作为编码器的底层结构使用了多层 CNN + MaxPool 技术来实现。

CNNExtractor

CNNExtractor 和 VGGExtractor 一样也是作为编码器的底层结构,但是 CNNExtractor 使用了 2 层的一维卷积。

BaseAttention

和上面的提到的 Attention 类做的操作正好相反,BaseAttention 做的是 Attention 类的后置操作,比如求 softmax 概率,求 Attention 的输出值。

ScaleDotAttention

没看

LocationAwareAttention

把当前输入之前的局部信息输入到 Attention 中

audio.py

CMVN 和 Delta

是对提取到的声学特征做特征变换

Postprocess

对声学特征的后置处理,主要做的是维度的变换

ExtractAudioFeature

使用 kaldi 对音频信息进行特征的提取

1、音频特征提取

各部分做的工作

ExtractAudioFeature 通过 torchaudio.compliance.kaldi 提取特征

Delta + CMVM 做特征变换

Postprocess维度变换

音频特征提取的步骤是使用 kaldi 对声学特征进行提取,然后使用 Delta + CMVM 做特征变换,最后进行维度的变换。

**CMVN **

对特征进行归一化,均值M做减法的归一化,方差V做归一化

差分模型(deltas)

是识别中经常使用的方法,即将不同帧的特征之间(比如当前帧特征减去前一帧特征,以及更高阶的差分)差值也作为特征.

kaldi存储的特征文件保留原始特征,而不包含CMVN变换和差分的特征,在每次需要(训练,识别或者对其)时再提取这些特征。

cmvn:倒谱均值方差归一化

提取声学特征以后,将声学特征从一个空间转变成另一个空间,使得在这个空间下特征参数更符合某种概率分布,压缩了特征参数值域的动态范围,减少了训练和测试环境的不匹配等

提升模型的鲁棒性,其实就是归一化的操作。

梅尔倒谱系数(mfcc)

提取过程:连续语音–预加重–加窗分帧–FFT–MEL滤波器组–对数运算–DCT
为什么要这么做呢?
首先,语音做FFT之后就把语音转换到频域,每一帧代表语音能量,越亮代表能量越大;

然后经过MEL滤波器组,是把语音变换到MEL域,MEL刻度是仿照人耳进行设计的,更符合人耳的听觉特性;

再然后做对数运算,做DCT,最后的这步DCT相当于又做了一遍FFT,目的是提取每一帧的包络,因为语音的信息主要在包络上;最后提取的mfcc。

2、编码器

编码器使用 CNN + RNN 的实现方式

最下层的 VGGExtractor 是卷积层,主要内容如下

3、Attention

Attention 使用的是 LocationAwareAttention,

在项目中的具体细节为

4、解码器

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信