当前位置: 首页 > article >正文

WeNet:面向生产的流式和非流式端到端语音识别工具包

这篇文章介绍了WeNet,一个面向生产的开源端到端(E2E)语音识别工具包。WeNet的主要特点和贡献如下:

  1. 统一流式和非流式识别:提出了一种名为U2的两阶段框架,能够在单一模型中同时支持流式和非流式语音识别,解决了传统E2E模型难以同时支持这两种模式的问题。

  2. 模型架构:采用混合的连接主义时间分类(CTC)/注意力(AED)架构,使用Transformer或Conformer作为编码器,并通过动态块训练技术实现流式和非流式的统一。

  3. 生产就绪:WeNet的设计完全基于PyTorch及其生态系统,支持从模型训练到部署的无缝衔接,无需依赖Kaldi等其他工具,简化了安装和使用。

  4. 运行时优化:支持多种运行时平台(如x86服务器和ARM嵌入式设备),并通过量化技术显著提升了推理速度和效率。

  5. 实验验证:在AISHELL-1数据集和15,000小时的中文数据集上进行了广泛实验,验证了WeNet在流式和非流式模式下的性能,展示了其在实际应用中的潜力。

  6. 未来工作:WeNet已经支持自定义语言模型和基于gRPC的语音识别微服务框架,未来将继续更新更多功能。

WeNet通过统一流式和非流式识别、简化部署流程、优化运行时性能,提供了一个高效、轻量级的E2E语音识别解决方案,适用于从研究到生产的多种应用场景。这里是自己的论文阅读记录,感兴趣的话可以参考一下,如果需要阅读原文的话可以看这里,如下所示:

摘要

本文提出了一种名为WeNet的开源语音识别工具包,其中实现了一种名为U2的新两阶段方法,用于在单一模型中统一流式和非流式端到端(E2E)语音识别。WeNet的主要动机是缩小E2E语音识别模型在研究和部署之间的差距。WeNet提供了一种在实际场景中高效部署自动语音识别(ASR)应用的方法,这是其与其他开源E2E语音识别工具包的主要区别和优势。我们开发了一种混合的连接主义时间分类(CTC)/注意力架构,使用Transformer或Conformer作为编码器,并使用注意力解码器对CTC假设进行重评分。为了在统一模型中实现流式和非流式识别,我们采用了一种基于动态块的注意力策略,允许自注意力机制在随机长度的上下文中聚焦。我们在AISHELL-1数据集上的实验表明,与标准的非流式Transformer相比,我们的模型在非流式ASR中实现了5.03%的相对字符错误率(CER)降低。经过模型量化后,我们的模型在运行时具有合理的实时因子(RTF)和延迟。

官方开源项目地址在这里,如下所示:

1 引言

端到端(E2E)自动语音识别(ASR)模型在过去几年中获得了越来越多的关注,例如连接主义时间分类(CTC)[1, 2]、循环神经网络转录器(RNN-T)[3, 4, 5, 6]和基于注意力的编码器-解码器(AED)[7, 8, 9, 10, 11]。与传统的混合ASR框架相比,E2E模型的最大优势是其极其简化的训练过程。

最近的研究[12, 13, 14]也表明,E2E系统在标准词错误率(WER)上已经超越了传统的混合ASR系统。考虑到E2E模型的上述优势,将新兴的ASR框架部署到实际生产中变得非常必要。然而,部署E2E系统并不容易,有许多实际问题需要解决。

首先,流式问题。流式推理对于许多需要ASR系统快速响应且低延迟的场景至关重要。然而,某些E2E模型(如LAS[8]和Transformer[15])难以以流式方式运行。要么需要大量努力,要么会引入明显的准确性损失才能使这些模型以流式方式工作[16, 17, 18]。

其次,统一流式和非流式模式。流式和非流式系统通常是分开开发的。在单一模型中统一流式和非流式可以减少开发工作量、训练成本以及部署成本,这也是生产应用所偏好的[19, 20, 21, 22]。

第三,生产问题,这是我们在WeNet设计过程中最关心的问题。将E2E模型推广到实际生产应用需要大量努力。因此,我们必须仔细设计推理工作流程,包括模型架构、应用和运行时平台。由于自回归束搜索解码的工作方式,大多数E2E模型架构的工作流程极其复杂。此外,在边缘设备上部署模型时,还应考虑计算和内存成本。至于运行时平台,尽管有多种平台可以用于神经网络推理,如ONNX(Open Neural Network Exchange)、LibTorch in Pytorch、TensorRT[23]、OpenVINO、MNN[24]和NCNN,但仍需要语音处理和高级深度学习优化知识来为特定应用选择最佳平台。

在本工作中,我们提出了WeNet来解决上述问题。“We”在WeNet中受到“WeChat”的启发,意味着连接和共享,而“Net”则来自Espnet[25],因为我们参考了Espnet中的许多优秀设计。Espnet是最流行的开源端到端语音研究平台。它主要关注端到端ASR,并采用广泛使用的动态神经网络工具包Chainer和PyTorch作为主要的深度学习引擎。相比之下,WeNet的主要动机是缩小E2E语音识别模型在研究和生产之间的差距。基于面向生产的原则,WeNet采用了以下实现。首先,我们提出了一种新的两阶段框架,即U2,以解决统一流式和非流式问题。其次,从模型训练到部署,WeNet仅依赖于PyTorch及其生态系统。WeNet的关键优势如下:

  • 生产优先且生产就绪:WeNet的Python代码符合TorchScript的要求,因此通过Torch Just In Time(JIT)可以直接导出训练好的模型,并使用LibTorch进行推理。研究和生产模型之间没有差距。

  • 流式和非流式ASR的统一解决方案:WeNet采用U2框架,实现了一个准确、快速且统一的E2E模型,有利于工业应用。

  • 便携式运行时:提供了多个运行时,展示了如何在不同平台上托管WeNet训练的模型,包括服务器(x86)和嵌入式(Android平台上的ARM)。

  • 轻量级:WeNet专门为E2E语音识别设计,代码简洁明了,完全基于PyTorch及其生态系统。因此,它不依赖于Kaldi[26],简化了安装和使用。

我们的实验表明,WeNet是一个易于学习的语音识别工具包,提供从研究到生产的端到端解决方案。本文将描述模型架构、系统设计和运行时基准,包括实时因子(RTF)和延迟。

2 WeNet

模型架构

由于我们的目标是解决流式、统一和生产问题,解决方案应简单易构建,便于在运行时应用,同时保持良好的性能。

U2,一种统一的两阶段联合CTC/AED模型,为这些问题提供了一个很好的解决方案。如图1所示,U2由三部分组成:共享编码器、CTC解码器和注意力解码器。共享编码器由多个Transformer[15]或Conformer[27]层组成,仅考虑有限的右侧上下文以保持平衡的延迟。CTC解码器由一个线性层组成,将共享编码器的输出转换为CTC激活,而注意力解码器由多个Transformer解码器层组成。在解码过程中,CTC解码器在第一阶段以流式模式运行,注意力解码器在第二阶段用于提供更准确的结果。

2.1.1 训练

U2的训练结合了CTC损失和AED损失:

如前所述,当共享编码器不需要完整话语信息时,U2可以在流式模式下工作。我们采用动态块训练技术来统一非流式和流式模型。首先,输入通过固定的块大小C分割成多个块,每个块关注自身和所有先前的块,因此第一阶段的CTC解码器的整体延迟仅取决于块大小。当块大小受限时,模型以流式方式工作;否则,它以非流式方式工作。其次,块大小在训练中从1动态变化到当前训练话语的最大长度,因此训练好的模型学会以任意块大小进行预测。经验表明,较大的块大小会带来更好的结果,但延迟更高,因此我们可以在运行时通过调整块大小轻松平衡准确性和延迟。

2.1.2 解码

为了在研究阶段的Python解码过程中比较和评估联合CTC/AED模型的不同部分,WeNet支持四种解码模式:

  • attention:对模型的AED部分应用标准的自回归束搜索。

  • ctc_greedy_search:对模型的CTC部分应用CTC贪心搜索,CTC贪心搜索比其他模式快得多。

  • ctc_prefix_beam_search:对模型的CTC部分应用CTC前缀束搜索,可以给出n-best候选。

  • attention_rescoring:首先对模型的CTC部分应用CTC前缀束搜索以生成n-best候选,然后使用相应的编码器输出在AED解码器部分对n-best候选进行重评分。

在开发运行时阶段,WeNet仅支持attention_rescoring解码模式,因为这是我们生产中的最终解决方案。

系统设计

WeNet的整体设计栈如图2所示。注意,底层栈完全基于PyTorch及其生态系统。中间栈由两部分组成。当我们开发研究模型时,使用TorchScript进行模型开发,使用Torchaudio进行实时特征提取,使用分布式数据并行(DDP)进行分布式训练,使用Torch Just In Time(JIT)进行模型导出,使用PyTorch量化进行模型量化,并使用LibTorch进行生产运行时。LibTorch生产用于托管生产模型,设计用于支持各种硬件和平台,如CPU、GPU(CUDA)、Linux、Android和iOS。顶层栈展示了WeNet中典型的从研究到生产的流程。以下小节将详细介绍这些模块的设计。

2.2.1 数据准备

在数据准备阶段不需要任何离线特征提取,因为我们使用实时特征提取进行训练。WeNet只需要Kaldi格式的转录、波形列表文件和模型单元字典来创建输入文件。

2.2.2 训练

WeNet的训练阶段具有以下关键特性:

  • 实时特征提取:基于Torchaudio,可以生成与Kaldi相同的Mel滤波器组特征。由于特征是从原始PCM数据实时提取的,我们可以在时间和频率级别对原始PCM进行数据增强,最后在特征级别进行增强,从而丰富数据的多样性。

  • 联合CTC/AED训练:联合训练加快了训练的收敛速度,提高了训练的稳定性,并给出了更好的识别结果。

  • 分布式训练:WeNet支持使用PyTorch中的分布式数据并行(DDP)进行多GPU训练,以充分利用多工作者的多GPU资源,实现更高的线性加速。

2.2.3 解码

提供了一组Python工具,用于识别波形文件并在不同解码模式下计算准确性。这些工具帮助用户在部署模型之前验证和调试模型。支持第2.1.2节中的所有解码算法。

2.2.4 导出

由于WeNet模型是使用TorchScript实现的,因此可以通过Torch JIT直接导出到生产环境中。然后,导出的模型可以使用LibTorch库在运行时托管,同时支持float-32模型和量化int-8模型。在嵌入式设备(如基于ARM的Android和iOS平台)上使用量化模型可以提高推理速度,甚至提高一倍以上。

2.2.5 运行时

目前,我们支持在两个主流平台上托管WeNet生产模型,即x86作为服务器运行时和Android作为设备运行时。为两个平台提供了C++ API库和可运行的演示,用户还可以使用C++库实现自定义系统。我们仔细评估了ASR系统的三个关键指标,即准确性、实时因子(RTF)和延迟。第3.2节中报告的结果将表明,WeNet适用于许多ASR应用,包括服务API和设备语音助手。

3 实验

我们在开源的中文普通话语音语料库AISHELL-1[28]上进行了实验,该语料库包含150小时的训练集、10小时的开发集和5小时的测试集。测试集总共包含7,176个话语。对于声学特征,通过Torchaudio实时计算80维对数Mel滤波器组(FBANK),窗口大小为25ms,步长为10ms。此外,应用了SpecAugment[29],使用最大频率掩码(F=10)的2个频率掩码和最大时间掩码(T=50)的2个时间掩码来缓解过拟合。在编码器前使用了两个卷积子采样层,核大小为3*3,步长为2。对于模型参数,我们使用12个Transformer层作为编码器,6个Transformer层作为解码器。使用Adam优化器,学习率计划为25,000个预热步骤。此外,我们通过平均训练期间在开发集上具有较低损失的前K个最佳模型来获得最终模型。

统一模型评估

我们首先评估了一个非流式模型(M1)作为基线,该模型通过全注意力进行训练和推理,另一个统一模型(M2)采用动态块策略。M2在解码时使用不同的块大小(full/16/8/4)进行推理,其中full表示全注意力非流式情况,16/8/4表示流式情况。

如表1所示,统一模型不仅在全注意力情况下与非流式模型显示出可比的结果,而且在流式情况下使用有限的块大小16/8/4也给出了有希望的结果,验证了动态块训练策略的有效性。

比较四种不同的解码模式,attention_rescoring模式在非流式模式和统一模式下始终能提高CTC结果。ctc_greedy_search和ctc_prefix_beam_search的性能几乎相同,并且随着块大小的减小,它们的性能显著下降。attention_rescoring模式缓解了ctc_prefix_beam_search结果的性能下降,而attention模式则略微降低了性能。

由于attention模式是自回归过程,而attention_rescoring模式不是,因此attention_rescoring模式更快且具有更好的RTF。总体而言,attention_rescoring模式不仅显示出有希望的结果,而且具有更低的RTF。因此,基于动态块的统一模型与attention_rescoring解码是我们生产中的选择。因此,运行时仅支持attention_rescoring模式。

运行时基准

本节将展示上述统一模型M2的量化、RTF和延迟基准。我们在服务器x86平台和设备ARM Android平台上分别完成了基准测试。

对于云x86平台,CPU为4核Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz,总内存为16G。仅使用一个线程进行CPU线程和TorchScript推理,因为云服务需要并行处理,单线程避免了并行处理中的性能下降。对于设备Android,CPU为4核高通骁龙865,内存为8G,单线程用于设备推理。

3.2.1 量化

这里我们仅比较量化前后的CER。如表2所示,量化前后的CER相当。表2中的CER结果与表1中的结果略有不同,因为表1中的结果是通过Python研究工具评估的,而表2中的结果是通过运行时工具评估的。

3.2.2 RTF

如表3所示,随着块大小的减小,RTF增加,因为较小的块需要更多的前向计算迭代。此外,量化可以在设备(Android)上带来约2倍的加速,在服务器(x86)上略有改善。

3.2.3 延迟

对于延迟基准,我们创建了一个WebSocket服务器/客户端来模拟真实的流式应用,因为此基准仅在服务器x86平台上进行。我们评估的平均延迟如下:

  • 模型延迟(L1):由模型结构引入的等待时间。对于我们的基于块的解码,平均等待时间理论上为块大小的一半。我们模型的总模型延迟为(chunk/2∗4+6)∗10(ms),其中4是子采样率,6是编码器前两个CNN层引入的lookahead,10是帧移。

  • 重评分成本(L2):第二阶段注意力重评分的时间成本。

  • 最终延迟(L3):用户(客户端)感知的延迟,即用户停止说话与获得识别结果之间的时间差。当我们的ASR服务器接收到语音结束信号时,它首先对剩余语音进行CTC搜索,然后进行第二阶段的注意力重评分,因此重评分成本是最终延迟的一部分。网络延迟也应考虑在内,但由于我们在同一台机器上测试服务器/客户端,因此可以忽略不计。

如表4所示,不同块大小的重评分成本几乎相同,这是合理的,因为重评分计算与块大小无关。此外,最终延迟主要由重评分成本决定,这意味着我们可以通过减少重评分成本进一步减少最终延迟。最后,随着解码块从4变为8,从8变为16,最终延迟略有增加。

15,000小时任务

我们进一步使用从各种领域(包括脱口秀、电视剧、播客和广播)收集的15,000小时中文数据集训练提出的U2模型,以展示我们模型在工业规模数据集上的能力。该模型在三个测试集上进行评估。

我们使用Conformer[27]作为共享编码器,解码器与之前的实验相同,是一个Transformer。Conformer在Transformer的基础上增加了卷积模块,因此它可以捕捉局部和全局上下文,并在不同的ASR任务中获得更好的结果。特别地,因果卷积用于Conformer的块训练,我们添加了额外的3维音高特征,与80维FBANK连接。我们保持了之前实验中编码器的主要结构,仅将Transformer层更改为12个Conformer层,具有多头注意力(4个头)。每个Conformer层使用384个注意力维度和2048个前馈维度。此外,我们还使用了梯度累积来稳定训练,并每4步更新一次参数。此外,我们通过平均训练期间在评估集上具有较低损失的前10个最佳模型来获得最终模型。我们使用动态块训练训练了一个全上下文的Conformer CTC模型和一个U2模型。使用三个测试集评估这些模型,包括AISHELL-1、电视剧领域和对话领域。U2模型在attention_rescoring解码模式下工作,而Conformer模型在attention解码模式下工作。如表5所示,我们可以看到U2在总体上取得了与Conformer基线相当的结果,甚至在AISHELL-1测试集上使用全注意力进行推理时取得了更好的结果。当块大小为16时,CER并没有明显变差。

为了分析为什么U2模型在AISHELL-1任务上表现更好,我们收集了每个测试集中的平均话语时长,如表5所示。由于AISHELL-1中的平均话语时长比其他两个测试集长得多,AISHELL-1任务可能需要更强的全局信息建模能力。U2模型可以使用注意力解码器对CTC假设进行重评分,这使得它更适合AISHELL-1任务。

4 结论

我们提出了一种新的开源面向生产的E2E语音识别工具包,名为WeNet,提供了一个统一的流式和非流式应用解决方案。本文介绍了工具包背后的模型结构、系统设计和基准测试。整个工具包设计精良、轻量级,并在开放数据集和内部大型数据集上展示了出色的性能。WeNet已经在运行时支持自定义语言模型,采用了n-gram和WFST。此外,WeNet还支持基于gRPC的语音识别微服务框架应用。未来将更新更多功能。


http://www.kler.cn/a/458832.html

相关文章:

  • 传统听写与大模型听写比对
  • 2021.12.28基于UDP同信的相关流程
  • OpenGL ES 04 图片数据是怎么写入到对应纹理单元的
  • Unity 3D 从入门到精通:开启游戏开发的奇幻之旅
  • springboot+vue实现SSE服务器发送事件
  • overscroll-behavior-解决H5在ios上过度滚动的默认行为
  • 下载mysql免安装版和配置
  • 计算机网络-L2TP VPN基础实验配置
  • LeetCode-正则表达式匹配(010)
  • 为什么C++支持函数重载而C语言不支持?
  • “技术学习”(Technical Learning)在英文中的多种表达方式
  • 第十六届蓝桥杯模拟赛(第一期)(C语言)
  • HarmonyOS NEXT 实战之元服务:静态案例效果---本地生活服务
  • SkyWalking Agent 配置 Spring Cloud Gateway 插件解决日志错误
  • Momentum Contrast for Unsupervised Visual Representation Learning论文笔记
  • Django多字段认证的实现
  • python脚本加载ui页面:PySide6设计的页面
  • SQL 实战:窗口函数进阶 – 实现复杂滑动窗口与动态累计计算
  • 大数据与机器学习(它们有何关系?)
  • Mac电脑python多版本环境安装与切换
  • Selenium之Web元素定位
  • Android笔试面试题AI答之Android基础(7)
  • hive-sql 连续登录五天的用户
  • 【GeekBand】C++设计模式笔记18_State_状态模式
  • 【2024年-6月-21日-开源社区openEuler实践记录】探索 intel-kernel:英特尔架构内核优化之路
  • [TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器