尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

FunASR SenseVoice 工业数据预训练实战:多语言 ASR、情感与事件识别、推理与微调全指南

FunASR SenseVoice 工业数据预训练实战:多语言 ASR、情感与事件识别、推理与微调全指南 FunASR SenseVoice 工业数据预训练实战多语言 ASR、情感与事件识别、推理与微调全指南【免费下载链接】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 是 FunASR 生态中面向工业数据的语音理解基础模型在一套非自回归框架内同时完成多语言语音识别ASR、语种识别LID、语音情感识别SER与音频事件检测AED。本文基于仓库内 SenseVoice 工业数据预训练文档 展开结合 模型源码、数据转换脚本 与 微调脚本完整覆盖模型能力、推理参数、工业数据格式、微调策略与持续微调要点读完即可上手完成一条数据准备 → 微调 → 推理 → 服务化的完整链路。一、SenseVoice 模型能力概览SenseVoice 是一个同时具备多种语音理解能力的语音基础模型包括自动语音识别ASR多语言识别项目文档披露其训练数据规模超过 40 万小时、支持 50 余种语言语种识别LID支持zh、en、yue、ja、ko等语种的自动判定语音情感识别SER输出HAPPY / SAD / ANGRY / NEUTRAL / FEARFUL / DISGUSTED / SURPRISED等情感标签音频事件检测AED检测 BGM、掌声、笑声、哭声、咳嗽、打喷嚏等常见人机交互事件。在工程上SenseVoice-Small 采用非自回归端到端架构推理延迟极低。项目文档给出的对照数据为处理 10 秒音频仅需约 70ms推理速度约为 Whisper-Large 的 15 倍在与 Whisper-Small 参数规模相近的前提下推理快 5 倍以上。此类性能数据为项目官方文档声明具体数值会随硬件与输入条件变化可作为选型参考而非绝对承诺。从源码结构看funasr/models/sense_voice/model.pySenseVoiceSmall是CTC-attention 混合编码器结构语音特征经过 SANM 编码器后前 4 帧输出通过 CTC 分类头计算丰富标签语种/情感/事件的交叉熵损失其余帧输出计算 CTC 损失从而在单次前向中同时产出文本与各类标签。二、环境准备仓库内模型推理依赖 FunASR 工具包安装方式pip install -r requirements.txt若需要本地开发模式微调场景通常使用可编辑安装git clone https://github.com/modelscope/FunASR.git cd FunASR pip3 install -e ./模型权重SenseVoiceSmall托管在 ModelScope 与 HuggingFace 模型库仓库内model_zoo目录维护了对应的模型清单可自行查阅 modelscope_models.md 与 huggingface_models.md。三、推理实战AutoModel 全功能用法SenseVoice 支持任意格式、任意时长的音频输入。最长用的方式是经由 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)3.1 核心参数说明原文档对关键参数给出了权威解释整理如下参数作用与说明model_dir模型名如iic/SenseVoiceSmall或本地模型路径trust_remote_code为True时模型代码实现从remote_code指定的位置加载支持绝对路径、相对路径与网络 URL为False时加载 FunASR 内置版本此时对当前目录model.py的修改不生效。内置模型代码即 funasr/models/sense_voice/model.pyvad_model启用 VAD语音活动检测将长音频切分为短片段此时推理耗时 VAD SenseVoice 总耗时即端到端延迟。若想单独测试 SenseVoice 推理耗时可关闭 VADvad_kwargsVAD 模型配置max_single_segment_time表示 VAD 单段最大切分时长单位毫秒ms示例取 30000language语种控制可选auto自动判定、zh、en、yue、ja、ko、nospeechuse_itn输出结果是否包含标点与逆文本正则化ITNbatch_size_s动态批处理开关表示一个 batch 内音频总时长单位为秒smerge_vad是否合并 VAD 切分出的短片段合并长度为merge_length_s单位秒sban_emo_unk是否禁止输出emo_unk标签3.2 短音频批量推理若所有输入均为 30 秒以内的短音频且需要提升批量推理效率可以去掉 VAD并显式设置batch_sizemodel AutoModel(modelmodel_dir, trust_remote_codeTrue, devicecuda:0) res model.generate( inputf{model.model_path}/example/en.mp3, cache{}, languagezh, # zh, en, yue, ja, ko, nospeech use_itnFalse, batch_size64, )仓库内的 demo.py 展示了更完整的用法分别对 en、zh、yue、ja、ko 五种语种示例音频推理并演示了output_timestampTrue开启时间戳输出的用法。输出原始res可拿到sentence_info等结构化信息配合rich_transcription_postprocess即可得到干净文本。3.3 直接调用模型推理不经过 AutoModel若希望跳过 AutoModel 的封装直接加载模型进行单次前向推理输入时长限制在 30 秒以内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)这里model.py指 SenseVoiceSmall 的远程模型代码from_pretrained的静态方法实现在 funasr/models/sense_voice/model.py 中其内部仍是经由AutoModel.build_model完成构建。inference方法内部会完成音频加载、fbank 特征提取、语言查询向量注入与编码器前向model.py。3.4 富文本后处理从标签序列到可读文本模型原始输出是一段包含|zh|、|NEUTRAL|、|Speech|等特殊标签的 token 序列必须经过rich_transcription_postprocessfunasr/utils/postprocess_utils.py才能转换为可读文本。该函数按emo_dict/event_dict/lang_dict三类映射表工作情感标签映射为 emoji|HAPPY|→ 、|SAD|→ 、|ANGRY|→ 等|NEUTRAL|为空事件标签映射为事件符号|BGM|→ 、|Applause|→ 、|Laughter|→ 等|Speech|为空语种标签统一替换为|lang|分隔符再对切分后的片段做去重与拼接若首 token 为|nospeech||Event_UNK|统一替换为 ❓。这些映射表postprocess_utils.py正是理解富转录Rich Transcription输出格式的关键文本、情感、事件三类信息被压缩进同一条 token 流再于后处理阶段还原。3.5 说话人分离SenseVoice 说话人模型仓库额外提供了 demo_spk.py演示将 SenseVoice 与 VAD、说话人模型cam串联为每句话输出说话人标签model AutoModel( modelmodel_dir, vad_modelfsmn-vad, vad_kwargs{max_single_segment_time: 30000}, spk_modelcam, devicedevice, ) res model.generate( inputwav_path, cache{}, languageauto, use_itnTrue, batch_size_s60, merge_vadTrue, merge_length_s15, ) for sent in res[0][sentence_info]: sent_text rich_transcription_postprocess(sent[text]) print(f Speaker {sent[spk]}: [{sent[start]}ms - {sent[end]}ms] {sent_text})res[0][sentence_info]中的spk、start、end字段可组合出带时间轴和说话人归属的分句结果。四、模型导出ONNX 与 LibTorchSenseVoice 支持导出为 ONNX 与 LibTorch 格式用于生产部署。仓库内 export.py 演示了通过AutoModel.export(typeonnx, quantizeFalse)导出demo_onnx.py 与 demo_libtorch.py 则演示了使用独立推理运行时的加载方式。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])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])注意ONNX / LibTorch 模型默认导出到原始模型目录。导出图的输入输出定义可参考 funasr/models/sense_voice/export_meta.py输入为speech、speech_lengths、language、textnorm四个张量输出为ctc_logits与encoder_out_lens导出时会将语言查询与文本规范化查询作为额外 token 拼接到语音特征之前。五、服务化部署仓库内 SenseVoice 目录提供基于 FastAPI 的服务化部署方式export SENSEVOICE_DEVICEcuda:0 fastapi run --port 50000启动后服务即支持多并发请求。FunASR 的完整服务端方案含 Python / C / HTML / Java / C# 等多种客户端见 runtime 目录Triton TensorRT 的 GPU 部署最佳实践见 runtime/triton_gpu/README.md该方案还提供了 FP16 支持规划。此外仓库的第三方生态中还包含 sherpa-onnx支持 C、C、Python、C#、Go、Swift、Kotlin、Java、JavaScript、Dart 十种语言及 iOS / Android / 树莓派部署、基于 GGML 的 SenseVoice.cpp支持 3/4/5/8 bit 量化以及面向流式推理与热词增强的 streaming 方案可按部署形态选用相关内容以各第三方项目自身文档为准。六、工业数据微调FinetuneSenseVoice 提供便捷的微调脚本与策略用于针对业务场景解决长尾样本问题。完整流程位于 examples/industrial_data_pretraining/sense_voice 目录核心为 finetune.sh。6.1 数据准备JSONL 格式训练数据为 JSONL 格式每行一条样本字段含义如下{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音频语种标签emo_target音频情感标签event_target音频事件标签with_or_wo_itn是否包含标点与逆文本正则化|withitn|/|woitn|。仓库 data/list/train.jsonl 提供了可直接参考的最小示例4 条中文/中英混说样本。6.2 中间清单格式除 JSONL 外数据准备还需要维护若干以空格分隔的清单文件train_text.txt转写文本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音频路径支持本地路径与 URLBAC009S0764W0121 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语种标签可取|zh|、|en|、|yue|、|ja|、|ko|。train_emo.txt情感标签可取|HAPPY|、|SAD|、|ANGRY|、|NEUTRAL|、|FEARFUL|、|DISGUSTED|、|SURPRISED|。train_event.txt事件标签可取|BGM|、|Speech|、|Applause|、|Laughter|、|Cry|、|Sneeze|、|Breath|、|Cough|。仓库 data/list 目录下的train_text.txt、train_wav.scp、train_text_language.txt、train_emo.txt、train_event.txt即上述格式的配套示例。6.3 生成 JSONLsensevoice2jsonl由wav.scp / text.txt / text_language.txt / emo_target.txt / event_target.txt生成train.jsonl与val.jsonlsensevoice2jsonl \ 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若缺少train_text_language.txt、train_emo_target.txt、train_event_target.txt工具会自动调用 SenseVoice 模型预测语种、情感与事件标签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/SenseVoiceSmall从源码看该命令的入口实现位于 funasr/datasets/audio_datasets/sensevoice2jsonl.py其完整等价写法是python -m funasr.datasets.audio_datasets.sensevoice2jsonl。转换逻辑要点sensevoice2jsonl.py并行解析各清单文件对音频按 16kHz 采样率计算source_lenfbank 帧数对文本按词/字符数计算target_len自动检测target是否含标点中英文标点集合定义在contains_punctuationsensevoice2jsonl.py据此写入with_or_wo_itn字段若缺语言/情感/事件清单则以AutoModel(modelmodel_dir)对每个音频推理并从输出 token 中正则提取|...|标签补齐三个字段最终按key对齐所有字段写出一行一个 JSON 的 JSONL 文件。6.4 微调脚本详解确保将finetune.sh中的train_tool修改为你 FunASR 安装目录下funasr/bin/train_ds.py的绝对路径然后执行bash finetune.shfinetune.sh 关键配置逐项说明配置项含义CUDA_VISIBLE_DEVICES参与训练的 GPU 列表脚本据此自动计算nproc_per_nodemodel_name_or_model_dir模型名或本地模型路径默认iic/SenseVoiceSmall支持自动下载也可先git cloneModelScope 模型仓库到本地再指定本地路径train_data/val_data训练/验证 JSONL 路径脚本默认引用工作目录下data/train_example.jsonl需按实际数据修改deepspeed_configDeepSpeed 配置默认引用仓库 examples/deepspeed_conf/ds_stage1.jsondataset_conf.batch_sampler/batch_size/batch_type批处理策略示例使用BatchSamplerbatch_typetokenbatch_size6000按 token 数动态组批sort_size1024控制排序窗口num_workers4控制数据加载进程数train_conf.max_epoch最大训练轮数示例为 50train_conf.resume是否从断点恢复train_conf.validate_interval/save_checkpoint_interval验证与保存间隔步数示例均为 2000train_conf.keep_nbest_models/avg_nbest_model保留的最佳模型数与平均模型数示例为 20 / 10avg_keep_nbest_models_typeloss表示按验证损失选择平均对象train_conf.use_deepspeed是否启用 DeepSpeed示例为false同时仍传入deepspeed_configoptim_conf.lr学习率示例为 0.0002训练由torchrun拉起自动读取WORLD_SIZE/RANK/MASTER_ADDR/MASTER_PORT环境变量支持多机训练单机默认绑定 127.0.0.1:26669日志写入outputs/log.txt。6.5 持续微调保留原有能力当需要为 SenseVoiceSmall 增加口音、方言或新领域同时保留既有语言能力时务必参考仓库内的 CONTINUAL_FINETUNING.md。其核心要点先锁定评估集为每种需保留的语言与新领域各建一套说话人与训练/回放数据不重叠的固定验证集按语种分别记录基线 CER/WER并事先定义可接受的相对回退幅度relative regression (candidate CER - baseline CER) / baseline CER不要用混合 CER 选点避免大规模语料掩盖小语种回退。构建回放清单旧领域数据不足时可用原模型对自有/合规授权音频解码生成伪标签同时记录模型版本与原始解码输出以便审计对空转写、重复、截断、语种不匹配、时长越界、低置信度样本以及各说话人的随机抽样都要人工过一遍每轮从旧领域池中按固定预算抽样文档给出 1:1 / 2:1 / 3:1 的 replay:new 实验矩阵建议从 2:1 起步。语种 token 隔离是实验而非保证当前推理语种映射仅包含zh / en / yue / ja / ko外加nospeech处理共享|zh|可能干扰普通话必须通过保留门槛验证为新增方言添加 token 需要协同修改 tokenizer、词表、语言嵌入、checkpoint 迁移、导出与推理映射不能只在 JSONL 里写入新标签。两阶段训练Stage 1 冻结完整声学编码器只训练语言查询嵌入与 CTC/输出参数freeze_paramencoder、optim_conf.lr0.00002、train_conf.max_epoch5若新方言 CER 停滞而保留语种仍在门槛内Stage 2 恢复最佳 checkpoint 并仅冻结输入块与前三个常规编码器块freeze_paramencoder.encoders0,encoder.encoders.0,encoder.encoders.1,encoder.encoders.2必要时把学习率降到 0.00001。启动时务必核对日志中的Setting encoder...requires_grad False与模型摘要拼错前缀会静默保持参数可训练。按约束选点SenseVoice 返回 ASR CTC 损失 丰富标签目标与acc_richacc_rich并非 CERmodel.pt.best在官方脚本下指最优总验证损失而非最低 CER。每个候选 checkpoint 都要在普通话、粤语、新方言上分别评估先剔除违反保留门槛的再在剩余中选择新方言 CER 最低的从损失排序切换为准确率排序时必须使用新的输出目录否则恢复会被拒绝。LoRA 现状FunASR 对特定 Paraformer/SANM 路径提供 LoRA 支持但 SenseVoiceSmall 目前没有完整、文档化的 LoRA 配方lora_only不保证生成可训练的 SenseVoice adapter使用前务必核对可训练参数列表。七、源码级原理一次前向如何同时输出文本 情感 事件理解 SenseVoice 的输出格式关键在于 funasr/models/sense_voice/model.py 中的查询注入机制encode方法model.py训练时从text首 token 取语种 ID 经lid_int_dict映射为语言查询向量从第 4 个 token 取文本规范化类型withitn/woitn生成样式查询向量语种查询、情感/事件查询固定索引 1、2、文本规范化查询被拼接到语音特征前部使编码器看到任务提示推理时inferencemodel.pylanguage与use_itn参数分别决定语言查询与文本规范化查询的取值——这解释了为何推理时传languageauto与use_itnTrue就能控制输出语种与是否带标点/ITN编码器输出的前 4 帧对应查询 token 位置经 CTC 分类头产出语种、情感、事件、规范化标签其余帧经 CTC 解码产出文本 token。模型内部的情感/语种/事件字典model.py与后处理映射表postprocess_utils.py一一对应训练标签集即推理时输出的标签集。编码器SenseVoiceEncoderSmallmodel.py由 SANM带 FSMN 记忆的多头注意力编码层堆叠而成支持随机深度stochastic depth训练这也是模型能以较小体积保持较高精度与低延迟的架构基础。八、WebUI 体验仓库提供轻量 WebUI 便于直观体验模型效果python webui.py启动后在浏览器中即可上传音频查看富转录结果情感 emoji、事件符号与识别文本。九、更多资料更多 FunASR 用法见 docs/tutorial/README.md中文版见 docs/tutorial/README_zh.mdSenseVoice 相关测试可参考 tests_models/test_sensevoice.py、tests_models/test_sensevoice_spk.py以及 tests/test_sensevoice_tokenizer_special_tokens.py、tests/test_sensevoice_continual_finetuning_docs.py部署相关runtime/readme.md、runtime/triton_gpu/README.md、examples/openai_api/README.md模型清单model_zoo/modelscope_models.md、model_zoo/huggingface_models.md。使用中如遇问题可在仓库 GitHub 页面提交 Issue或加入 FunASR 官方社区群交流。【免费下载链接】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),仅供参考
返回列表