拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Fun-ASR-Nano 工业级语音识别实战指南:模型架构、推理、微调与评测全流程解析

Fun-ASR-Nano 工业级语音识别实战指南模型架构、推理、微调与评测全流程解析【免费下载链接】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/FunASRFun-ASR-Nano 是通义实验室推出的端到端语音识别大模型基于数千万小时真实语音数据训练在远场高噪声、中文方言/地域口音、多语言混合等工业场景中表现出色。本指南以 examples/industrial_data_pretraining/fun_asr_nano/README.md 为骨架结合仓库内 model.py、finetune.sh、lora_finetune.sh、decode.py 等源码带你完整掌握 Fun-ASR-Nano 的架构原理、推理调用、ChatML 数据准备、全量/部分/LoRA 微调以及 WER 评测全链路读完即可在自有领域数据上落地部署。Fun-ASR 整体架构音频编码器Audio Encoder、音频适配器Audio Adaptor、CTC 解码器CTC Decoder与 LLMQwen3-0.6B协同完成语音转写并支持热词上下文注入。一、模型定位与核心能力Fun-ASR 是端到端语音识别大模型由通义实验室发布训练数据规模达数千万小时真实语音具备强大的上下文理解能力与行业适应性。它区别于传统 ASR 工具包的关键点在于以 LLM 为核心解码器天然具备听得清、懂其意、写得准的语义级转写能力能有效应对幻觉生成和语种混淆等挑战在教育、金融等垂直领域可准确识别专业术语与行业表达。仓库内提供两个 checkpoint参数规模均为 8 亿0.8B模型任务范围训练数据参数量Fun-ASR-Nano-2512支持中文、英文、日文中文含 7 种方言吴语、粤语、闽语、客家话、赣语、湘语、晋语及 26 种地域口音河南、陕西、湖北、四川、重庆、云南、贵州、广东、广西等 20 多个地区英文、日文涵盖多种地域口音额外支持歌词识别与说唱语音识别数千万小时800MFun-ASR-MLT-Nano-2512支持中文、英文、粤语、日文、韩文、越南语、印尼语、泰语、马来语、菲律宾语、阿拉伯语、印地语、保加利亚语、克罗地亚语、捷克语、丹麦语、荷兰语、爱沙尼亚语、芬兰语、希腊语、匈牙利语、爱尔兰语、拉脱维亚语、立陶宛语、马耳他语、波兰语、葡萄牙语、罗马尼亚语、斯洛伐克语、斯洛文尼亚语、瑞典语共 31 种语言数十万小时800M核心特性包括四个方面远场高噪声识别针对远距离拾音及高噪声场景如会议室、车载环境、工业现场等深度优化README 中给出的识别准确率提升至 93%。中文方言与地方口音支持 7 大方言与 26 个地区口音覆盖河南、陕西、湖北、四川、重庆、云南、贵州、广东、广西、河北、天津、山东、安徽、南京、江苏、杭州、甘肃、宁夏等地区。多语言自由说独立的 MLT-Nano checkpoint 支持 31 种语言识别重点优化东亚与东南亚语种支持语种自由切换和混合识别。音乐背景歌词识别强化音乐背景干扰下的语音识别性能支持对歌曲中歌词内容的精准识别。说明如果只需要 Fun-ASR-Nano 的原生转写能力可以走 Transformers 5.17.0 原生推理路径或中文版 transformers_native_zh.md它加载独立的-hfcheckpoint不依赖 FunASR 工具库。而本文与示例目录聚焦funasr.AutoModel工具库路径两者的依赖、参数与输出契约不可混用。二、模型架构从源码看 FunASRNano 的组成示例目录中的 model.py 通过tables.register(model_classes, FunASRNano)注册了FunASRNano类其构造函数清晰地展示了四段式架构model.py 第 33-173 行1. 音频编码器audio_encoder支持两种来源hubms时通过funasr.AutoModel从 ModelScope 加载预训练编码器否则从tables.encoder_classes注册表中按名称实例化。输入为 80 维 fbank 特征input_size: int 80。默认freezeTrue冻结编码器参数并置为eval()模式第 68-74 行这是微调时的关键开关。2. LLM 解码器llm通过transformers.AutoModelForCausalLM从init_param_path加载因果语言模型即 Qwen3-0.6B支持load_kwargs透传、activation_checkpoint梯度检查点第 77-96 行。支持llm_dtypebf16/fp16/fp32精度控制映射关系见文件顶部的dtype_map。3. 音频适配器audio_adaptor从tables.adaptor_classes注册表实例化自动将编码器输出维度encoder_dim与 LLM 嵌入维度llm_dim对齐是语音特征 → LLM 词向量空间的桥梁。支持use_low_frame_rate低帧率模式第 112 行在前向中按(olens - 1) // 2 1压缩帧数降低 LLM 计算量。4. CTC 解码器ctc_decoder ctc可选组件当配置了ctc_decoder时额外构建 CTC 解码头与 CTC 损失ctc_weight默认 0.3blank_id默认ctc_vocab_size - 1。CTC 分支负责流式对齐与字符级时间戳生成——这正是文档中TODO 支持返回时间戳已勾选功能的实现基础model.py 第 644-750 行CTC logits 经unique_consecutive去重、去掉 blank 后解码出ctc_text再由forced_align对齐得到ctc_timestamps与timestamps时间戳按* 6 * 10 / 1000换算为毫秒。前向流程forward第 180-289 行将音频编码器输出的语音 token 通过fbank_beg/fake_token_len定位替换进 LLM 的inputs_embeds中对应的占位位置与文本 prompt 拼接后交给 LLM 生成loss 与 token 级 accuracycompute_accuracy同时统计并输出dialog_turns等多轮对话统计信息。三、环境安装git clone https://github.com/QwenAudio/Fun-ASR.git cd Fun-ASR pip install -r requirements.txt示例目录自带的 requirements.txt 给出了最小依赖集torch2.0 funasr websockets12.0 regex numpy soundfile其中websockets用于实时 WebSocket 服务场景soundfile用于音频读取麦克风输入等可选功能需要额外安装sounddevice与librosa文件中已注释标注。四、推理两种调用方式4.1 使用 funasr.AutoModel 推理这是最推荐的入口与 FunASR 生态VAD、热词、批处理完全打通from funasr import AutoModel def main(): model_dir FunAudioLLM/Fun-ASR-Nano-2512 model AutoModel( modelmodel_dir, trust_remote_codeTrue, remote_code./model.py, devicecuda:0, # hub从 msModelScope或 hfHugging Face下载模型。 hubhf ) wav_path f{model.model_path}/example/zh.mp3 res model.generate( input[wav_path], cache{}, batch_size1, hotwords[开放时间], # 中文、英文、日文 for Fun-ASR-Nano-2512 # 中文、英文、粤语、日文、韩文、越南语、印尼语、泰语、马来语、菲律宾语、阿拉伯语、 # 印地语、保加利亚语、克罗地亚语、捷克语、丹麦语、荷兰语、爱沙尼亚语、芬兰语、希腊语、 # 匈牙利语、爱尔兰语、拉脱维亚语、立陶宛语、马耳他语、波兰语、葡萄牙语、罗马尼亚语、 # 斯洛伐克语、斯洛文尼亚语、瑞典语 for Fun-ASR-MLT-Nano-2512 language中文, itnTrue, # or False ) text res[0][text] print(text) # 长音频场景叠加 VAD 分句 model AutoModel( modelmodel_dir, trust_remote_codeTrue, vad_modelfsmn-vad, vad_kwargs{max_single_segment_time: 30000}, remote_code./model.py, devicecuda:0, ) res model.generate(input[wav_path], cache{}, batch_size1) text res[0][text] print(text) if __name__ __main__: main()关键参数说明README 参数表 源码印证model_dir模型名称或本地磁盘中的模型路径。trust_remote_code是否信任远程代码用于加载自定义模型实现FunASRNano类即通过远程代码注册。remote_code指定模型具体代码的位置例如示例目录下的model.py支持绝对路径与相对路径。device指定使用的设备如cuda:0或cpu。language转写语种Nano 为中文/英文/日文MLT-Nano 覆盖 31 种语言。itn是否启用逆文本规整Inverse Text Normalization把数字、标点等规整为可读文本。hotwords热词偏置列表README 示例中使用[开放时间]热词在源码中通过get_prompt拼入 prompt 的上下文信息段落model.py 第 569-582 行引导模型在歧义处优先输出热词。vad_model/vad_kwargs叠加 FSMN-VAD 做语音活动检测max_single_segment_time30000表示单段最大 30 秒长音频会自动切句。4.2 直接推理绕过 AutoModel 封装如果已经持有本地 checkpoint可以跳过AutoModel的 generate 层直接调用模型类from model import FunASRNano def main(): model_dir FunAudioLLM/Fun-ASR-Nano-2512 m, kwargs FunASRNano.from_pretrained(modelmodel_dir, devicecuda:0) m.eval() wav_path f{kwargs[model_path]}/example/zh.mp3 res m.inference(data_in[wav_path], **kwargs) text res[0][0][text] print(text) if __name__ __main__: main()从源码看FunASRNano.from_pretrained内部仍是调用AutoModel.build_modelmodel.py 第 759-765 行而inference会依次执行get_prompt构造带热词/语种/ITN 指令的 prompt →generate_chatml将音频包进|startofspeech|!|endofspeech|特殊 token →inference_prepare完成 fbank 提取、编码器前向与 LLM embedding 拼接 →inference_llm调用self.llm.generate解码默认max_new_tokens512。4.3 字符级时间戳的前提条件README 明确给出一个重要的使用前提字符级时间戳要求 checkpoint 同时包含完整的ctc_decoder.*和ctc.*权重。当前Fun-ASR-MLT-Nano-2512checkpoint 未包含这些权重因此 FunASR 会记录警告并仅返回文本不再使用未初始化的层生成timestamps或ctc_timestamps。这一行为在源码中有 fail-closed 保护on_pretrained_model_loaded钩子通过disable_incomplete_ctc来自 funasr/models/fun_asr_nano/checkpoint_utils.py检查 checkpoint 中 CTC 权重是否完整不完整则禁用 CTC 分支对应的测试 tests/test_fun_asr_nano_missing_ctc_weights.py 覆盖了权重缺失时禁用时间戳“权重完整时保留时间戳”“权重不完整/形状不匹配时禁用”等多个分支如test_native_model_disables_timestamps_when_ctc_weights_are_missing、test_vllm_model_disables_timestamps_when_ctc_weight_shape_mismatches。因此若要获得时间戳能力应选择包含完整 CTC 权重的 checkpoint。五、微调从数据准备到训练启动微调部分的完整说明见示例目录内的 docs/finetune_zh.md英文版 docs/finetune.md。训练环境要求funasr1.3.26pip install funasr1.3.265.1 数据准备ChatML 格式Fun-ASR-Nano 微调使用 ChatML 对话格式每条样本是一个 JSON 对象。先看示例数据 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 }字段规范README scp2jsonl.py 源码双重印证system.content固定为You are a helpful assistant.。user.content包含 prompt 与音频路径音频位于|startofspeech|!与|endofspeech|之间默认 prompt 为语音转写/Speech transcription:可按语种改写为语音转写成英文/Transcribe speech into Chinese:当文本标注不含阿拉伯数字或标点时可改用语音转写不进行文本规整/Speech transcription without text normalization:。assistant.content为音频对应的文本标注转写目标。speech_length音频的 fbank 帧数一帧 10ms。text_length标注文本的 token 数使用Qwen/Qwen3-0.6B编码。5.2 用 scp2jsonl.py 批量转换仓库提供了 tools/scp2jsonl.py可将常见的 wav scp 转写文本格式批量转成 ChatML JSONL。源文件格式为ID 路径/文本ID 需一一对应train_wav.scpBAC009S0764W0121 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.txtBAC009S0764W0121 甚至出现交易几乎停滞的情况 BAC009S0916W0489 湖北一公司以员工名义贷款数十员工负债千万执行转换python tools/scp2jsonl.py \ scp_filedata/train_wav.scp \ transcript_filedata/train_text.txt \ jsonl_filedata/train_example.jsonl从源码看该工具内部用Qwen/Qwen3-0.6B的 tokenizer 计算text_length用soundfile读取音频时长计算speech_lengthint((duration * 1000 - 25) // 10 1)支持本地路径与 http(s) 远程 URL并通过ThreadPoolExecutor多线程并行处理自动校验 scp 与文本的 ID 一致性UTT mismatch会报错。5.3 启动训练finetune.sh示例 data/ 目录已提供训练/验证样本train_example.jsonl、val_example.jsonl、train_wav.scp、val_wav.scp等。直接执行bash finetune.shfinetune.sh 的核心逻辑通过CUDA_VISIBLE_DEVICES指定 GPU支持多卡gpu_num自动计算。训练工具为funasr-train-dsDeepSpeed 版 trainer配合torchrun分布式启动WORLD_SIZE/RANK/MASTER_ADDR/MASTER_PORT均有默认值默认单机、端口 26669。关键训练参数命令行覆盖式传参参数示例值说明modelFunAudioLLM/Fun-ASR-Nano-2512模型名或本地目录train_data_set_list/valid_data_set_listdata/train_example.jsonl/data/val_example.jsonl训练/验证数据dataset_conf.batch_samplerBatchSampler批采样器dataset_conf.batch_type/batch_sizetoken/6000按 token 数动态组 batchdataset_conf.sort_size1024排序桶大小dataset_conf.num_workers4数据加载进程数train_conf.max_epoch50最大训练轮数train_conf.validate_interval/save_checkpoint_interval2000验证/保存间隔步数train_conf.keep_nbest_models/avg_nbest_model20/10保留/平均最优模型数量train_conf.use_deepspeed/deepspeed_configfalse/deepspeed_conf/ds_stage1.jsonDeepSpeed 开关与 stage1 配置optim_conf.lr0.0002学习率冻结算子finetune 的核心开关脚本默认只微调 LLM——audio_encoder_conf.freezetrue \ audio_adaptor_conf.freezetrue \ llm_conf.freezefalse \将需要微调的模块freeze设为false即可。推荐配置策略README 建议训练数据少于 1000 小时建议微调 audio_adaptor适配器参数量小数据量少时更稳。训练数据少于 5000 小时建议微调 audio_encoder 和 audio_adaptor。训练数据大于 10000 小时建议全量参数微调。冻结语义与源码一一对应在 model.py 构造函数 中freezeTrue会把对应子模块所有参数requires_gradFalse并置为eval()避免梯度回传与 BN/dropout 语义干扰。5.4 LoRA 微调低成本替代方案作为全量/部分微调的替代可以对 Qwen3-0.6B LLM 做 LoRA 微调在其q_proj/v_proj线性层上挂适配器bash lora_finetune.shlora_finetune.sh 的关键参数与语义llm_conf.use_loratrue在 LLM 目标层注入LoRALinear适配器基座权重共享并冻结新增可训练的lora_A/lora_B。lora_onlytrue冻结所有非 LoRA 参数音频编码器、适配器、CTC 解码器只训练适配器checkpoint 仍保存完整 state dict基座权重不变 适配器参数因此用相同的use_loratrue配置即可续训或解码。llm_conf.freezetrue保持 LLM 基座权重冻结与lora_only语义重复但更显式。LoRA 超参数位于llm_conf.lora_conf下模型配置自带默认值r、lora_alpha、lora_dropout、target_modules可在命令行覆盖例如llm_conf.lora_conf.r32脚本内注释给出了与模型内置默认值一致的参考配置r16、lora_alpha32、lora_dropout0.05、target_modules[q_proj, v_proj]。灵活的混合策略如果希望在只对 LLM 做 LoRA 的同时保持音频编码器/适配器可训练对数百小时领域数据是不错的折中可设置lora_onlyfalse、audio_encoder_conf.freezefalse、audio_adaptor_conf.freezefalseLLM 基座权重仍通过llm_conf.freezetrue保持冻结。解码/部署微调后的 checkpoint 可直接用decode.py解码无需合并步骤——前向时在基座输出上叠加适配器输出。若要把适配器折叠进基座权重以得到独立部署的 checkpoint对每个目标模块计算W W (lora_alpha / r) * lora_B lora_A并删除lora_A/lora_B键即可。六、模型评测decode 与 WER 计算微调结束后使用 decode.py 对验证集解码python decode.py \ model_dir/path/to/finetuned \ scp_filedata/val_wav.scp \ output_fileoutput.txt从源码看decode.py自动选择设备CUDA → MPS → CPU加载AutoModel时同样叠加了fsmn-vadmax_single_segment_time30000逐行读取 scp将ID 音频路径解码为ID\t文本写入输出文件。解码后需要对标注和识别结果做文本逆归一化然后计算 WER中文语境下即 CERpython 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.txtwhisper_mix_normalize.py与cn_tn.py、format5res.py等工具位于 tools/ 目录funasr/models/fun_asr_nano/tools/下亦有同名实现负责将中英文混合文本规整到统一形式保证 WER 计算公平。七、性能表现README 报告了 Fun-ASR 在开源基准、行业数据集上的 WER%对比结果数值均引自 README.md复现需在对应测试集上自行评估。开源数据集性能WER %Fun-ASR-nano0.8B在 AIShell11.80、AIShell22.75、Fleurs-zh2.56、Fleurs-en5.96、Librispeech-clean1.76、Librispeech-other4.33、WenetSpeech Meeting6.60、WenetSpeech Net6.01等测试集上与 GLM-ASR-nano、Whisper-large-v3、Seed-ASR、Kimi-Audio、Step-Audio2、FireRed-ASR 等模型横向对比其中 Seed-ASR* 结果为 volcengine 官方 API 评估GLM-ASR-nano* 结果为开源 checkpoint 评估。行业数据集性能WER %覆盖近场、远场、复杂背景、英文通用、开源、方言、口音、歌词、说唱Hiphop九类场景Fun-ASR-nano 平均 WER 16.72其中方言 28.18、口音 12.90、歌词 30.85、说唱 30.87显著低于同量级竞品。各模型在室内近场、远场嘈杂、复杂背景等场景下的识别准确率对比来源于示例目录性能评测章节。八、生态集成vLLM 加速与实时服务内置 vLLM 推理引擎使用AutoModelVLLM可获 2-3 倍解码加速并支持流式 WebSocket 服务与 tensor parallel 多卡并行详见 docs/vllm_guide.md。对应实现位于 funasr/models/fun_asr_nano/inference_vllm.py 与 funasr/auto/auto_model_vllm.py示例脚本见 demo_vllm.py、serve_vllm.py。流式 WebSocket 服务支持实时语音识别 VAD 分句 说话人分离 热词定制快速上手见 docs/realtime_demo.mdcd examples/industrial_data_pretraining/fun_asr_nano pip install -r requirements.txt CUDA_VISIBLE_DEVICES0 python serve_realtime_ws.py --port 10095 --language 中文客户端侧提供 client_python.py、client_test.py 与浏览器端 client_mic.html另有 realtime_ws_benchmark.py 可做服务压测。九、引用若在论文或产品中使用 Fun-ASR可引用技术报告misc{an2025funasrtechnicalreport, title{Fun-ASR Technical Report}, author{Keyu An and Yanni Chen and Zhigao Chen and Chong Deng and Zhihao Du and Changfeng Gao and Zhifu Gao and Bo Gong and Xiangang Li and Yabin Li and Ying Liu and Xiang Lv and Yunjie Ji and Yiheng Jiang and Bin Ma and Haoneng Luo and Chongjia Ni and Zexu Pan and Yiping Peng and Zhendong Peng and Peiyao Wang and Hao Wang and Haoxu Wang and Wen Wang and Wupeng Wang and Yuzhong Wu and Biao Tian and Zhentao Tan and Nan Yang and Bin Yuan and Jieping Ye and Jixing Yu and Qinglin Zhang and Kun Zou and Han Zhao and Shengkui Zhao and Jingren Zhou and Yanqiao Zhu}, year{2025}, eprint{2509.12508}, archivePrefix{arXiv}, primaryClass{cs.CL}, }十、小结Fun-ASR-Nano 以音频编码器 适配器 Qwen3-0.6B LLM 可选 CTC的架构把 LLM 的语义理解能力引入语音识别在方言、口音、远场噪声、歌词等工业场景中具备实用价值。本文覆盖了从模型选型Nano vs MLT-Nano、源码级架构理解、两种推理路径、ChatML 数据构造、scp2jsonl 转换、finetune/lora 微调、WER 评测到 vLLM/WebSocket 部署的完整链路。落地时请牢记三条关键约束时间戳能力依赖完整 CTC 权重、微调数据量决定冻结算子选择1000h 微调适配器 / 5000h 加编码器 / 10000h 全量、LoRA 微调后无需合并即可用decode.py解码。【免费下载链接】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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门