FunASR SenseVoice 模型 Docker 部署:三步跑通离线语音识别服务
【免费下载链接】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
FunASR 是开源语音识别工具包,其 SenseVoice 模型提供中、英、日、韩、粤五语的离线转写接口,可同时输出情感与音频事件标签。本文用仓库里自带的现成镜像,把它变成一个 OpenAI 兼容的转写服务,目标是十分钟跑通、十分钟定位问题。
先回答为什么用容器
直接pip install funasr常卡在 CUDA 版本与依赖冲突上;多台机器环境不一致,让"我这边能跑"变成排查黑洞。内网无公网的机器还有离线部署这一硬需求。容器把系统依赖、Python 依赖、启动参数固化成一个镜像,这三类差异同时消失。
部署前对照这张清单
| 检查项 | 达标线 | 备注 |
|---|---|---|
| Docker Engine | ≥ 20.10,docker compose命令直接可用 | 安装方式见 Docker 安装指南 |
| GPU 容器支持 | --gpus all进容器后能认卡 | NVIDIA 驱动 + Container Toolkit,纯 CPU 环境可跳过 |
| 内存 | 16GB 可用,32GB 更稳 | 推理本身不占大头,模型加载与缓存占 |
| 磁盘 | 至少 5GB 空闲 | 含模型权重与/root/.cache缓存 |
| 网络 | 首次启动需拉取iic/SenseVoiceSmall | 离线环境:预导出缓存卷再挂载进容器 |
三步跑通:镜像、启动、就绪
第一步:构建 FunASR 服务镜像
仓库的 examples/openai_api/ 目录自带 Dockerfile,基于 python:3.10-slim,funasr、fastapi、uvicorn 依赖全部装好,直接构建即可:
cd examples/openai_api cp .env.example .env docker compose up --build默认按 CPU 模式启动。建议先用这个姿势把冒烟测试跑完,别一开始就和 GPU 问题纠缠。
第二步:启动容器,GPU 与 CPU 两套命令
冒烟通过后再按设备跑正式服务:
docker build -t funasr-api . docker run --rm --gpus all -p 8000:8000 \ -e FUNASR_DEVICE=cuda -e FUNASR_MODEL=sensevoice funasr-api # CPU:去掉 --gpus all,改为 -e FUNASR_DEVICE=cpu第三步:模型自动下载,服务自动就绪
容器启动后运行server.py,首次会从 ModelScope 拉取iic/SenseVoiceSmall权重到容器内/root/.cache,并预加载 sensevoice 别名。compose 部署默认挂载funasr-cache卷,二次启动不再重复下载;离线机器挂载预先准备好的缓存卷即可。下面命令能返回模型列表,服务即就绪:
curl http://localhost:8000/health验证一次真实转写,再动手调参
先确认可用,再谈优化:
curl http://localhost:8000/v1/audio/transcriptions \ -F file=@sample.wav -F model=sensevoice更省事的方式是直接跑仓库自带的 smoke_test,它一次覆盖健康检查与转写请求:
bash smoke_test.sh # 不依赖 curl 的跨平台方式: python smoke_test.py --base-url http://localhost:8000返回文本符合预期,链路就通了。调优看四个位置:
- 批处理:SenseVoice 的动态批用
batch_size_s按总秒数凑批(示例代码取 60 秒);短音频(<30s)任务直接设batch_size=64更快。显存利用率长期低于 50%,先把批翻倍,再考虑加卡。 - 量化:CPU 链路可导出 ONNX 并开启
quantize=True(INT8),吞吐明显上升,精度差在可接受范围内时优先做。 - 线程:CPU 推理线程数与物理核数对齐,容器内用
nproc核对;top中%us + %sy长期低于 50% 时,优先加批而不是加线程。 - 实时率:SenseVoice 在 GPU 上约 170 倍实时(官方口径)。实测 RTF 明显偏离这个量级,先确认 CUDA 真正生效(
nvidia-smi有显存占用为准),再查批大小。
🔍 故障速查:现象 → 排查方向
| 现象 | 排查方向 |
|---|---|
| 启动即报 CUDA 不可用 | 先切FUNASR_DEVICE=cpu确认服务本身能跑,再查 Container Toolkit 是否安装、容器内nvidia-smi是否可用 |
| 8000 端口被占用 | 改-p 9000:8000与--port 9000,冒烟测试同步改BASE_URL=http://localhost:9000 |
| 首次启动长时间无响应 | 正在下载权重,观察/root/.cache体积变化;内网机器换挂载预置缓存卷 |
| 响应里缺 segments 字段 | 请求追加-F response_format=verbose_json |
| 其他容器里访问 localhost 失败 | 用 compose service 名或 k8s service 名这类运行时可达的主机名 |
| 识别效果下降 | 确认音频为 16kHz 单声道;language="auto"是否误判语种;固定误识别词优先做热词后处理,别急着换模型 |
部署之后
有领域词表时,先做热词后处理或换用 nn 热词模型,长尾错误再用 SenseVoice 微调脚本 拿自有数据做持续微调,多语言能力不丢。CPU 高并发场景可评估 部署选型表 里的 C++ runtime 路径。服务本身已是 OpenAI 兼容接口,现有 OpenAI 客户端改一下 base_url 就能接入。
【免费下载链接】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),仅供参考