京东科技
京东科技关于语音识别思考和探索
kaldi中的pybind11分支上使用pytorch的model+kaldi chain的训练方案以加快训练速度,但该方案并没有摆脱hybrid系统训练的pipeline,步骤比较冗长。 在下一代kaldi的k2中,将加权有限状态转换器(Weighted Finite State Transducers, WFST)结合Pytorch实现Autograd,目前conformer的模型结果已优于kaldi的效果;值得继续跟进。 与此同时,我们在ESPnet上做了很多实验,实现了工业级大数据量上的多机多卡训练,完成了ONNX推理引擎的封装和上线。受限于ESPnet是非流式端到端模型,在人机实时交互的过程中由于延迟太高而影响交互体验,所以只能进行离线识别,比如质检系统,虽说识别效果较好,但由于没有动态热词语言模型对于业务领域的帮助,依然存在线上badcase比较难优化的问题。 Wenet自发布以来受到了社区、工业界的大量关注,从开始就考虑从生产力出发,给出了端到端模型的流式非流式识别结合的训练方案U2,在解码中使用了ctc_greedy_search,ctc_prefix_beam_search, 对比attention_decoder之外还加入了非自回归方案attention_rescoring,很好的降低了自回归系统延迟。除此之外,还吸收了EESEN中关于TLG的做法,加入WFST来通过构建业务场景中的语言模型,从而给出了真实场景中badcase修复的比较好的方案。

可以看到,WeNet吸收了众家所长,既可以在模型训练上达到在各数据集上SOTA的效果,也可以给出比较完善的工业方案。
基于 WeNet 的端到端语音识别优化方案与落地
在TLG解码时,适当调大acoustic-scale,来保证am分数和lm分数在同一个量级上,可以使生成的Nbest更加准确,效果较好
由于CTC spike的稀疏性,如果blank_skip_thresh太小,会降低解码速度,并造成漏字等删除错误,所以可以适当调大blank_skip_thresh,能够在rtf变化较小的情况下,明显降低短音频删除错误,提高识别准确率
得到Nbest后,在AttentionRescore中除了原有的分数外,同时加入ngram的分数,相比不加ngram分数cer绝对值也能降低0.5%左右
runtime引擎中增加在线resample功能,可用一套模型处理不同采样率的音频请求,考虑到目前官方实现的使用的是sox的方案,我们更倾向于kaldi中使用的resample方法,这样训练和推理使用同样的方法会避免对CER的扰动
在大量语音使用场景中都专有名词的识别问题,端到端系统大多都采用TTS来合成语音数据,帮助为ASR来训练,有非常明显的识别效果
数据增强在生产系统中特别重要,能大大提高业务场景识别的鲁棒性,我们在数据处理阶段使用on-the-fly来模拟信道的方案对电话场景识别的帮助较为明显
与TLG并行加入动态语言模型的方案,该方案为我们基于原有kaldi系统开发,同时取得不错的场景名词优化效果
将LM大小裁剪为原来一半大小,构图为TLG后RTF可相对降低30%左右,cer在合理范围内小幅上升(通常小于0.1%)
将TLG转为ConstFst后,RTF可相对降低10%左右,同时单进程内存占用降低50%左右,使得低资源的环境的部署成为可能
增加min_active选项,通过控制使用TLG解码时活跃token的数目,RTF带来成倍的降低
使用TCMalloc做内存管理,优化内存使用,降低RTF
除TorchScript模型外,同样我们结合ESPnet中的ONNX集成和借鉴作业帮使用ONNX的经验进行引擎推理优化,并开源了该方案ONNX模型的导出,从而在runtime中获得更优的推理速度,RTF降低大约25%
京东助力开源 助力WeNet
京东在第一时间开源了基于Wenet在所有中文开源数据集multi_cn上做的识别recipe,其中考虑到部分数据集存在中英文混合数据,所以在建模单元上,中文采用了字、英文采用bpe这样端到端模型比较通用的中英文识别方案,模型的效果表现较好,结果如下:

目前该结果在社区的调优下又得到了继续的提升,可以看出该工具在单纯端到端不加语言模型的情况下,模型精度上也已经达到了SOTA的结果。
如前文所述,runtime引擎中增加在线resample、支持ONNX模型的导出我们也做了开源。
未来,京东智能客服团队也会持续助力开源,助力WeNet。也欢迎各位对我们团队感兴趣、有志于语音的同学加入京东智能客服团队,详请联系fanlu@jd.com。
相关链接
resample 开源地址: https://github.com/fanlu/wenet/commit/bfded32a4f8c35fe1383bba5a45d29f0ffde40a0 ONNX 支持开源地址:https://github.com/fanlu/wenet/commit/40062b065405280b5ae679c8e6d91a2333294d0a WeNet multi_cn 支持:https://github.com/wenet-e2e/wenet/pull/210 kaldi: https://github.com/kaldi-asr/kaldi k2: https://github.com/k2-fsa/snowfall/pull/59 ESPnet: https://github.com/espnet/espnet EESEN: https://github.com/srvk/eesen
