尧图精选

FunASR Fun-ASR-Nano 微调实战:从 ChatML 数据准备、LoRA 参数高效微调到 WER 评测全流程

🕒 发布时间:2026/9/13 1:32:45 📁 来源:尧图网络
FunASR Fun-ASR-Nano 微调实战从 ChatML 数据准备、LoRA 参数高效微调到 WER 评测全流程【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR导读Fun-ASR-Nano 是 FunASR 生态中一款 0.8B 参数量的端到端语音识别大模型在通用识别之外还针对中文 7 大方言、26 种口音以及教育、金融等垂直领域做了专项优化。本文以 examples/industrial_data_pretraining/fun_asr_nano/docs/finetune.md 为核心骨架完整讲解如何基于 FunASR 工具链对 Fun-ASR-Nano 进行领域数据微调从 ChatML 格式数据集的构造、scp2jsonl.py一键转换到finetune.sh的模块级冻结策略与lora_finetune.sh的 LoRA 参数高效微调再到decode.py解码与 WER 评测闭环。读完本文你可以独立完成行业数据 → 微调 → 评测 → 部署的完整技术路线。一、模型与微调任务背景Fun-ASR-NanoFunAudioLLM/Fun-ASR-Nano-2512由通义实验室发布训练数据达到数千万小时真实语音支持中文、英文、日文低延迟实时转写并覆盖 7 大方言与 26 种区域口音同时支持歌词识别、说唱语音识别等特殊场景另一份Fun-ASR-MLT-Nano-2512检查点则扩展至 31 种语言详见 fun_asr_nano/README.md。大模型在通用场景表现优秀但在专业术语密集、口音混杂、噪声复杂的工业数据上仍可能出现幻觉生成或语言混淆。微调Finetune正是解决这类垂直领域适配问题的主要手段。在 FunASR 中对 Fun-ASR-Nano 的微调并不需要重写模型代码而是通过训练脚本中的freeze开关灵活选择冻结/训练哪些模块从而在数据量有限时兼顾效果与成本。整个微调闭环依赖的脚本与配置文件均位于 examples/industrial_data_pretraining/fun_asr_nano/ 目录下文件作用finetune.sh全量/部分参数微调入口lora_finetune.shLoRA 参数高效微调入口tools/scp2jsonl.pywav.scp 标注文本 → ChatML JSONL 转换工具decode.py微调后模型批量解码tools/whisper_mix_normalize.py文本逆归一化评测前处理model.pyFunASRNano 模型实现冻结逻辑、LoRA 注入二、环境准备微调 Fun-ASR-Nano 依赖 FunASR 训练框架安装命令如下pip install funasr1.3.26训练入口是 FunASR 提供的funasr-train-ds命令DeepSpeed 版 trainer。finetune.sh中通过train_tool\which funasr-train-ds自动定位该命令因此请确保安装后该命令位于PATH中。此外脚本使用torchrun拉起分布式训练并根据CUDA_VISIBLE_DEVICES自动推导nproc_per_node单卡环境无需额外配置。三、数据准备构造 ChatML 格式训练集Fun-ASR-Nano 微调采用 ChatMLChat Markup Language格式的 JSONL 数据。仓库提供了示例文件 data/train_example.jsonl单条数据形如head -n1 data/train_example.jsonl | jq { messages: [ { role: system, content: You are a helpful assistant. }, { role: user, content: 语音转写|startofspeech|!https://modelscope.cn/datasets/FunAudioLLM/funasr-demo/resolve/master/audios/IT0011W0002.wav|endofspeech| }, { role: assistant, content: 几点了 } ], speech_length: 145, text_length: 3 }3.1 各字段含义messages[0]systemcontent固定为You are a helpful assistant.无需修改。messages[1]usercontent由两部分拼接——指令 prompt 与音频文件路径其中音频路径被|startofspeech|!和|endofspeech|两个特殊标记包裹。默认 prompt 为中文语音转写和英文Speech transcription:可结合目标语种组合使用例如语音转写成英文、Transcribe speech into Chinese:当音频对应的文本标注中不含阿拉伯数字或标点符号时可使用语音转写不进行文本规整/Speech transcription without text normalization:以跳过文本规整环节、避免标注与规整后的目标不一致。messages[2]assistantcontent即音频文件对应的文本标注转写结果。speech_length音频文件的 fbank 帧数每帧 10ms。转换工具中按(duration_ms - 25) // 10 1计算即由音频时长推算。text_length标注文本的 token 数使用Qwen/Qwen3-0.6B分词器编码统计。该字段用于训练时的 token 级动态 batch 切分见后文batch_typetoken。3.2 从 wav.scp 一键转换scp2jsonl.py手工编写上述 JSONL 既繁琐又易错。仓库在 tools/scp2jsonl.py 提供了转换工具可将最常见的 ASR 训练数据格式——wav.scp 与标注文本——批量转换为 ChatML 格式。train_wav.scp中每行是唯一 ID 音频路径支持本地路径与 HTTP 链接BAC009S0764W0121 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0764W0121.wav BAC009S0916W0489 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0916W0489.wavtrain_text.txt中每行是唯一 ID 标注文本ID 必须与 wav.scp 一一对应BAC009S0764W0121 甚至出现交易几乎停滞的情况 BAC009S0916W0489 湖北一公司以员工名义贷款数十员工负债千万执行转换python tools/scp2jsonl.py \ scp_filedata/train_wav.scp \ transcript_filedata/train_text.txt \ jsonl_filedata/train_example.jsonl从源码实现看该工具的关键逻辑tools/scp2jsonl.py包括逐行读取两个文件并做zip配对先校验两文件行数是否一致再校验每条记录中 wav.scp 与 text 的 ID 是否匹配不匹配会记录UTT mismatch错误并跳过对每个音频文件调用soundfile读取时长据此计算speech_length使用modelscope.AutoTokenizer加载Qwen/Qwen3-0.6B分词器计算text_length通过ThreadPoolExecutor多线程并行处理max_workers默认取 CPU 核数并用tqdm展示进度处理完成后汇总成功/失败条数与错误样本便于排查坏数据。验证集数据val_wav.scp/val_text.txt→val_example.jsonl同样通过该工具生成仓库 data/ 目录下已提供训练/验证两套完整示例。四、启动微调finetune.sh 与模块冻结策略4.1 训练脚本全参数解读微调主入口为 finetune.sh。其核心命令行参数如下torchrun $DISTRIBUTED_ARGS \ ${train_tool} \ modelFunAudioLLM/Fun-ASR-Nano-2512 \ trust_remote_codetrue \ train_data_set_list${train_data} \ valid_data_set_list${val_data} \ dataset_conf.data_split_num1 \ dataset_conf.batch_samplerBatchSampler \ dataset_conf.batch_size6000 \ dataset_conf.sort_size1024 \ dataset_conf.batch_typetoken \ dataset_conf.num_workers4 \ train_conf.max_epoch50 \ train_conf.log_interval1 \ train_conf.resumetrue \ train_conf.validate_interval2000 \ train_conf.save_checkpoint_interval2000 \ train_conf.effective_save_name_excludesNone \ train_conf.keep_nbest_models20 \ train_conf.avg_nbest_model10 \ train_conf.use_deepspeedfalse \ train_conf.deepspeed_config${deepspeed_config} \ optim_conf.lr0.0002 \ audio_encoder_conf.freezetrue \ audio_adaptor_conf.freezetrue \ llm_conf.freezefalse \ output_dir${output_dir} ${log_file}关键参数说明model模型名从 ModelScope/HuggingFace 拉取或本地模型目录路径默认FunAudioLLM/Fun-ASR-Nano-2512trust_remote_codetrue允许加载仓库自带的model.py自定义实现。数据与 batchbatch_typetoken表示按 token 数切分 batchbatch_size6000为单 batch 内 token 上限sort_size1024控制排序桶大小以提升 padding 效率num_workers4为数据加载进程数。训练控制max_epoch50、validate_interval2000、save_checkpoint_interval2000均为 step 粒度keep_nbest_models20保留最近 20 个最优 checkpointavg_nbest_model10在训练结束时对最优 10 个模型做平均average 后的模型通常更稳resumetrue支持断点续训。优化器optim_conf.lr0.0002为学习率LoRA 脚本中为0.0001通常参数高效微调使用更小的学习率。DeepSpeed脚本默认use_deepspeedfalse通过 torchrun 直接训练如需流水线/ZeRO 优化可置为true并使用仓库提供的 deepspeed_conf/ds_stage1.json 配置。分布式脚本读取环境变量WORLD_SIZE、RANK、MASTER_ADDR、MASTER_PORT默认 127.0.0.1:26669配合torchrun即可扩展到多机多卡。4.2 freeze 冻结语义微调哪些模块由你决定Fun-ASR-Nano 模型主体由三部分构成对应 model.py 的构造参数audio_encoder音频编码器、audio_adaptor音频-LLM 适配器、llmQwen3-0.6B 因果语言模型此外还有 CTC decoder 用于字符级时间戳等辅助任务。从 model.py 的源码实现可以确认冻结语义当某模块的freezetrue时其所有参数requires_grad被置为False并切换到eval()模式前向不更新、不参与反向传播。因此微调时只需修改finetune.sh中的三行audio_encoder_conf.freezetrue \ audio_adaptor_conf.freezetrue \ llm_conf.freezefalse \将需要微调的模块freeze设为false。脚本默认只微调 LLMllm_conf.freezefalse音频编码器与适配器保持冻结——这与语音识别大模型的领域适配主要发生在语言模型侧的经验一致也能显著降低显存与算力开销。4.3 按数据量选择的推荐配置训练脚本注释与文档给出了按训练数据规模分档的推荐策略训练数据 1000 小时建议只微调audio_adaptoraudio_adaptor_conf.freezefalse其余冻结训练数据 5000 小时建议微调audio_encoderaudio_adaptor两者freezefalseLLM 冻结训练数据 10000 小时建议全参数微调三个模块freeze全部为false。数据量越大可安全解锁的参数越多反之数据不足时解锁过多参数容易过拟合。更多训练细节可参考仓库的通用训练教程 docs/tutorial/README.md中文版见 docs/tutorial/README_zh.md。启动训练bash finetune.sh日志输出至./outputs/log.txtcheckpoint 与最终平均模型保存在./outputs/目录。五、LoRA 参数高效微调当显存紧张或希望进一步降低过拟合风险时LoRA 是比全量/部分微调更轻量的替代方案。仓库提供了独立的 lora_finetune.sh对 Qwen3-0.6B LLM 的q_proj/v_proj线性层注入 LoRA 适配器bash lora_finetune.sh5.1 三个关键开关与finetune.sh相比LoRA 脚本新增了三个开关llm_conf.use_loratrue在 LLM 目标层注入LoRALinear适配器。基座权重共享且冻结只新增可训练的lora_A/lora_B两个低秩矩阵训练参数量大幅缩减。lora_onlytrue冻结所有非 LoRA 参数audio_encoder、audio_adaptor、ctc_decoder实现纯 LoRA 训练。checkpoint 仍保存完整 state dict基座权重不变 适配器参数因此用相同的use_loratrue配置即可续训或解码。llm_conf.freezetrue保持 LLM 基座权重冻结。这一项与lora_only在语义上有所重叠但更显式、更安全。5.2 LoRA 超参数LoRA 超参数集中在llm_conf.lora_conf下模型配置文件已内置默认值r秩、lora_alpha缩放系数、lora_dropout、target_modules目标模块列表。lora_finetune.sh中注释给出的默认参考值为r16、lora_alpha32、lora_dropout0.05、target_modules[q_proj, v_proj]。需要调整时可在命令行覆盖例如llm_conf.lora_conf.r325.3 混合策略LoRA 微调 LLM 解冻音频模块如果希望在只对 LLM 做 LoRA 的同时保持音频编码器/适配器可训练对数百小时领域数据是很好的折中可设置lora_onlyfalse \ audio_encoder_conf.freezefalse \ audio_adaptor_conf.freezefalse \ llm_conf.freezetrue这样 LLM 基座权重保持冻结仅训练 LoRA 适配器而音频侧参数正常训练。5.4 解码与部署合并公式LoRA 微调后的 checkpoint 可直接用下一节的decode.py解码无需任何合并步骤——前向计算时把适配器输出叠加到基座输出上即可。若要将适配器折叠进基座权重以生成独立的部署 checkpoint对每个目标模块计算W W (lora_alpha / r) * lora_B lora_A然后从 state dict 中删除lora_A/lora_B键即可得到标准权重。六、模型评测解码与 WER 计算6.1 批量解码微调完成后使用 decode.py 对验证集解码python decode.py \ model_dir/path/to/finetuned \ scp_filedata/val_wav.scp \ output_fileoutput.txt从源码看decode.py该脚本会通过funasr.AutoModel加载模型model为模型名或微调后目录trust_remote_codetrue并显式指定remote_code./model.py自动挂载fsmn-vad语音活动检测vad_kwargs{max_single_segment_time: 30000}限制单段最大时长 30 秒逐行读取 wav.scp对每个音频调用model.generate(input[wav_path], cache{}, batch_size1)将识别文本按ID\ttext格式写入输出文件设备选择逻辑为 CUDA 优先、其次 MPS、最后 CPU无 GPU 也能运行。6.2 文本逆归一化与 WER 计算语音识别评测要求标注与识别结果在相同文本规范下比较。由于 Fun-ASR-Nano 支持中英文混写、数字与标点等表达形式直接比较原始文本会引入不必要的误差因此需要先对标注和识别结果分别做文本逆归一化再计算 WERpython tools/whisper_mix_normalize.py data/val_text.txt data/val_norm.txt python tools/whisper_mix_normalize.py output.txt output_norm.txt compute-wer data/val_norm.txt output_norm.txt cer.txt tail -n8 cer.txttools/whisper_mix_normalize.py 负责文本逆归一化如数字、标点、中英文混合表达的统一输入为原始文本文件、输出为规整后文件compute-wer为 FunASR 工具链内置的 WER/CER 计算命令输出明细写入cer.txttail -n8 cer.txt查看汇总统计整体 CER/WER、替换/删除/插入错误数等。如果训练数据中的标注本身不含数字与标点即使用了不进行文本规整的 prompt评测时同样应跳过规整步骤保持训练与评测口径一致。七、微调结果的应用与延伸微调产出的 checkpoint 与 FunASR 常规模型用法完全兼容可直接用于推理服务使用funasr.AutoModel加载微调后目录进行单条/批量推理支持hotwords热词与language语言指定参考 fun_asr_nano/README.md 的推理示例该目录同时提供了 serve_realtime_ws.py 与 serve_vllm.py可将微调模型以 WebSocket 实时流式服务或 vLLM 加速推理形式对外提供实时服务细节见 docs/realtime_demo.mdvLLM 部署详见 docs/vllm_guide.md。八、微调全流程速查表阶段命令 / 参数关键要点环境pip install funasr1.3.26需保证funasr-train-ds在 PATH 中数据python tools/scp2jsonl.py scp_file... transcript_file... jsonl_file...wav.scp 与标注 ID 必须一一对应全量微调bash finetune.sh按数据量调节*_conf.freeze默认只微调 LLMLoRA 微调bash lora_finetune.shuse_loralora_onlyllm_conf.freeze三开关解码python decode.py model_dir... scp_file... output_file...自动挂 VAD无需合并 LoRA 权重评测whisper_mix_normalize.pycompute-wer标注与识别结果须同步规整这条从数据到评测的完整链路正是 Fun-ASR-Nano 落地垂直行业教育、金融、方言口音等的核心路径数据量少时用 LoRA 或冻结编码器微调控制过拟合数据量充足时逐步解锁更多参数甚至全量微调最终通过统一评测口径确认收益再以标准 AutoModel 接口或流式/vLLM 服务完成部署。【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →