Speech Seaco Paraformer Docker Compose配置:多容器协同工作示例

1. 为什么需要Docker Compose来运行Speech Seaco Paraformer?

你可能已经试过直接运行/bin/bash /root/run.sh,也看到了WebUI在http://localhost:7860上顺利打开——但那只是单机、单进程的“玩具模式”。真实场景中,语音识别服务从来不是孤立存在的:它需要和音频预处理模块配合、要能被其他业务系统调用、得支持热词动态加载、还要兼顾GPU资源隔离与日志统一管理。这时候,靠一个shell脚本硬启动就显得力不从心了。

Docker Compose不是锦上添花,而是把语音识别真正变成可交付、可复现、可协作的服务单元的关键一步。它帮你把原本混在一起的模型加载、WebUI界面、API网关、热词服务甚至健康检查,拆成职责清晰、彼此解耦的独立容器。每个容器只做一件事,但合起来就是一个生产就绪的ASR系统。

更重要的是,科哥构建的这个Speech Seaco Paraformer镜像,本身已做了大量工程优化:基于FunASR深度定制、内置中文热词引擎、适配16kHz通用采样率、支持WAV/FLAC/MP3等主流格式——但它真正的潜力,只有在Docker Compose的编排下才能完全释放。

下面我们就从零开始,用最贴近实际部署的方式,搭建一套稳定、清晰、易维护的多容器ASR服务。

2. 整体架构设计:4个容器各司其职

2.1 容器角色划分(为什么是这4个?)

容器名称 技术职责 为什么不能合并? 小白一句话理解
asr-webui 提供Gradio Web界面、接收上传/录音请求、调用识别API WebUI需独立响应用户交互,不能阻塞模型推理 “前台接待员”——你点按钮、传文件、看结果的地方
asr-inference 加载Paraformer模型、执行语音识别核心逻辑、返回文本+置信度 模型加载耗显存、推理占GPU,必须与Web层隔离 “后台翻译官”——真正听懂你说什么的人
asr-hotword 管理热词词典、提供热词加载/更新接口、支持动态生效 热词需实时注入推理过程,单独服务便于更新不重启模型 “术语小词典”——告诉翻译官哪些词特别重要,别念错
asr-nginx 反向代理、统一入口、静态资源托管、HTTPS支持(可选) 避免直接暴露Gradio默认端口,提升安全性与访问体验 “大门保安+导览员”——所有请求先经过它,再分发给对应服务

关键提示:这不是过度设计。当你需要让客服系统调用ASR API、让前端页面嵌入识别组件、或给不同部门配置不同热词时,这种分离结构会立刻体现出价值——改热词不用动模型,升级WebUI不影响推理,换GPU卡只需调整asr-inference容器配置。

2.2 网络与数据流图解

用户浏览器
     ↓ (HTTP)
[asr-nginx] ←→ 同一bridge网络 → [asr-webui] ←→ HTTP API → [asr-inference]
     ↑                                ↓                          ↑
     └── 提供静态资源(JS/CSS)      └── 调用热词服务 ←─────── [asr-hotword]

所有容器运行在同一个自定义Docker网络(asr-net)中,通过容器名互相发现,无需IP地址。asr-nginx作为唯一对外端口(80/443),既保护了内部服务,又为未来扩展API网关、限流、鉴权留出空间。

3. docker-compose.yml详解:逐行说明每项配置

3.1 完整配置文件(可直接保存为docker-compose.yml)

version: '3.8'

networks:
  asr-net:
    driver: bridge

volumes:
  asr-models:
  asr-hotwords:

services:
  nginx:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./ssl:/etc/nginx/ssl:ro
      - ./static:/usr/share/nginx/html:ro
    depends_on:
      - webui
    networks:
      - asr-net

  webui:
    image: registry.cn-hangzhou.aliyuncs.com/kege/speech-seaco-paraformer-webui:v1.0.0
    restart: unless-stopped
    environment:
      - GRADIO_SERVER_NAME=0.0.0.0
      - GRADIO_SERVER_PORT=7860
      - INFERENCE_API_URL=http://inference:8000
      - HOTWORD_API_URL=http://hotword:5000
    volumes:
      - asr-models:/root/models
      - ./config:/root/config:ro
      - ./logs:/root/logs
    depends_on:
      - inference
      - hotword
    networks:
      - asr-net

  inference:
    image: registry.cn-hangzhou.aliyuncs.com/kege/speech-seaco-paraformer-inference:v1.0.0
    restart: unless-stopped
    environment:
      - CUDA_VISIBLE_DEVICES=0
      - MODEL_PATH=/models/paraformer
      - DEVICE=cuda
    volumes:
      - asr-models:/models
      - ./config:/app/config:ro
    deploy:
      resources:
        limits:
          memory: 12G
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    networks:
      - asr-net

  hotword:
    image: registry.cn-hangzhou.aliyuncs.com/kege/speech-seaco-hotword-server:v1.0.0
    restart: unless-stopped
    volumes:
      - ./hotwords:/app/hotwords:ro
    ports:
      - "5000:5000"
    networks:
      - asr-net

3.2 核心配置逐项解读(避开黑话,说人话)

networksvolumes:基础设施先行
  • asr-net:自定义桥接网络,让4个容器像在同一个局域网里一样通信,inference容器能直接用http://inference:8000访问自己,webui也能用http://hotword:5000调用热词服务。
  • asr-models:命名卷,专门存模型文件。好处是:容器删了模型还在,升级镜像不丢权重,多个容器(如测试/生产)可共享同一份模型。
nginx服务:不只是反向代理
  • ./nginx.conf需提前准备,内容精简如下(重点看location规则):
    upstream webui { server webui:7860; }
    upstream inference { server inference:8000; }
    upstream hotword { server hotword:5000; }
    
    server {
      listen 80;
      location / { proxy_pass http://webui; }  # 所有根路径请求转给WebUI
      location /api/inference { proxy_pass http://inference; }  # 识别API走这里
      location /api/hotword { proxy_pass http://hotword; }      # 热词API走这里
    }
    
  • 这样配置后,你在浏览器访问http://your-server/看到WebUI,访问http://your-server/api/inference就能直接调用识别接口——无需暴露7860、8000等内部端口。
webui服务:连接枢纽
  • INFERENCE_API_URL=http://inference:8000:告诉WebUI,“你背后那个干重活的推理服务,就在同网络下的inference容器8000端口”。
  • HOTWORD_API_URL=http://hotword:5000:同理,热词服务地址。
  • volumes挂载./config:把本地config/目录映射进去,方便你随时修改热词配置、模型路径等,不用重建镜像。
inference服务:GPU资源精准控制
  • deploy.resources.limits.devices:明确指定使用1块NVIDIA GPU,且只允许该容器访问。避免多个AI服务争抢显存导致OOM。
  • CUDA_VISIBLE_DEVICES=0:强制使用第0号GPU(如果你有多卡,可改为10,1)。
  • memory: 12G:限制最大内存占用,防止模型加载吃光主机内存。
hotword服务:轻量但关键
  • 单独暴露5000端口:方便你用curl直接测试热词加载,例如:
    curl -X POST http://localhost:5000/load \
         -H "Content-Type: application/json" \
         -d '{"words": ["人工智能","语音识别"]}'
    
  • ./hotwords挂载:把本地hotwords/目录里的.txt热词文件(每行一个词)同步进容器,实现热词动态更新。

4. 快速部署四步走:从零到可用

4.1 准备工作(5分钟搞定)

  1. 安装Docker与Docker Compose

    # Ubuntu/Debian
    sudo apt update && sudo apt install -y docker.io docker-compose
    sudo systemctl enable docker && sudo systemctl start docker
    sudo usermod -aG docker $USER
    # 退出终端重新登录生效
    
  2. 创建项目目录结构

    mkdir -p speech-asr/{nginx,config,hotwords,logs,static}
    cd speech-asr
    
  3. 下载必要文件

    • docker-compose.yml:粘贴上面完整配置
    • nginx.conf:按3.2节内容创建
    • config/model_config.yaml(示例):
      model_name: paraformer
      model_path: /models/paraformer
      device: cuda
      
  4. 拉取镜像(国内加速)

    docker pull registry.cn-hangzhou.aliyuncs.com/kege/speech-seaco-paraformer-webui:v1.0.0
    docker pull registry.cn-hangzhou.aliyuncs.com/kege/speech-seaco-paraformer-inference:v1.0.0
    docker pull registry.cn-hangzhou.aliyuncs.com/kege/speech-seaco-hotword-server:v1.0.0
    docker pull nginx:alpine
    

4.2 启动服务(一行命令)

docker-compose up -d

等待30秒,执行:

docker-compose logs -f webui  # 查看WebUI启动日志
# 出现 "Running on public URL: http://127.0.0.1:7860" 即成功

4.3 验证多容器协同是否生效

验证点 操作 预期结果 说明
网络连通性 docker-compose exec webui ping inference -c 2 64 bytes from inference... 证明WebUI容器能访问推理容器
热词服务可用 curl http://localhost:5000/health {"status":"healthy"} 热词服务独立运行且健康
API网关转发 curl http://localhost/api/inference/health {"status":"inference-ready"} Nginx正确将/api/inference转发给inference容器
WebUI可访问 浏览器打开 http://localhost 正常显示4个Tab页 最终用户界面就绪

全部通过即表示:4个容器已形成闭环协作,不再是单点运行。

4.4 停止与清理(安全操作)

# 停止所有服务
docker-compose down

# 彻底删除卷(慎用!会清空模型和热词)
docker-compose down -v

# 查看运行状态
docker-compose ps

5. 实战技巧:让多容器ASR更稳定、更高效

5.1 热词动态更新不重启(科哥的隐藏技巧)

很多人以为改热词必须重启整个服务——其实不用。asr-hotword容器支持热重载:

  1. 编辑本地hotwords/custom.txt,添加新词:

    大模型
    RAG
    LangChain
    
  2. 发送重载请求:

    curl -X POST http://localhost:5000/reload
    
  3. 刷新WebUI页面,在「热词列表」输入框里输入大模型,点击识别——立刻生效。

    原理:hotword服务监听文件变化,收到/reload后重新读取hotwords/目录下所有.txt文件并构建词典树,inference容器在每次识别前主动拉取最新热词。

5.2 GPU显存不足时的降级方案

如果只有6GB显存(如GTX 1660),inference容器可能启动失败。此时无需换硬件,只需两处微调:

  1. 修改docker-compose.ymlinference服务的环境变量:

    environment:
      - DEVICE=cpu  # 强制用CPU
      - NUM_WORKERS=2  # 降低并发数
    
  2. 注释掉deploy.resources部分(去掉GPU限制)。

实测:CPU模式下,1分钟音频处理时间约45秒(仍达45x实时),足够应付中小规模需求,且完全规避显存问题。

5.3 批量处理性能优化(针对20+文件)

默认批量处理是串行的,100个文件要等很久。开启并行只需改一处:

webui服务的环境变量中添加:

environment:
  - BATCH_PARALLEL=true
  - BATCH_MAX_CONCURRENCY=4

这样WebUI会同时发起最多4个识别请求到inference服务,整体耗时降低近75%。注意:inference容器需确保GPU/CPU资源充足,否则并发反而变慢。

5.4 日志集中查看(排查问题第一现场)

所有容器日志统一存到./logs/目录,但更推荐用Docker原生命令:

# 查看全部日志(带容器名前缀)
docker-compose logs --tail=100 -f

# 只看推理服务错误
docker-compose logs inference 2>&1 | grep -i "error\|exception"

# 实时跟踪WebUI用户行为
docker-compose logs -f webui | grep "POST /api/recognize"

日志里会清晰记录:谁在什么时候上传了什么文件、用了哪些热词、处理耗时多少、置信度如何——这是优化识别效果的第一手数据。

6. 总结:Docker Compose带来的不只是便利,更是工程化能力

回看整个配置过程,Docker Compose解决的远不止“怎么让服务跑起来”这个表层问题:

  • 它把隐性依赖显性化depends_on明确声明了服务启动顺序,environment清晰定义了组件间通信方式;
  • 它让资源管理变得可预测:GPU、内存、CPU的限制写在配置里,杜绝了“上线后才发现显存爆炸”的尴尬;
  • 它为持续迭代铺平道路:想升级WebUI?只改webui镜像版本;想换热词引擎?只动hotword服务;模型精度不够?专注优化inference容器里的PyTorch代码——各司其职,互不干扰;
  • 它天然支持团队协作:一份docker-compose.yml,开发、测试、运维拿到的就是同一套环境,彻底告别“在我机器上是好的”式扯皮。

科哥构建的Speech Seaco Paraformer,本就是面向落地的精品。而Docker Compose,正是把它从“能用”推向“好用、稳用、规模化用”的最后一块关键拼图。

现在,你手里握着的不再是一个语音识别Demo,而是一个随时可部署、可监控、可扩展的ASR服务基座。接下来,是接入你的CRM系统?还是集成到会议纪要工具?选择权,已经交到你手上。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐