换了模型却没生效?核对 WebSocket 启动配置
在实时转写服务里,流式结果和句尾离线结果可能来自不同模型。FunASR 的 Python WebSocket 服务分别提供这两组配置;排查模型替换时,先确认自己修改的是哪一组,以及运行的脚本是否真正把参数传下去了。
一个典型故障是:启动命令写了新的 --asr_model,服务也正常启动,但离线构造器仍使用固定的模型名和版本。参数被命令行解析器接受,不代表它被模型构造器使用。下面用一个不加载模型的检查,先把这两个环节对上。
本文对应 Python WebSocket 服务的源码修复,不是所有运行时的统一配置协议。文中的源码检查不发送音频、不启动服务、不下载权重;既有 GPU 验证使用合成模型与音频,证明参数路由,不证明真实语音准确率或部署性能。
1. 区分离线模型和流式模型
| 你要修改的部分 | 对应参数 |
|---|---|
| 离线识别,包括两遍识别的离线阶段 | --asr_model 与 --asr_model_revision |
| 流式识别 | --asr_model_online 与 --asr_model_online_revision |
| 语音活动检测和标点 | 各自的 --vad_model、--punc_model 及版本参数 |
替换离线模型不会自动替换流式模型、VAD 或标点模型。两遍识别出现“中间结果与最终结果不同”,本身也不是模型加载错误的证据;需要结合各阶段输出与实际构造参数判断。
2. 检查正在使用的脚本,而不只看 pip 版本
原始修复 #3887指出了硬编码问题;保留作者历史的集成 #3888已合并。修复后的离线构造器使用 model=args.asr_model 和 model_revision=args.asr_model_revision,默认配置仍是 paraformer-zh 与 v2.0.4。
可对照固定提交中的服务源码。如果你运行的是复制到其他目录的脚本,升级根包 funasr 并不会替换那份文件。记录实际脚本路径、源码提交、Python 环境和权重文件 SHA256,才能判断升级是否进入了真正的服务入口。
3. 运行一个只读源码检查
将下面的检查脚本放在独立文件中,以实际服务脚本路径作为唯一参数运行。它只用 Python 标准库读取并解析源码,不导入服务模块;直接导入服务脚本可能触发模型初始化,不能当作轻量检查。
import ast
import hashlib
import json
from pathlib import Path
import sys
path = Path(sys.argv[1])
raw = path.read_bytes()
tree = ast.parse(raw, filename=str(path))
calls = [node.value for node in tree.body
if isinstance(node, ast.Assign)
and any(isinstance(target, ast.Name) and target.id == "model_asr"
for target in node.targets)]
assert len(calls) == 1 and isinstance(calls[0], ast.Call)
options = {item.arg: ast.unparse(item.value) for item in calls[0].keywords}
print(json.dumps({
"sha256": hashlib.sha256(raw).hexdigest(),
"offline_model": options.get("model"),
"offline_revision": options.get("model_revision"),
}, indent=2))
python audit_model_options.py /path/to/FunASR/runtime/python/websocket/funasr_wss_server.py
对于上面引用的修复源码,两个输出应为 args.asr_model 和 args.asr_model_revision。若输出仍是字符串常量,说明这份脚本没有使用对应参数。若自定义脚本改变了顶层结构,检查会失败,需要人工检查构造路径;这个小脚本不是任意 Python 程序的通用分析器,也没有验证当前服务进程加载了该文件。
4. 参数路由正确之后,还要验证什么?
在隔离环境中使用已获授权的本地权重,分别检查默认配置、自定义模型路径和自定义版本。对于本地目录,版本字符串不能代替文件哈希;对于远端模型标识,也要记录实际解析到的权重版本。模型、配置和前端必须相容,不能只因路径可读就判断可部署。不要在共享服务上直接替换依赖或权重。
这次修复已有默认与两组模型路径、两组版本的五种真实 CUDA 路由验证,使用真实 AutoModel 和本地小型合成权重,共十条输出。它覆盖的是“指定参数到达指定模型”,不是预训练模型的识别质量、并发容量、完整 WebSocket 网络链路或生产服务升级。
下一层验收应使用你有权处理的录音,分别保留流式和最终结果,检查漏字、专名、断句与时间戳,再评估延迟和并发。私有录音、转录和绝对路径不要贴到公开 issue;可以先提供去敏配置和可公开的最小复现。
把配置问题与识别问题分开
如果源码路由正确,但术语仍不理想,再核对热词链路和模型能力;如果句尾内容丢失,则继续检查音频边界与 VAD。每次只改变一项配置,保留输入与逐条结果,能让下一步排查有明确依据。
下一步可参考会议转写验收清单,为自己的录音建立配置、文本和时间戳对照记录。