Fork me on GitHub

HLP-Speech-Recognition-1

语音识别是困难的

有人曾经说过语音识别就像把水变成汽油,从海里提取黄金,治疗癌症,或者是去月球。来形容语音识别是非常困难的。

语音识别

语音识别的表示

语音识别的语音部分可以通过数量为 T 维度为 d 的向量来表示
语音识别的文本部分可以通过数量为 N 维度为 V 的向量来表示,其中 V 为token 的个数,通常 T > N 的

token

token 有非常多的种类,包括 Phoneme、Grapheme、Word、Morpheme、Bytes。

Phoneme

Phoneme 作为一个发音单元,每个单词都对应着一个Phoneme,需要构建 Phoneme 表。在构建 Phoneme 表时,需要声学专家的帮助,但是每个声学专家对于每个词的 Phoneme 标注也可能是不一样的。

Grapheme

Grapheme 作为写作系统的最小单元,在英文中是 26 个英文字母 + 空白符 + 标点符号,在中文中就是每一个字,常见的字大约有 4000 多个。

Word

word 在英文中就是单词,常见的单词大约有 100K 个,在中文中 word 代表一个词,在中文中词的数量就无法数清了。

Morpheme

Morpheme 是一种介于 word 和 grapheme 中的一种 token,这种 token 有点类似于英文中的词根、词缀,但是 Morpheme 并不是词根、词缀,Morpheme 来自语言学和统计学。

Bytes

世界上的任何一种语言都可以使用 UTF-8 进行编码,UTF-8 编码又可以使用 2 进制进行表示,所以如果能使用 Byte 这种 token,那么就能实现语言的独立性了。这种 token 在 19 年的一篇论文中已经进行了实现。

token 总结

李宏毅老师让学生阅读了 100 篇最新的论文,并统计了使用每种 token 的比例。其中 Grapheme 是最受欢迎的。

语音识别的应用

语音识别有很多的应用,如词嵌入,使用一串向量来表示语音信息;翻译,说出一段英文,自动翻译成中文;意图识别,识别语音中的意图;槽位填充,如识别语音中的位置和时间信息。

声学特征

声学特征提取

一般是每 25ms 对音频采样一次,但是会向右移动 10ms 位置(这就意味着会有 15ms 的音频信息会被重复采样),然后利用 400 sample points (16KHz)、39-dim MFCC 或者是 80-dim filter bank output 3 种方法提取声学特征。这样每 25ms 提取到的声学特征组成一个向量,这样的一个向量称为一个 frame。

特征提取的过程如上图所示,将音频信息通过 DFT 得到 spectrogram(人眼可以通过 spectrogram 识别出语音的内容,但是音频信息无法进行识别),经过多个 filter bank ,取 log ,得到 filter bank output 特征(上面 3 种特征中的一种),然后经过 DCT 得到 MFCC 特征。

声学特征总结

李宏毅老师让学生阅读了 100 篇最新的文献,并统计了文献中这种声学特征所占的比例,其中 filter bank output 特征使用的最多。

如果把经常用到的 MNIST 和 CIFAR-10 数据集的数据量换算成音频的话,那么他们的数据量分别可以用 49min 和 2hr40min 表示,而在真正的音频数据中,最小的数据为 4hr。

语音识别存在两种观点,一种是使用 seq2seq 进行语音识别,另一种时使用 HMM(隐马尔科夫模型) 进行语音识别。

HLP-Introduction

课程的内容

1、让机器能听懂人说的话
2、让机器能看懂人写的句子
3、让机器能说出人听得懂的话
4、让机器能写出人看得懂的句子

课程内容设置

本门课程的名字叫做人类语言处理(HLP),与经常听到的自然语言处理(NLP)的区别在于 HLP 中文本和语音所占的比例是一样的,在 NLP 中,文本和语音所占的比例为 9:1

复杂的人类语言

复杂的语音

人类的语言是复杂的,每秒可以产生 16K 个样本点,每个样本点可以有 256 个可能的取值。

没有人可以说同一段话两次

当一个人重复同一段话时,虽然听起来是一样的,但是从音频信号方面来看,每次说的话是不同的。

复杂的文本

在早期对于文本数据的统计中,一个句子最多有 1289 个单词,但是在 2014 年的统计工作中,一个句子最多有 13955 个单词,但是要想打破这个纪录是非常容易的,只需要在最长的句子前面加点修饰就可以轻松的打破这个纪录。

课程结构

本门课程可以使用这一张图片表示,由 6 部分组成

1、语音-文本
2、语音-语音
3、语音-类别
4、文本-语音
5、文本-文本
6、文本-类别

使用的模型

课程中的所有模型都是使用深度神经网络,遇到问题就使用深度学习硬 train 一发,没有硬 train 一发无法解决的问题,如果有,那只有你的训练资料和 GPU 不够多而已。

课程详细介绍

语音-文本

语音-文本 应用的领域是自动语音识别,传统的自动语音识别需要用到声学模型、语言模型,需要声学知识。传统的自动语音识别系统占用的内存较大,不适合在手机端应用。基于深度学习的自动语音识别系统不需要额外的声学知识,而且所需的内存较小,适合在手机端进行应用。

语音-语音

语音-语音 的应用是语音分离,两个人同时说话可以将语者一和语者二进行辨认。

语音-语音 的另外一个应用是语音转换,可以将语者一的声音转换成语者二的声音。就像动漫 《名侦探柯南》中,柯南在侦探案件中,使用到的技术。

语音-类别

语音-类别 的应用是语者识别,给模型一段语音,模型能辨认出这是哪个语者说的话。

语音-类别 的另外一个应用是关键词识别,像现在使用的苹果手机,可以使用 “Hey Siri”来唤醒,还有小米手机,可以使用“小爱同学”来唤醒。

文本-语音

文本-语音 的应用有语音合成。

文本-文本

文本-文本 有非常多的应用,如翻译、概述(给定一篇文章,简要概述文章的内容)、聊天机器人、问答系统。

还有其他的应用看起来无法使用这种结构来实现,例如语法解析,语法解析会生成一棵语法解析树,这在文本-文本模式中是非常难实现的,但是通过将语法解析树进行变形,就能非常容易地实现了。

文本-类别

文本-类别的应用有情感分析,给定一段文本,分析文本的情感是积极的还是消极的。

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、解码器

请我喝杯咖啡吧~

支付宝
微信