FunASR 集成 SenseVoice 完全指南:多语言语音识别、情感识别与事件检测的推理、部署与微调实战

发布时间:2026/9/13 20:38:08
FunASR 集成 SenseVoice 完全指南:多语言语音识别、情感识别与事件检测的推理、部署与微调实战 FunASR 集成 SenseVoice 完全指南多语言语音识别、情感识别与事件检测的推理、部署与微调实战【免费下载链接】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/FunASRSenseVoice 是阿里通义实验室 FunAudioLLM 团队开源的音频基础模型具备多语言语音识别ASR、语种识别LID、语音情感识别SER与声学事件分类/检测AEC/AED四大能力并已深度集成进 FunASR 工具包。本文以 SenseVoice 中文文档 为主体骨架结合 FunASR 仓库 中的模型源码、工具脚本与训练配置完整讲解 SenseVoice 的能力定位、性能表现、推理用法、ONNX/LibTorch 导出部署、数据准备与微调全流程读完即可在 FunASR 中直接运行 SenseVoice 并落地业务场景。一、SenseVoice 是什么一模型四能力的音频基础模型SenseVoice 的核心定位是音频理解audio understanding即用单个模型同时输出四类信息能力说明ASR语音识别支持超过 50 种语言训练数据超过 40 万小时中文与粤语识别效果相比 Whisper 具备明显优势LID语种识别识别音频所属语种推理接口支持zh / en / yue / ja / ko及auto自动判断与nospeech无语音SER情感识别输出HAPPY / SAD / ANGRY / NEUTRAL / FEARFUL / DISGUSTED / SURPRISED七类情感标签AEC/AED事件分类/检测检测音乐BGM、掌声、笑声、哭声、咳嗽、喷嚏、呼吸等常见人机交互事件在 FunASR 仓库中SenseVoice 的官方模型实现位于 funasr/models/sense_voice/model.py其源码结构可以清晰印证上述能力的实现方式非自回归端到端框架模型不采用逐 token 自回归解码而是基于 CTC 输出推理延迟极低。官方文档给出 SenseVoice-Small 在 10 秒音频上推理仅耗时约 70ms 的实测数据。SANM 注意力 FSMN 记忆核心编码层使用MultiHeadedAttentionSANM见 model.py在多头注意力基础上叠加了 FSMN前馈序列记忆网络卷积块fsmn_block即 depthwise 卷积两者输出相加使模型在低延迟的同时保持上下文建模能力编码器主体SenseVoiceEncoderSmall以tables.register(encoder_classes, SenseVoiceEncoderSmall)注册进 FunASR 模型注册表model.py。富文本标签输出模型的输出文本中携带|zh|、|HAPPY|、|Applause|这类特殊 token经 funasr/utils/postprocess_utils.py 中的rich_transcription_postprocess后处理会转换为易读的富文本结果如将情感/事件 token 映射为对应 emoji。二、性能评测多语言识别、情感识别、事件检测与推理效率本节数据均来自官方文档 SenseVoice README_zh 的公开评测描述具体测试集与结果图表请查阅原文档。2.1 多语言语音识别官方在 AISHELL-1、AISHELL-2、Wenetspeech、Librispeech、Common Voice 等开源基准数据集上对比了 SenseVoice 与 Whisper 的识别效果与推理效率结论是在中文和粤语识别效果上SenseVoice-Small 具有明显的效果优势。2.2 情感识别SER由于情感识别领域缺乏被广泛统一的评测指标官方在多个测试集、多种指标上与近年来的 Benchmark 结果进行全面对比测试集同时覆盖中/英两种语言以及表演、影视剧、自然对话等多种风格。结论是在不进行目标数据微调的前提下SenseVoice 能够达到并超过目前最佳情感识别模型的效果其中 SenseVoice-Large 在几乎所有数据集上达到最佳SenseVoice-Small 也能在多数数据集上超越其他开源情感识别模型。2.3 事件检测AED尽管 SenseVoice 只在语音数据上训练它仍可直接作为事件检测模型使用。官方在环境音分类数据集 ESC-50 上与业界广泛使用的 BEATS、PANN 模型对比SenseVoice 能取得较好效果但官方同时诚实指出受限于训练数据与训练方式其事件分类效果与专业事件检测模型相比仍有一定差距——这一点在业务选型时值得注意。2.4 推理效率SenseVoice-Small 参数量与 Whisper-Small 相当但推理速度快约5 倍比 Whisper-Large 快约15 倍在音频时长增加的情况下推理耗时无明显增加得益于非自回归架构与动态 batch官方文档给出10s 音频推理仅耗时约 70ms。三、环境安装SenseVoice 已作为模型集成进 FunASR推荐通过 FunASR 使用。官方文档给出的依赖安装方式为pip install -r requirements.txt在 FunASR 仓库内SenseVoice 示例目录为 examples/industrial_data_pretraining/sense_voice/其中提供了可直接运行的推理脚本 demo.py、demo_onnx.py、demo_libtorch.py 与说话人相关演示 demo_spk.py。若使用 GPU 推理需要安装对应版本的 PyTorch 与 CUDA 环境模型权重默认通过 ModelScope 的iic/SenseVoiceSmall自动下载。四、推理用法4.1 使用 FunASR 的 AutoModel 推理推荐支持任意格式音频输入支持任意时长输入配合 VAD 切分长音频from funasr import AutoModel from funasr.utils.postprocess_utils import rich_transcription_postprocess model_dir iic/SenseVoiceSmall model AutoModel( modelmodel_dir, trust_remote_codeTrue, remote_code./model.py, vad_modelfsmn-vad, vad_kwargs{max_single_segment_time: 30000}, devicecuda:0, ) # en res model.generate( inputf{model.model_path}/example/en.mp3, cache{}, languageauto, # zh, en, yue, ja, ko, nospeech use_itnTrue, batch_size_s60, merge_vadTrue, merge_length_s15, ) text rich_transcription_postprocess(res[0][text]) print(text)参数说明参数含义与取值范围model_dir模型名称如iic/SenseVoiceSmall或本地磁盘中的模型路径trust_remote_codeTrue时模型代码实现从remote_code指定的位置加载支持绝对/相对路径与网络 URL如当前目录下的model.pyFalse时加载 FunASR 内部集成版本修改本地model.py不生效内部实现位于 funasr/models/sense_voice/model.pyvad_model开启 VAD 将长音频切割成短音频开启后推理耗时为 VAD SenseVoice 总链路耗时若需单独测试 SenseVoice 耗时请关闭 VADvad_kwargsVAD 模型配置其中max_single_segment_time表示 VAD 最大切割音频时长单位毫秒msuse_itn输出结果中是否包含标点与逆文本正则化ITNbatch_size_s动态 batch 中总音频时长单位秒smerge_vad是否将 VAD 切割的短音频碎片合并合并后长度为merge_length_s秒ban_emo_unk是否禁用emo_unk标签禁用后所有句子都会被赋予情感标签默认False提示demo.py中同时演示了output_timestampTrue输出时间戳、以及中/英/粤/日/韩五种语言的推理调用可直接参考 examples/industrial_data_pretraining/sense_voice/demo.py。4.2 短音频批量推理移除 VAD 加速如果输入均为短音频小于 30s且需要批量化推理为加快效率可以移除 VAD 模型改用静态batch_sizemodel AutoModel(modelmodel_dir, trust_remote_codeTrue, devicecuda:0) res model.generate( inputf{model.model_path}/example/en.mp3, cache{}, languageauto, # zh, en, yue, ja, ko, nospeech use_itnTrue, batch_size64, )4.3 直接调用 SenseVoiceSmall 推理不经过 AutoModel 封装直接加载模型类推理。支持任意格式音频输入但输入音频时长限制在 30s 以下from model import SenseVoiceSmall from funasr.utils.postprocess_utils import rich_transcription_postprocess model_dir iic/SenseVoiceSmall m, kwargs SenseVoiceSmall.from_pretrained(modelmodel_dir, devicecuda:0) m.eval() res m.inference( data_inf{kwargs[model_path]}/example/en.mp3, languageauto, # zh, en, yue, ja, ko, nospeech use_itnFalse, ban_emo_unkFalse, **kwargs, ) text rich_transcription_postprocess(res[0][0][text]) print(text)SenseVoiceSmall类的from_pretrained与inference方法定义于 funasr/models/sense_voice/model.py其前向输出会拼接语种、情感、事件与文本标签因此必须配合rich_transcription_postprocess做富文本后处理。4.4 富文本后处理原理rich_transcription_postprocess位于 funasr/utils/postprocess_utils.py其处理逻辑为将|nospeech||Event_UNK|统一替换为❓将|zh|、|en|、|yue|、|ja|、|ko|、|nospeech|等语种标签替换为|lang|作为分段标记对每段调用format_str_v2根据emo_dict7 种情感标签映射与event_dict8 种事件标签映射把 token 转成 emoji 并拼接在句首/句尾合并相邻段落、去重连续相同的事件/情感 emoji最终得到如 感谢大家 这样的富文本。这也意味着模型原始输出是带|...|特殊标签的文本必须经过该后处理才能得到用户可读的结果。五、服务部署ONNX / LibTorch 导出与 FastAPI 上线SenseVoice 具备完整的服务部署链路支持多并发请求客户端语言覆盖 Python、C、HTML、Java、C# 等仓库对应实现见 runtime/ 目录。5.1 ONNX 导出与推理# pip3 install -U funasr funasr-onnx from pathlib import Path from funasr_onnx import SenseVoiceSmall from funasr_onnx.utils.postprocess_utils import rich_transcription_postprocess model_dir iic/SenseVoiceSmall model SenseVoiceSmall(model_dir, batch_size10, quantizeTrue) # inference wav_or_scp [{}/.cache/modelscope/hub/{}/example/en.mp3.format(Path.home(), model_dir)] res model(wav_or_scp, languageauto, use_itnTrue) print([rich_transcription_postprocess(i) for i in res])备注ONNX 模型导出到原模型目录中。5.2 LibTorch 导出与推理from pathlib import Path from funasr_torch import SenseVoiceSmall from funasr_torch.utils.postprocess_utils import rich_transcription_postprocess model_dir iic/SenseVoiceSmall model SenseVoiceSmall(model_dir, batch_size10, devicecuda:0) wav_or_scp [{}/.cache/modelscope/hub/{}/example/en.mp3.format(Path.home(), model_dir)] res model(wav_or_scp, languageauto, use_itnTrue) print([rich_transcription_postprocess(i) for i in res])备注LibTorch 模型导出到原模型目录中。在 FunASR 内还可直接使用 export.py 一键导出 ONNX 模型from funasr import AutoModel model_dir iic/SenseVoiceSmall model AutoModel(modelmodel_dir, devicecuda:0) res model.export(typeonnx, quantizeFalse)5.3 使用 FastAPI 部署export SENSEVOICE_DEVICEcuda:0 fastapi run --port 50000通过环境变量SENSEVOICE_DEVICE指定推理设备如cuda:0fastapi run启动服务并监听指定端口。六、微调定制解决长尾样本与业务域问题SenseVoice 提供便捷的微调脚本与策略方便用户根据业务场景修复长尾样本问题。官方同时强调微调尤其是持续微调必须把保持旧语种能力作为独立的评测约束任何微调方案都不能保证零退化。6.1 安装训练环境git clone https://github.com/modelscope/FunASR.git cd FunASR pip3 install -e ./6.2 数据准备JSONL 格式微调数据为 JSONL每行一条 JSON需要包含以下字段{key: YOU0000008470_S0000238_punc_itn, text_language: |en|, emo_target: |NEUTRAL|, event_target: |Speech|, with_or_wo_itn: |withitn|, target: Including legal due diligence, subscription agreement, negotiation., source: /cpfs01/shared/Group-speech/beinian.lzr/data/industrial_data/english_all/audio/YOU0000008470_S0000238.wav, target_len: 7, source_len: 140} {key: AUD0000001556_S0007580, text_language: |en|, emo_target: |NEUTRAL|, event_target: |Speech|, with_or_wo_itn: |woitn|, target: there is a tendency to identify the self or take interest in what one has got used to, source: /cpfs01/shared/Group-speech/beinian.lzr/data/industrial_data/english_all/audio/AUD0000001556_S0007580.wav, target_len: 18, source_len: 360}各字段含义字段含义key数据唯一 IDsource音频文件的路径source_len音频文件的 fbank 帧数target音频文件标注文本target_len音频文件标注文本长度text_language音频文件的语种标签|zh|、|en|、|yue|、|ja|、|ko|emo_target音频文件的情感标签|HAPPY|、|SAD|、|ANGRY|、|NEUTRAL|、|FEARFUL|、|DISGUSTED|、|SURPRISED|event_target音频文件的事件标签|BGM|、|Speech|、|Applause|、|Laughter|、|Cry|、|Sneeze|、|Breath|、|Cough|with_or_wo_itn标注文本中是否包含标点与逆文本正则化|withitn|/|woitn|6.3 使用 sensevoice2jsonl 生成训练数据可以用sensevoice2jsonl指令从train_wav.scp、train_text.txt、train_text_language.txt、train_emo.txt和train_event.txt生成 JSONL。仓库 data/list/ 目录已提供对应的示例文件train_wav.scp、train_text.txt、train_text_language.txt、train_emo.txt、train_event.txt、train.jsonl、val.jsonl等。train_text.txt左边为数据唯一 ID需与train_wav.scp中的 ID 一一对应右边为标注文本BAC009S0764W0121 甚至出现交易几乎停滞的情况 BAC009S0916W0489 湖北一公司以员工名义贷款数十员工负债千万 asr_example_cn_en 所有只要处理 data 不管你是做 machine learning 做 deep learning 做 data analytics 做 data science 也好 scientist 也好通通都要都做的基本功啊那 again 先先对有一些 也许对 ID0012W0014 he tried to think how it could betrain_wav.scp左边为数据唯一 ID右边为音频文件路径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.wav asr_example_cn_en https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_cn_en.wav ID0012W0014 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_en.wavtrain_text_language.txt左边为数据唯一 ID右边为语种标签支持|zh|、|en|、|yue|、|ja|、|ko|BAC009S0764W0121 |zh| BAC009S0916W0489 |zh| asr_example_cn_en |zh| ID0012W0014 |en|train_emo.txt左边为数据唯一 ID右边为情感标签支持|HAPPY|、|SAD|、|ANGRY|、|NEUTRAL|、|FEARFUL|、|DISGUSTED|、|SURPRISED|BAC009S0764W0121 |NEUTRAL| BAC009S0916W0489 |NEUTRAL| asr_example_cn_en |NEUTRAL| ID0012W0014 |NEUTRAL|train_event.txt左边为数据唯一 ID右边为事件标签支持|BGM|、|Speech|、|Applause|、|Laughter|、|Cry|、|Sneeze|、|Breath|、|Cough|BAC009S0764W0121 |Speech| BAC009S0916W0489 |Speech| asr_example_cn_en |Speech| ID0012W0014 |Speech|生成指令完整标注含语种/情感/事件# generate train.jsonl and val.jsonl from wav.scp, text.txt, text_language.txt, emo_target.txt, event_target.txt sensevoice2jsonl \ scp_file_list[../../../data/list/train_wav.scp, ../../../data/list/train_text.txt, ../../../data/list/train_text_language.txt, ../../../data/list/train_emo.txt, ../../../data/list/train_event.txt] \ data_type_list[source, target, text_language, emo_target, event_target] \ jsonl_file_out../../../data/list/train.jsonl上述命令中的../../../data/list/路径为从 SenseVoice 示例目录 examples/industrial_data_pretraining/sense_voice/ 出发的相对路径对应仓库根目录下的 data/list/。生成指令仅有文本标注若没有train_text_language.txt、train_emo.txt和train_event.txt工具会自动调用 SenseVoice 模型对语种、情感和事件打标# generate train.jsonl and val.jsonl from wav.scp and text.txt sensevoice2jsonl \ scp_file_list[../../../data/list/train_wav.scp, ../../../data/list/train_text.txt] \ data_type_list[source, target] \ jsonl_file_out../../../data/list/train.jsonl \ model_diriic/SenseVoiceSmallsensevoice2jsonl的实现位于 funasr/datasets/audio_datasets/sensevoice2jsonl.py同时支持通过python -m funasr.datasets.audio_datasets.sensevoice2jsonl方式调用。6.4 启动训练官方提供了开箱即用的训练脚本 finetune.sh。注意修改finetune.sh中train_tool为本地安装的 FunASR 路径下funasr/bin/train_ds.py的绝对路径然后执行bash finetune.sh脚本核心配置解读以仓库内 finetune.sh 实际内容为准配置项默认值说明CUDA_VISIBLE_DEVICES0,1指定训练 GPU脚本自动按逗号数量计算nproc_per_nodemodel_name_or_model_diriic/SenseVoiceSmall模型来源支持 ModelScope 自动下载或本地路径train_data/val_datadata/train_example.jsonl/data/val_example.jsonl训练/验证 JSONL 路径需自行准备output_dir./outputs训练输出目录日志写入log.txtdeepspeed_configexamples/deepspeed_conf/ds_stage1.jsonDeepSpeed 配置文件仓库内位于 examples/deepspeed_conf/ds_stage1.jsondataset_conf.batch_typetoken/batch_size6000—按 token 动态组 batch目标 batch 为 6000 tokendataset_conf.sort_size1024—排序窗口大小dataset_conf.num_workers4—DataLoader 工作进程数train_conf.max_epoch5050最大训练轮数train_conf.validate_interval2000/save_checkpoint_interval20002000验证/保存 checkpoint 的 step 间隔train_conf.keep_nbest_models20/avg_nbest_model1020 / 10保留的 best 模型数量与最终平均的模型数量train_conf.avg_keep_nbest_models_typelossloss按验证 loss 选取用于平均的 checkpointtrain_conf.use_deepspeedfalsefalse是否启用 DeepSpeed配置文件仍会传入optim_conf.lr0.00020.0002初始学习率脚本内部使用torchrun启动分布式训练并透传WORLD_SIZE、RANK、MASTER_ADDR、MASTER_PORT等环境变量默认单机多卡--nnodes 1、--master_addr 127.0.0.1、--master_port 26669即可运行。6.5 持续微调新增口音、语种与业务域需要增加新口音、语种或业务域并保持已有能力时请参考 持续微调指南。该指南的核心要点包括先锁定验证集为每个需要保留的语种建立固定验证集并与训练/replay 数据说话人不重叠计算相对退化 候选模型 CER − 基线 CER/ 基线 CER候选 checkpoint 必须同时满足所有旧语种退化阈值与新域目标构建 replay 清单无人工标注时可使用原模型对旧域音频生成伪标签保存模型版本与原始解码输出训练前过滤空文本、重复文本、截断文本、语种不匹配样本并按固定预算按 epoch 采样可参考1:1 / 2:1 / 3:1的 replay:new 配比矩阵分两阶段训练阶段一冻结 encoder 只训练语言查询 embedding 与 CTC/output 参数freeze_paramencoder、lr0.00002、max_epoch5若新域 CER 停滞而旧语种保持达标再从阶段一最佳 checkpoint 继续仅放开 encoder 后部层freeze_paramencoder.encoders0,encoder.encoders.0,encoder.encoders.1,encoder.encoders.2并确认日志出现Setting encoder...requires_grad False按约束选择 checkpointSenseVoice 返回 ASR CTC loss 与 rich-tag 目标及acc_rich注意acc_rich不是 CER 或 ASR 准确率排名指标缺失或非有限值时训练器会告警并排除该点LoRA 现状FunASR 已有面向部分 Paraformer/SANM 路径的 LoRA 支持但 SenseVoiceSmall 目前没有完整且文档化的 LoRA 配方不要假设设置lora_only会自动生成可训练的 adapter。七、WebUI 体验SenseVoice 示例目录支持启动本地 WebUI 进行交互式体验音频上传、参数调节、结果展示python webui.py启动后通过浏览器访问本地服务即可。八、生态中的优秀三方工作选型参考围绕 SenseVoice 社区已有若干值得关注的部署与推理方案官方文档列举如下均可在各自项目主页了解详情TritonGPU部署最佳实践triton TensorRT 方案官方文档提到 fp32 测试下在 V100 GPU 上加速比达 526fp16 支持中仓库内实现与说明见 runtime/triton_gpu/README.mdsherpa-onnx 部署支持在 C、C、Python、C#、Go、Swift、Kotlin、Java、JavaScript、Dart 等 10 种编程语言中使用 SenseVoice并可运行于 iOS、Android、Raspberry Pi 等平台SenseVoice.cpp基于 GGML 的纯 C/C 推理实现支持 3/4/5/8 位量化无需第三方依赖流式 SenseVoice通过分块chunk推理实现伪流式处理采用截断注意力truncated attention牺牲部分精度并支持 CTC 前缀束搜索CTC prefix beam search与热词增强OmniSenseVoice轻量化推理库支持 batch 推理。九、总结与实践建议SenseVoice 通过一模型四能力的富文本输出设计将多语言 ASR、语种识别、情感识别与事件检测整合到一次前向推理中配合 FunASR 的非自回归框架、VAD 长音频切分、动态 batch 与 ONNX/LibTorch 导出链路可快速落地到客服质检、内容审核、会议转写、人机交互等场景。实践中的关键要点长音频走 VAD 链路vad_modelfsmn-vadbatch_size_smerge_vad短音频批量走静态batch_size兼顾效果与吞吐富文本输出必须经过rich_transcription_postprocess否则会看到原始|...|标签部署优先 ONNX/LibTorch以获得跨语言 SDK 支持模型导出在本地模型目录完成微调前先锁定旧语种验证集与退化阈值严格遵循 持续微调指南 的两阶段训练与 checkpoint 筛选流程事件检测能力与专业 AED 模型仍有差距需结合业务场景评估是否单独引入事件检测模型。进一步可阅读 FunASR 官方教程docs/tutorial/README_zh.md与模型注册说明docs/model_registration_zh.md深入了解 AutoModel 的加载机制与自定义模型接入方式。【免费下载链接】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),仅供参考