语音识别(ASR)系列之三:CTC、RNN-T模型

简介: 上一篇系列之二介绍了早期的混合模型,底层使用GMM或者DNN计算帧对应的音素概率,上层使用HMM寻找最优的音素序列,得到最终的文字序列。该模型的缺点:

上一篇系列之二介绍了早期的混合模型,底层使用GMM或者DNN计算帧对应的音素概率,上层使用HMM寻找最优的音素序列,得到最终的文字序列。该模型的缺点:

  1. 需要对帧级别打标签、建模,这对语音数据来说工作量巨大,并且标签不一定准确,特别是两个音的边界部分;
  2. 两个或者多个模型混合增加了模型复杂度,使用不太方便。\

\

于是后来新的模型思路转向从语音直接预测文字,即端到端模型。今天我们来看看具有里程碑意义的CTC模型以及在其基础上改进的RNN Transducer模型,简称RNN-T模型。\

\

CTC模型细节\

CTC模型是Alex Gaves等人在2006年提出的,原始论文见www.cs.toronto.edu/~graves/icm…

\

首先,CTC使用了一种新的输出方式,在标签集合中增加了一个空白标签,如下图第一行中的ϵ。把输出中的相邻重复的字符合并,然后去掉空白符,就得到了最后的文本结果。

网络异常,图片无法展示
|

容易看到,以前输出中每一帧必须要对应其所属的音素,现在不必一一对应,某些预测的位置用空白符代替,只要通过合并和去空白符后最终的文本正确即可。

\

网络异常,图片无法展示
|

下面以单词 cat 为例,列出一些无效的输出序列例子。需要强调的一点,含空白符的输出序列长度是固定的。

\

上面介绍了模型的输出方式,论文使用的RNN建模,输出维度为(batch_size, time_step, number_of_class),对batch中的每一个数据,输出为固定的时间步长度time_step, 每一步输出是一个向量,长度为所有类型种类+1,通过softmax后最大的位置对应的类型表示该步输出的类型。以上面hello中的e为例,表示第3时间步输出为e,可通过softmax后得到。这里强调两点:1)CTC的端到端并不是RNN模型直接就输出不等长的文本,输出的是含空白符的固定长度序列。2)每个时间步输出的向量长度比以前不含空白符时多1,因为增加了空白符。

\

说完模型输出,现在说说标签。对每个数据,标签就是最终的文本序列,比如如果语音是30帧的“你好”,标注的标签就是“你好”两个字。这是名副其实的端到端、变长序列到序列问题。那么如何计算固定长度输出到实际变长标签之间的损失函数呢?这就是CTC算法的核心。

\

对一条数据,所有时间步计算的结果串起来得到输出序列A,去重和空白符后即得到一个序列结果B。容易得知,有多种不同的A序列,通过去重和空白符后可得到同一个B。对于一个序列标签B,模型训练的目的就是以最大的概率找到各种正确的A,因为任何一个正确的A都可以得到B。

\

上述过程转换为数学语言:

网络异常,图片无法展示
|

X表述输入序列, Y表示标签序列,模型目标是最大化 p(Y|X)。

对每一种正确的序列A,时间步t对应的输出为a(t),所有时间步概率的乘积为X条件下该序列A的概率。所有正确的A对应概率的和即为p(Y|X)。

为方便计算,最终的损失函数转为最小化p(Y|X)的负对数

网络异常,图片无法展示
|

\

定义好损失函数后,接下来的步骤就和普通深度学习的方法一样了,通过梯度下降求RNN模型的参数。但实际计算时为减少开销,论文中使用了前后向算法,具体细节请参照论文中的详细推导。\

\

模型实验结果

以下是论文中基于TIMIT数据集测试的结果,主要对比基于HMM的模型的LER,均有不同程度的性能提升。\

网络异常,图片无法展示
|

网络异常,图片无法展示
|
\

实战使用\

Tensorflow有现成的CTC损失函数接口可用,但要理解其参数的结构不是那么直观,这里以Tensorflow 1.13中的tf.nn.ctc_loss()为例,说一下重要的参数。

tf.nn.ctc_loss(
    labels,
    inputs=None,
    sequence_length=None,
    preprocess_collapse_repeated=False,
    ctc_merge_repeated=True,
    ignore_longer_outputs_than_inputs=False,
    time_major=True,
    logits=None)
复制代码

其中labels是真实的标签,在此版本中只支持SparseTensor格式,指定标签的indices,value和shape,即哪些位置有真实的标签值,其余位置值为0。

\

inputs是模型的输出,如果是RNN网络,就是直接输出格式(batch_size, time_steps, classes_num),如果RNN网络是时间步优先,参数time_major设置为True,输出格式为(time_steps, batch_size, classes_num)。

\

sequence_length是inputs里每条数据实际有效长度,是一个batch_size大小的向量。

\

Tensorflow 1.13还提供了另一个版本tf.nn.ctc_loss_v2(),是上面版本preprocess_collapse_repeat=True和ctc_merge_repeated=Flase的特例,更重要的一点是labels支持Dense Tensor,即直接传入labels矩阵就行,不用再构造SparseTensor。

\

实际使用CTC时你会看到网络输出的logits里有大量的空白符,每个标签连续输出的情况不多,我理解为只有大量的空白符情况下才能使各种正确的输出序列概率最大。

备注:百度语音识别的两个版本Deep Speech 1和2均使用了CTC。

\

RNN Transducer模型

从CTC的结构可以看出其没有明确学习序列时间步之间的关系,比如读音/greɪt/ 应该拼成 great 或 grate,但 CTC 可能拼成不合理的 grete。为了加入时间步前后间的关系,就出现了RNN Transducer模型。

\

该模型同样是CTC的作者Alex Graves于2012年提出的(能提出多个厉害的模型,强悍!),论文见:arxiv.org/pdf/1211.37…

Transducer主要是在CTC的基础上把模型Encoder的隐藏层输出联合另一个输出,这个被联合的输出是最终模型的某一个输出经过Pred Network计算的结果。本质的意思是在CTC模型上加入了序列之间的关系。Pred Network作者用的LSTM。\

\

Transducer的损失函数和CTC一样的思路,但是在训练的时候比CTC复杂,因为Pred Network中的u和Encoder中的时间步t有很多种组合。具体方法在论文中有详细的推导,同样用了前后向算法。

\

Transducer实验结果

作者同样基于TIMIT数据对Transducer和CTC进行了比较,性能提升不多,解释原因是Pred Network使用的数据不多,可以使用基于大量数据预训练一个Pred Network来提高准确度。\

此外,Google 2019年使用Transducer模型压缩后应用于移动设备上,逐个字符实时输出单词,有效减少输出延时, 详见:ai.googleblog.com/2019/03/an-…

\

总结\

本文介绍了CTC及RNN Transducer模型的主要结构和思路,希望对你有些帮助。对于模型中的一些细节,比如前后向算法,需要阅读原论文推导才能慢慢消化。另外对于Tensorflow CTC损失函数的使用,也要边用边理解


相关实践学习
达摩院智能语音交互 - 声纹识别技术
声纹识别是基于每个发音人的发音器官构造不同,识别当前发音人的身份。按照任务具体分为两种: 声纹辨认:从说话人集合中判别出测试语音所属的说话人,为多选一的问题 声纹确认:判断测试语音是否由目标说话人所说,是二选一的问题(是或者不是) 按照应用具体分为两种: 文本相关:要求使用者重复指定的话语,通常包含与训练信息相同的文本(精度较高,适合当前应用模式) 文本无关:对使用者发音内容和语言没有要求,受信道环境影响比较大,精度不高 本课程主要介绍声纹识别的原型技术、系统架构及应用案例等。 讲师介绍: 郑斯奇,达摩院算法专家,毕业于美国哈佛大学,研究方向包括声纹识别、性别、年龄、语种识别等。致力于推动端侧声纹与个性化技术的研究和大规模应用。
相关文章
|
2月前
|
API 语音技术
基于Asterisk和TTS/ASR语音识别的配置示例
本文介绍了如何在Asterisk服务器上配置TTS(文本转语音)和ASR(自动语音识别)引擎,包括安装Asterisk、选择并配置TTS和ASR引擎、编辑Asterisk配置文件以实现语音识别和合成的功能,以及测试配置的有效性。具体步骤涉及下载安装包、编辑配置文件、设置API密钥等。
113 1
|
2月前
|
API 语音技术
基于Asterisk和TTS/ASR语音识别的配置示例
基于Asterisk和TTS/ASR语音识别的配置示例如下:1. 安装Asterisk:首先,确保你已在服务器上成功安装Asterisk。可以选择从Asterisk官方网站下载最新版本的安装包并按照指南进行安装。2. 安装TTS引擎:选择适合你需求的TTS(Text-to-Speech)引擎,如Google Text-to-Speech、Microsoft Azure Cognitive Services等。按照所选TTS引擎的文档和指示进行安装和配置。3. 配置Asterisk:编辑Asterisk的配置文件,通常是`/etc/asterisk/extensions.conf
61 5
|
3月前
|
机器学习/深度学习 PyTorch 语音技术
语音识别模型
Whisper 是 OpenAI 推出的语音处理项目,基于深度学习,具备高度智能化和准确性的语音识别、翻译和生成能力。通过丰富的数据集和先进的注意力机制,Whisper 在多种语言环境下表现出色,支持语音识别、翻译、口语识别和语音活动检测等多种任务。用户可以通过 Python 代码或命令行轻松使用 Whisper,完成高质量的语音处理任务。官网:https://openai.com/research/whisper,GitHub:https://github.com/openai/whisper。
|
3月前
|
机器学习/深度学习 算法 语音技术
超越传统模型:探讨门控循环单元(GRU)在语音识别领域的最新进展与挑战
【10月更文挑战第7天】随着人工智能技术的不断进步,语音识别已经从一个相对小众的研究领域发展成为日常生活中的常见技术。无论是智能手机上的语音助手,还是智能家居设备,甚至是自动字幕生成系统,都离不开高质量的语音识别技术的支持。在众多用于语音识别的技术中,基于深度学习的方法尤其是递归神经网络(RNNs)及其变体如长短期记忆网络(LSTMs)和门控循环单元(GRUs)已经成为了研究和应用的热点。
162 2
|
3月前
|
机器学习/深度学习 自然语言处理 算法
【NPL自然语言处理】带你迅速了解传统RNN模型
【NPL自然语言处理】带你迅速了解传统RNN模型
|
6月前
|
机器学习/深度学习 自然语言处理
彻底改变语言模型:全新架构TTT超越Transformer,ML模型代替RNN隐藏状态
【7月更文挑战第25天】近年来,NLP领域取得显著进展但也面临挑战,如长上下文建模与计算效率的平衡。为此,研究人员提出Test-Time Training (TTT) 模型架构。TTT由多机构合作开发,旨在解决长上下文建模难题及提高计算效率。通过将隐藏状态视为可学习更新的模型,TTT能随输入增长提升表示能力;采用自监督学习更新规则确保线性计算复杂度的同时保持高性能。实验显示TTT在多种NLP任务中表现优秀,尤其在长上下文处理方面超越Transformer。尽管如此,TTT仍面临训练资源需求高及自监督学习鲁棒性等挑战。[论文](https://arxiv.org/abs/2407.04620)
141 5
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | 秒懂 AI - 深度学习五大模型:RNN、CNN、Transformer、BERT、GPT 简介
**RNN**,1986年提出,用于序列数据,如语言模型和语音识别,但原始模型有梯度消失问题。**LSTM**和**GRU**通过门控解决了此问题。 **CNN**,1989年引入,擅长图像处理,卷积层和池化层提取特征,经典应用包括图像分类和物体检测,如LeNet-5。 **Transformer**,2017年由Google推出,自注意力机制实现并行计算,优化了NLP效率,如机器翻译。 **BERT**,2018年Google的双向预训练模型,通过掩码语言模型改进上下文理解,适用于问答和文本分类。
179 9
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机视觉借助深度学习实现了革命性进步,从图像分类到复杂场景理解,深度学习模型如CNN、RNN重塑了领域边界。
【7月更文挑战第2天】计算机视觉借助深度学习实现了革命性进步,从图像分类到复杂场景理解,深度学习模型如CNN、RNN重塑了领域边界。AlexNet开启新时代,后续模型不断优化,推动对象检测、语义分割、图像生成等领域发展。尽管面临数据隐私、模型解释性等挑战,深度学习已广泛应用于安防、医疗、零售和农业,预示着更智能、高效的未来,同时也强调了技术创新、伦理考量的重要性。
78 1
|
7月前
|
机器学习/深度学习 自然语言处理 PyTorch
【从零开始学习深度学习】34. Pytorch-RNN项目实战:RNN创作歌词案例--使用周杰伦专辑歌词训练模型并创作歌曲【含数据集与源码】
【从零开始学习深度学习】34. Pytorch-RNN项目实战:RNN创作歌词案例--使用周杰伦专辑歌词训练模型并创作歌曲【含数据集与源码】

热门文章

最新文章