【语音识别】WeNet——CPU开源中文语音识别模型选择、部署、封装与流式实现
【语音识别】WeNet——CPU开源中文语音识别模型选择、部署、封装与流式实现
本项目github链接:https://github.com/jzshq208886/wenet_asr
1. 项目需求
公司项目要求选择部署一种开源中文实时语音识别模型。需求总结如下:
- 中文预训练模型,可不经二次训练直接使用
- 支持实时(流式)语音识别
- 能够离线部署在Ubuntu20.04 CPU内网服务器
- 优先考虑准确率,其次考虑速度、资源消耗
2. 背景知识调研
语音识别(Automatic Speech Recognition,ASR)技术的定义为,将具有某种语言实际语义的音频自动转写为该语言的文本的技术。
2.1 传统ASR模型与端到端ASR模型 (依据模型结构分类)
传统语音识别模型分为两部分:声学模型和语言模型。声学模型负责将音频序列转化为音素序列,常见的音素比如汉语拼音、英文音标等,语言模型则负责将这些音素序列转化成文字序列。声学模型和语言模型在训练时并不需要耦合,可以独立训练。传统语音模型的劣势在于需要有发音字典,需要有音素的标注。
端到端(end to end, e2e)语音识别模型使用一体化的深度学习模型结构,直接将音频序列转化为文字序列。
资料参考:
一文入门端到端语音识别(多图详解)
2.2 流式ASR与非流式ASR(依据训练方式分类)
语音识别根据训练时输入数据的方式分为流式识别与非流式识别,两者分别适用于实时场景和非实时场景。
2.2.1 流式与非流式ASR模型底层原理区别
流式识别,即持续接收音频流并实时转写为文字,其对于句中某一位置文字的预测仅基于其上文(已接收到的一部分音频流)。应用场景如实时会议字幕、输入法语音输入。
非流式识别,即将预录制的完整音频文件转写为文字,其对于句中某一位置文字的预测基于其上下文。应用场景如语音消息转文字等预录制音频转写。
技术实现上,流式识别与非流式识别模型的区别在于训练阶段使用训练数据的方法不同,即训练时某一位置输出的预测是基于上文还是上下文。
推理时,虽然也可以将实时接收到的非完整音频流,当作一段完整的短音频输入非流式识别模型,但这将导致模型在训练与推理阶段的不统一(非流式模型根据上下文预测某一位置的输出,然而实时语音流不具有完整的下文语义),推理效果相比训练阶段大幅下降。
换句话说,流式与非流式识别的根本区别在于,流式识别通过“仅使用上文语义进行训练”的方式,实现了语义不完整(话说一半)情况下的准确转写。
2.2.2 实时语音识别逻辑原理
流式ASR模型接受单段音频并返回转写文字,因此想要实现实时更新字幕的效果,需要不断接收新的音频流,追加到旧音频流的末尾,并不断调用流式ASR模型,以实时更新转写结果。
该逻辑将引出以下问题:模型推理速度需要足够快。如果模型进行一次推理的周期大于接收新音频流的周期,则会导致模型计算“供不应求”,无法达到实时效果。使用指标“实时率”( R T F RTF RTF)来量化模型的实时效果:
R T F = T a u d i o t r a n s T a u d i o RTF = \frac{T_{audio\:trans}}{T_{audio}} RTF=