从 Deepgram / AssemblyAI 迁移到自托管 FunASR:接入与验收清单
评估自托管语音转写时,真正要迁移的是应用契约:上传方式、模型选择、鉴权、结果结构和运行责任。本文以 FunASR 1.4.15 的包内 funasr-server 为边界,介绍文件转写的接入路径。它不是 Deepgram / AssemblyAI 专有 API 或 SDK 的直接替换,也不提供完整云服务功能对等承诺。
先列迁移清单,再选择模型
| 应用环节 | 迁移时要验证什么 |
|---|---|
| 请求协议 | 把现有 SDK 或 HTTP 调用映射到目标路由、multipart 文件上传及其实际声明的字段。连接地址、请求头和参数都需要检查。 |
| 任务方式 | 本地示例是一次文件上传转写,不是流式会话、异步任务队列或回调服务。原应用依赖这些流程时,需要单独实现或选择对应部署服务。 |
| 结果结构 | 明确文本、时间单位、分段、说话人标签以及空结果的映射。说话人分离标签不是实名身份识别;不同模型提供的信息不同。 |
| 故障处理 | 检查鉴权失败、无效文件、超时、重试与过载行为;客户端超时不等于后台推理已经取消。 |
| 运行责任 | 安排容量、监控、升级、数据留存及故障恢复。用自己的音频评估质量,不按未经验证的语言或价格排名选型。 |
先参考模型选型指南和部署矩阵。需要转写与说话人分离时,可评估第三方模型 MOSS-Transcribe-Diarize 的集成路径;不要把任一后端的能力推定为所有 FunASR 服务都具备。
最小本地接入:先验证 JSON 文本
前提:已经准备并验证过的独立 FunASR 1.4.15 环境。本段不是从零安装教程。运行下列命令的 Python 和 funasr-server 必须来自同一个已激活环境,且 funasr==1.4.15、PyTorch、音频依赖、FastAPI、Uvicorn、python-multipart、模型权重访问及音频文件均已准备好。平台依赖参见安装指南;其他版本需要重新核对行为。
python -c 'from importlib.metadata import version; assert version("funasr") == "1.4.15", version("funasr")'
python -m pip check
版本检查和 pip check 只检查包元数据,不能证明 CUDA、音频解码或实际转写可用。下方明确选择 SenseVoice CPU 做接入验证,不是性能建议;不要在同一端口同时启动多个服务。另有仓库示例 HTTP 服务指南可作实现对照,但它准备并启动的是 example server,不是本文所要求的包内 1.4.15 环境。
funasr-server --host 127.0.0.1 --port 8000 --model sensevoice --device cpu
在同一主机另一个终端提交有权处理的 audio.wav。返回文本会写到终端,请勿把私人转写内容放进公开日志。
curl --fail --show-error --silent --max-time 120 \
http://127.0.0.1:8000/v1/audio/transcriptions \
-F "file=@audio.wav" \
-F "model=sensevoice" \
-F "response_format=json"
预期结构是包含 text 的 JSON 对象,具体内容取决于音频与模型。120 秒是示例客户端超时,不是可处理音频时长或吞吐承诺。使用 OpenAI Python SDK 的基本调用可参考本地转写接入指南;这不意味着原厂商 SDK 可以原样使用。
明确返回格式边界
| response_format | 包内处理器的行为 |
|---|---|
json | 返回含 text 的 JSON 对象。 |
verbose_json | 返回结构化 JSON,包括 segments、duration 等字段;具体时间与说话人信息依赖模型和实际结果。 |
text | 返回 JSON 字符串,不是普通纯文本响应。 |
srt | 不生成 SRT 字幕,落入 JSON 文本对象分支;HTTP 200 不能证明返回了字幕文件。 |
vtt | 不生成 VTT 字幕,同样落入 JSON 文本对象分支。 |
该路由声明 file、model、language、response_format 和扩展字段 spk;其他字段被请求接受不代表已经应用。
包内服务的字段应通过私有或受限的运维路径访问运行中服务的 /openapi.json,并核对固定版本包内处理器源码。示例服务 API schema描述的是另一种实现,不是包内处理器的完整字段说明。包内服务、仓库示例、vLLM 与 llama.cpp 的默认值、参数和响应结构并不通用。
上线前的三项验收
- 契约:在旧、新实现上运行有代表性的受控请求,核对字段、文本解析、时间单位、错误与超时;不要以一次 200 响应作为全部兼容证据。
- 质量:用业务录音检查关键实体、多人重叠、分段与低质量音频。参考会议转写验收清单,记录模型、硬件和版本。
- 安全与运维:验证网关认证和后端不可绕过;容器的
127.0.0.1指向容器自身,跨容器需设计受限网络。按需要评估计算、存储、带宽、监控和维护成本,另行核对所用模型权重许可证。
自托管提供数据处理的控制空间,不自动保证音频从不落盘、日志不含转写或零成本。临时文件、代理、客户端及留存策略都要纳入检查。本文不比较厂商当前价格,也不声称新的准确率或性能测试结果。
相关文章
- FunASR vs Whisper 实测对比
- SenseVoice 部署指南
- Fun-ASR-Nano 使用指南
- 说话人分离:谁在何时说话
- 情感与语种检测
- 实时流式语音识别
- 转写超长音频(1小时一次搞定)
- 命令行转写(文本/JSON/SRT)
- 自托管 OpenAI Whisper API 替代
- 自动生成字幕(SRT / VTT)
- Python 语音转文字教程
- FunASR 跑进 llama.cpp(whisper.cpp 替代)
- FunASR vs faster-whisper(中文/粤语)
- 轻量语音识别(CPU 250MB)
- 选哪个 FunASR 模型
- 粤语语音识别(SenseVoice 原生粤语)
- 日语语音识别(SenseVoice 转写+标点+情感)
- Python 语音活动检测(VAD)
- 自托管替代 Google/AWS/Azure 云语音 API
- 中文语音识别(普通话)实战
- 标点恢复 Python 实战
- 语音识别带时间戳(字级)