MiniCPM-o 4.5 全双工语音服务本地部署全记录

2026年6月13日 · 深夜折腾实录 · GPUFree 平台


背景

最近想在自己服务器上跑一个 MiniCPM-o 4.5 的全双工语音服务,支持实时语音对话、图像理解、视频交互等多模态能力。模型文件已经下载好了,但如何高效部署成可用的服务,折腾了一整晚。

环境概览

项目 规格
GPU NVIDIA RTX 4090 24GB
CPU Intel Xeon Gold 6430 (128核)
内存 503GB
系统 Ubuntu 22.04, CUDA 12.8
平台 GPUFree 容器环境

踩坑历程

坑1:模型格式不匹配

最初以为 GGUF 文件已经下载好了,结果发现 /root/gpufree-data/models/MiniCPM-o-4_5/ 里是 PyTorch safetensors 格式,而 GGUF 文件实际上在 /root/gpufree-share/ 下,且只有 llama.cpp 用的文件。

全双工语音服务需要的是 PyTorch 官方方案,GGUF 跑不了 WebSocket 全双工。

坑2:依赖安装困难

官方推荐 Python 3.10 + Miniconda,但:

  • 下载 Miniconda 太慢(网络限制)
  • 磁盘空间不足(根目录只剩 4.8GB,gpufree-data 满了)
  • 系统自带 Python 3.12,与官方推荐的 3.10 有差异

解决方案:直接用系统 Python,缺什么装什么,跳过 Miniconda。

# 安装缺失的关键依赖
pip3 install --break-system-packages \
    "transformers==4.51.0" \
    "accelerate==1.12.0" \
    "minicpmo-utils[all]>=1.0.5" \
    "websockets>=16.0" \
    "fastapi>=0.128.0" \
    "uvicorn>=0.40.0" \
    "pydantic>=2.11.0" \
    "soxr" \
    "stepaudio2-minicpmo"

坑3:配置文件格式错误

config.json 格式有误,修复为:

{
  "model": {
    "model_path": "/root/gpufree-data/models/MiniCPM-o-4_5",
    "pt_path": null,
    "attn_implementation": "auto"
  },
  "audio": {
    "ref_audio_path": "/root/gpufree-share/audio/ref_minicpm_signature.wav",
    "playback_delay_ms": 200,
    "chat_vocoder": "token2wav"
  },
  "service": {
    "gateway_port": 8188,
    "worker_base_port": 22400,
    "max_queue_size": 1000,
    "request_timeout": 300.0,
    "compile": false,
    "data_dir": "data"
  },
  "duplex": {
    "pause_timeout": 60.0
  }
}

坑4:进程管理

后台启动的进程容易被系统终止。最终用 setsid 彻底分离进程:

setsid bash -c 'cd /path/to/demo && CUDA_VISIBLE_DEVICES=0 PYTHONPATH=. python3 worker.py --worker-index 0 --gpu-id 0 --port 22400' </dev/null &>/dev/null &
disown

坑5:外网访问与 WSS 加密

这是最折腾的一环:

  1. 云平台端口转发:8006 端口映射为 https://xxx.gpufree.cn:8443/,但直接访问返回 404
  2. frp 方案:尝试在公网机器部署 frps,但 GitHub 下载 frp 包一直超时
  3. 最终方案:用 nginx 反向代理,一行命令搞定 WSS 加密
# 安装 nginx
apt-get install -y nginx openssl

# 生成自签名证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/nginx/ssl/server.key \
    -out /etc/nginx/ssl/server.crt \
    -subj "/CN=localhost"

# 配置 nginx 反向代理 + WebSocket 支持
cat > /etc/nginx/sites-available/minicpm-o << 'EOF'
upstream minicpm_backend {
    server 127.0.0.1:8188;
}

server {
    listen 8443 ssl;
    server_name _;

    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 86400s;
    proxy_send_timeout 86400s;

    location / {
        proxy_pass http://minicpm_backend;
    }
}
EOF

最终架构

你的浏览器 ──wss──> [云平台端口转发 :8443] ──> [nginx :8443] ──> [Gateway :8188] ──> [Worker :22400]
组件 端口 说明
Worker 22400 模型加载,GPU 推理
Gateway 8188 HTTP API,会话管理
Nginx 8443 WSS 加密,WebSocket 代理

服务验证

# 健康检查
curl -k https://localhost:8443/health
# {"status":"healthy","timestamp":"2026-06-14T01:17:12.243783"}

# WebSocket 全双工语音测试
python3 -c "
import asyncio, ssl, websockets

async def test():
    ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
    async with websockets.connect(
        'wss://localhost:8443/v1/realtime?mode=audio',
        ssl=ctx, max_size=2**25
    ) as ws:
        msg = await ws.recv()
        print('Connected!', msg[:200])

asyncio.run(test())
"

可用的 API 端点

模式 WebSocket 路径 说明
全双工语音 /v1/realtime?mode=audio 实时语音对话
轮次对话 /v1/realtime?mode=chat 文本/图片/视频/音频
半双工语音 /v1/realtime?mode=audio&duplex=half 对讲机模式

资源消耗

指标 数值
GPU 显存 ~21.5GB / 24GB
模型大小 ~19GB (PyTorch safetensors)
推理速度 首包延迟约 1-2s
并发数 1(24GB 显存上限)

经验总结

  1. 先确认模型格式再决定部署方案 — GGUF ≠ PyTorch,全双工需要官方 PyTorch 方案
  2. nginx 就是最好的 WSS 反向代理 — 不需要 frp、不需要额外工具
  3. setsid + disown 是保活进程的利器 — 避免后台进程被意外终止
  4. 磁盘空间要提前规划 — 容器环境尤其要注意,/ 分区满了会出问题
  5. 依赖版本要对齐 — transformers 4.51.0 是关键,5.x 不兼容

参考资源


折腾到凌晨一点半,全双工语音终于通了。看着手机里传来的实时语音回复,感觉这一晚上的坑都值了。

🌙 几米 记于 2026-06-14

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐