如何在给 SenseVoiceSmall 增加新领域时保留原有语种并设置回归阈值

发布时间:2026/9/14 13:37:55
如何在给 SenseVoiceSmall 增加新领域时保留原有语种并设置回归阈值 如何在给 SenseVoiceSmall 增加新领域时保留原有语种并设置回归阈值【免费下载链接】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这篇文章面向要在 SenseVoiceSmall 中新增一种口音、方言或业务域文档中的案例是潮汕话 Teochew同时又必须保住普通话、粤语等已有语种识别能力的开发者。整个流程基于 FunASR 仓库中 CONTINUAL_FINETUNING.md中文版见 CONTINUAL_FINETUNING_zh.md和同目录的 finetune.sh。先明确一个前提无论全量微调、部分参数微调、adapter 还是 replay都不能保证零退化。文档要求把旧语种保持能力当成一条显式的评测约束来管理而不是训练结束后再看一眼混合指标。准备环境与训练入口微调需要 FunASR 以可编辑方式安装README 给出的要求是在仓库根目录执行pip3 install -e ./训练入口是同目录的finetune.sh。脚本默认配置模型iic/SenseVoiceSmall从 model hub 自动下载或改成本地路径训练/验证数据data/train_example.jsonl、data/val_example.jsonl需要改成本实验的混合训练 manifest 和固定验证集默认训练参数max_epoch50、lr0.0002、keep_nbest_models20、avg_nbest_model10、avg_keep_nbest_models_typeloss训练工具路径train_tool../../../funasr/bin/train_ds.pyREADME 明确要求把它改成你 FunASR 安装目录下funasr/bin/train_ds.py的绝对路径。训练数据是 JSONL每行字段包括key、source音频路径、target转写文本、text_language语言 id如|zh|、|en|、|yue|、emo_target、event_target、with_or_wo_itn等。已有 wav.scp 和文本文件时可用仓库提供的sensevoice2jsonl命令生成 JSONL用法见 README.md 的 Data Prepare 一节。第一步先锁定验证集再定义回归阈值在做任何训练之前为每个需要保留的语种/业务域建立固定验证集并为新域单独建一套。两个硬性要求验证集说话人与全部训练、replay 数据不重叠speaker-disjoint不要用一套混合 CER 来选 checkpoint——较大的普通话集合会掩盖粤语退化各语种必须分开评测。在生成伪标签之前先用原始模型在每套验证集上跑出基线 CER 或 WER 并记录下来然后为每个旧语种预先定义可接受的相对退化relative regression (candidate CER - baseline CER) / baseline CER注意文档的定性这个阈值是产品/业务决策不是 FunASR 给出的保证值候选 checkpoint 必须同时满足所有旧语种阈值和新域目标才有资格被选中。参考文本要经过独立核验新域标签是逐字转写还是书面语意译测试参考与训练标签是否来自同一生成流程仅做到说话人不重叠不能证明标注可靠——未经核验的新域 CER 既不能用于选 checkpoint也不能用于调整 replay 比例。文档还提到 issue #3388 的报告者后来撤回了早期新域评测、改用独立重建的测试集旧基线表因此失效对应做法是用同一套经过复核的参考文本和 CER 归一化规则重算冻结基线和所有候选。若普通话、粤语同时存在朗读和自发口语且线上两者都重要这两类数据也要分开检查。第二步构建 replay 清单没有人工标注的旧域数据时用原始模型转写自有或许可兼容的普通话、粤语音频作为伪标签。每条伪标签要连同模型版本和原始解码输出一起保存保证清单可审计、可重新生成。训练前至少过滤或抽检空文本、重复文本、明显截断的伪标签语种不匹配的样本超出当前训练配置支持时长范围的音频解码器能提供可比较分数时的低分样本每个语种、每位说话人的随机样本包括高分样本。伪标签不等同于真实标签验证集标签不能来自本轮伪标签流程。采样上每个 epoch 按固定预算采样 replay而不是把整个旧域池复制进每轮训练。文档给出的案例预算矩阵以 8.45 小时新域数据为例数值来自文档示例不是普适推荐值replay:new新域每轮 replay1:18.45 h8.45 h2:18.45 h16.9 h3:18.45 h25.35 h该案例建议从 2:1 起步每轮约采样普通话 10.1 小时、粤语 6.8 小时。60:40 只是实验起点不是官方固定比例它有意提高粤语占比防止按原始池100 h 普通话 / 10 h 粤语比例采样后粤语保持目标被淹没。不同 epoch 应轮换样本并为粤语设置最低占比如果口头统计的总小时数与分语种小时数不一致以实际 manifest 为准。第三步为新域选择语言 token当前模型的具名推理语言映射包含zh、en、yue、ja、ko外加自动判断和无语音处理这不是tokenizer 的完整词表。让新域共享|zh|只是一种实验方案不是隔离机制——它可能干扰普通话必须通过旧域保持评测。词表中存在某个 token例如|minnan|在 #3388 的实验中出现了有用对照不等于它空闲、可任意复用也不代表原版推理映射支持它采用任何语言 tag 改动前要固定 tokenizer/模型版本核对 token id、训练目标、query embedding 路径和推理映射并且不能把单个案例推广到其他语种或 checkpoint。不要直接在 JSONL 里写|teochew|并假设它会成为新语言 id——当前 tokenizer 不会把它编码为受支持的特殊 token。真正新增自定义语言 id 需要联动修改 tokenizer、词表、language embedding、旧权重迁移、导出和推理代码。同时检查下游语言校验和每一处白名单用真实结果走通导出、服务端解析和最终客户端排查空响应时保留原始模型输出不要简单关闭全部校验或改写语言标签来绕过白名单。第四步分两阶段训练把finetune.sh复制到实验目录指向混合训练 manifest 和固定验证 manifest然后把默认的长周期、高学习率配置替换为短周期第一阶段。阶段一输出层 warm-up冻结完整声学 encoder只训练语言查询 embedding 和 CTC/output 参数train_conf.max_epoch5 \ freeze_paramencoder \ optim_conf.lr0.00002 \3 到 5 个 epoch 只是初始预算。此时应提高验证与保存频率及时观察旧语种和新域的指标曲线不要等默认的 50 epoch 结束后才检查旧语种退化。阶段二放开 encoder 后部层如果新域 CER 停滞、而普通话和粤语仍满足保持阈值从阶段一最佳 checkpoint 继续只冻结输入层和前三个常规 encoder blockfreeze_paramencoder.encoders0,encoder.encoders.0,encoder.encoders.1,encoder.encoders.2 \ optim_conf.lr0.00002 \freeze_param是逗号分隔的参数名前缀匹配逻辑见 train_ds.py参数名以前缀加.开头或完全相等时置requires_grad False。按当前 SenseVoiceSmall 结构见 model.py 中的self.encoders0后面的encoder.encoders.*block 仍可训练。如果某个旧语种开始退化应进一步把学习率降到例如0.00001或提前停止。启动后的验证启动后确认日志中出现预期冻结行文档给出的示例Setting encoder...requires_grad False同时检查 model summary 中的可训练参数列表。这里有一个隐蔽的坑前缀拼错时不会匹配任何参数预期冻结的参数会静默保持可训练且没有任何报错——所以日志行和 summary 两处都要看确认冻结范围与当前阶段一致。第五步按约束选择 checkpoint维护中的finetune.sh明确使用train_conf.avg_keep_nbest_models_typeloss这里有几个必须理解的语义SenseVoice 返回 ASR CTC loss 加 rich-tag 目标以及acc_rich不返回训练器所选的 ASRaccacc_rich不是 CER 或 ASR 准确率所选指标缺失或非有限时训练器会明确告警并把该点排除在 best 选择、keep-N 排名和按指标平均之外——未参与排名的 checkpoint 可能仍留在磁盘上此时应修正指标或数据而不是假设 keep-N 会清理它们从 accuracy 改为 loss 排名或反向时必须换新的输出目录resume 时混用两套指标会被直接拒绝历史零值无法可靠追溯为缺失已裁剪的权重也无法恢复这个配方下的model.pt.best表示总验证 loss 最优不是 CER 最低、更不是旧域保持最好权重平均结果也只是候选仍须重新通过全部评测门槛。每个候选 checkpoint 都要在普通话、粤语和新域上分别评估选择流程丢弃任何一个旧语种超过退化阈值的 checkpoint在剩余 checkpoint 中选新域 CER 最低者如果没有任何候选通过依次增加 replay 到 2:1 或 3:1、提高粤语最低占比、降低学习率或缩短训练如果旧语种全部通过但新域停滞从阶段一切换到部分冻结的阶段二。实验表应记录模型版本、manifest 版本、replay 配比、冻结前缀、学习率、step 和三套指标保证最终选出的 checkpoint 可复现。已知限制LoRAFunASR 已有面向部分 Paraformer/SANM 路径的 LoRA 支持但 SenseVoiceSmall 目前没有完整且文档化的 LoRA 配方。不要假设设置lora_only就会自动生成可训练的 SenseVoice adapter任何 adapter 实验之前先核对实际可训练参数列表。阈值与比例replay 预算、60:40 配比、8.45 小时案例都只是文档中的实验起点和预算演示不是已验证的最优值回归阈值由业务决定FunASR 不提供保证不退化的承诺。旧训练受影响场景如果之前的训练受指标缺失被当作零值这类缺陷影响需要对仍保留的 checkpoint 做独立复测而不是只升级软件。启动前检查清单文档给出的完整 checklist开跑前逐项确认验证集与训练、replay 数据之间说话人不重叠每个语种的基线 CER/WER 和可接受相对退化已记录伪标签已过滤并按语种和说话人做了人工抽检replay 使用明确的每轮预算并设置了粤语最低占比参考文本和归一化规则已独立核验之后才做 CER 对比语言 token 映射和下游白名单已用真实结果做过端到端检查排名指标已明确更换指标时使用了新的输出目录冻结日志和可训练参数与当前阶段一致所有保存的 checkpoint 都会分别评估旧语种和新域。完成上述流程后你的产出是一个在所有旧语种满足预设退化阈值前提下新域 CER 最低的 checkpoint以及一张可复现的实验记录表如果没有任何 checkpoint 同时满足阈值文档给出的出路是回到 replay 配比、学习率和训练时长这几个已列出的调节项而不是放宽评测门槛。【免费下载链接】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),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询