用14,000 小时的中文数据集训练后,模型的效果取得了 SOTA 或者接近 SOTA 的水平。750M 参数量的 Zipformer-XL 模型可以实现 WenetSpeech test_meeting 测试集5.85%的错误率, 达到了目前开源模型的最佳水平;微调后的 Whisper 模型在 SpeechIO 公开测试集上平均错误率为4.31%,接近一些商用 API 的效果;结合 Whisper 和 Qwen2-7B 的多模态大模型,在 Aishell 1 和 2 测试集上分别可以实现0.51%和2.76%的错误率,也达到了 SOTA 的结果。

本文介绍新一代 Kaldi Icefall 项目中的三种 ASR 大模型训练方案。


ASR 大模型介绍


ASR大模型分类图示

ASR 大模型大致可以分为三类:

  1. 传统模型扩展

    • 将传统的模型,诸如 Conformer 等,参数增大,训练数据增多。

    • 这类模型一般只针对 ASR 任务,常配合CTC或者Transducer训练和解码。

    • 因为解码的速度很快,部署推理的成本也相对较小。

  2. Transformer Encoder-Decoder 结构

    • 采用 TransformerEncoder-Decoder结构的大模型,比如 OpenAI 发布的 Whisper 系列。

    • 这类模型常会针对多语种,多任务进行训练,支持多达上百种语言的语音识别,语音翻译,语种识别等任务。

    • 这类模型一般不容易实现流式的语音识别,因为 Transformer 的自回归解码特性,推理速度也较慢。

  3. 多模态 LLM 模型

    • 结合了 LLM 的多模态模型,将LLM通过一个简单的Speech Adaptor和Speech Encoder连接起来。

    • 这类模型分别使用预训练好的 Speech Encoder 和 LLM 进行参数初始化,训练可以只针对 Speech Adaptor 进行。

    • 因为集成了 LLM, 除了语音识别,语音翻译等,训练任务可以进一步扩展到任意的 Speech Instrutions。

    • 模型的参数量和推理速度主要取决于 LLM, Speech Encoder 的参数量一般不会超过 1B,Speech Adaptor 则更加轻量。


Icefall 大模型训练方案

针对上文的三种 ASR 大模型, 下面分别介绍 Icefall 中对应的训练方案。

Zipformer Large 和 XL


参考 Dan 的建议,我们尝试了将 Zipformer 的参数量增大,得到了 Zipformer-Large (160M) 和 Zipformer-XL (750M) 两个模型。

两个模型的训练都使用了 joint 的 CTC 和 Transducer Loss, 方便后续利用CTC guidance[1]来加速 Transducer 的解码。训练过程采用了 Dynamic Chunk, 可以实现流式或者非流式的解码。

方案地址:https://github.com/k2-fsa/icefall/blob/master/egs/multi_zh-hans/ASR/RESULTS.md


Whisper 模型微调

我们对 Whisper-large-v2 进行了微调。同时,采用和distill-whisper[2]相同的模型结构 (但未进行 distillation),微调了一个 decoder 只包含两层网络的轻量化模型。

经过测试,这个轻量化模型的精度稍逊于 Whisper-large-v2 微调版本 (参见后文实验部分),推理速度则可以提高一倍以上。

方案地址:https://github.com/k2-fsa/icefall/tree/master/egs/multi_zh-hans/ASR/whisper


Whisper + Qwen2 LLM 微调

我们使用微调以后的 Whisper 模型的 Encoder,一层 MLP 作为 Adaptor, 分别结合 Qwen 1.5B 和 Qwen 7B LLM, 得到了 whisper-qwen-1.5B, whisper-qwen-7B 两个模型。

实验分为两阶段训练,第一阶段只训练 Adaptor 参数,第二阶段对 LLM 添加 LoRA 参数,联合微调 Adaptor 和 LLM LoRA。为了加快训练和推理速度,Adaptor 对语音序列进行了8 倍降采样,最终每 160 ms 语音信号对应一帧特征序列。

方案地址:https://github.com/k2-fsa/icefall/blob/master/egs/speech_llm/ASR_LLM/RESULTS.md


实验

训练数据

所有实验都是针对中文 ASR 任务。训练数据集如下表,约一万四千小时音频,其中 WenetSpeech 数据集训练集使用标注更新版本[3]。

DatsetNumber of hoursURL
TOTAL13,906---
THCHS-3035https://www.openslr.org/18/
AiShell-1170https://www.openslr.org/33/
AiShell-21,000http://www.aishelltech.com/aishell_2
AiShell-4120https://www.openslr.org/111/
ST-CMDS110https://www.openslr.org/38/
Primewords99https://www.openslr.org/47/
MagicData755https://www.openslr.org/68/
AliMeeting100https://openslr.org/119/
WeNetSpeech10,000https://github.com/wenet-e2e/WenetSpeech
KeSpeech1,542https://github.com/KeSpeech/KeSpeech


CER 结果

针对 Aishell1 test, Aishell2 iOS test, WenetSpeech test_meeting, WenetSpeech test_net 四个测试集,我们计算了模型的字错误率 (CER) 指标,解码都采用了 Greedy Search。

如下表结果,Zipformer-XL 在 WenetSpeech test_meeting 集合上可以实现 5.85% 的错误率,whisper-qwen2-7B 在 aishell1 test set 上可以实现 0.51% 错误率。

Modelaishell1 testaishell2 testwenetspeech test_meetingwenetspeech test_netAvg 4
Paraformer[4]1.682.856.976.744.56
SenseVoice-L[5]2.093.046.736.014.47
Seed-ASR[6]0.682.275.694.663.33
zipformer-L (Ours)1.383.236.267.074.49
zipformer-XL (Ours)1.313.275.856.894.33
whisper-FT (Ours)0.662.808.136.944.63
distill-whisper-FT (Ours)0.942.988.347.174.86
whisper-qwen2-1.5B (Ours)0.682.946.416.634.17
whisper-qwen2-7B (Ours)0.512.766.066.303.91

我们也在 SpeechIO 已经开源的 001 - 026 共 26 个测试集上进行了解码,经过微调以后的 Whisper 模型,可以实现 4.31% 的错误率。(下表结果均使用了 SpeechIO 所提供的正则化方法,不计入"嗯","儿"等字)

Modelspeechio (Avg 001-026)
aliyun_ftasr_api_zh2.06
iflytek_lfasr_api_zh3.01
U2++MoE[7]3.80
zipformer-L (Ours)5.45
zipformer-XL(Ours)5.32
whisper-FT (Ours)4.31
distill-whisper-FT (Ours)4.77
whisper-qwen2-1.5B (Ours)4.8
whisper-qwen2-7B (Ours)4.5


训练耗时

我们对模型训练所花费的时间进行了统计,所有的训练都使用了 8 张 Tensor Core 80G GPU。每个 epoch 使用了 1.1 和 0.9 倍数的速度扰动, 也即每个 Epoch 训练约 4.2万小时数据。

其中, whisper 的微调实验和 whisper-qwen2 的训练使用了DeepSpeed Zero Stage 1来节省显存,使得训练能够进行; Qwen2 的 LoRA 实验开启了Flash-attention 2来进一步加速。

ModelTime / EpochTotal EpochsTotal Days
zipformer-L11 hours209.2
zipformer-XL16 hours2013
whisper-FT28 hours33.5
distill-whisper-FT23 hours65.75
whisper-qwen2-1.5B18 hours43
whisper-qwen2-7B32 hours68


更多细节

我们将训练好的模型,训练日志和解码结果都上传到了 HuggingFace,具体地址见下表。

模型HF 仓库
whisper finetuneyuekai/icefall_asr_multi-hans-zh_whisper
distill-whisper finetuneyuekai/icefall_asr_multi-hans-zh_whisper
zipformer Large (150M)yuekai/icefall-asr-multi-zh-hans-zipformer-large
zipformer XL (700M)yuekai/icefall-asr-multi-zh-hans-zipformer-xl
whisper-qwen2 1.5Byuekai/icefall_asr_aishell_whisper_qwen2_1.5B
whisper-qwen2 7Byuekai/icefall_asr_multi-hans_whisper_qwen2_7B


结果讨论

因为模型参数初始化方式的不同,结果之间的比较并非完全公平。通过这些结果,希望展示 Icefall 中 ASR 大模型训练方案的效果。后续我们会对训练方案持续优化,比如使用 fp8 来提升训练的效率。

本文只针对 Icefall 中的 ASR 大模型训练方案进行了介绍。借助NVIDIA Triton[8]和NVIDIA TensorRT-LLM[9]等工具,我们还可以对 ASR 大模型进行高效部署。后面我们也会对这些部署加速方案[10]进行介绍,欢迎关注和交流。


引用链接

[1]CTC guidance:https://arxiv.org/abs/2210.16481

[2]distill-whisper:https://arxiv.org/abs/2311.00430

[3]标注更新版本:https://github.com/wenet-e2e/WenetSpeech/discussions/54

[4]Paraformer:https://arxiv.org/abs/2206.08317

[5]SenseVoice-L:https://arxiv.org/html/2407.04051v2

[6]Seed-ASR:https://arxiv.org/abs/2407.04675

[7]U2++MoE:https://arxiv.org/abs/2404.16407

[8]NVIDIA Triton:https://github.com/triton-inference-server/server

[9]NVIDIA TensorRT-LLM:https://github.com/NVIDIA/TensorRT-LLM

[10]部署加速方案:https://github.com/k2-fsa/sherpa/tree/master/triton/whisper