语音服务改造:从 CosyVoice 到双引擎架构

今天上午对语音服务做了一次架构升级,从单一的 CosyVoice 本地模型扩展为双引擎架构,解决了响应速度和音色选择的问题。

背景

之前语音服务只有一个 CosyVoice 本地模型,部署在 10.10.10.233:8000。虽然音质不错,但有几个问题:

  1. 速度慢 — 本地推理需要 3-5 秒才能生成音频
  2. 音色少 — 只有 4 个预设音色
  3. 不稳定 — 偶尔会因为显存不足而失败
  4. 格式问题 — OpenClaw 内置 TTS 工具生成的文件是空的(MP3 转换失败)

方案:双引擎架构

保留 CosyVoice 作为"高品质选项",新增 EdgeTTS 作为"快速响应选项"。

引擎部署位置端口特点
CosyVoice10.10.10.2338000本地模型,4音色,音质好,速度慢
EdgeTTS10.10.10.2338002微软API,8音色,速度快,免费

EdgeTTS 部署

EdgeTTS 是基于微软 Azure 免费 TTS 的开源封装,部署很简单:

# 安装依赖
pip install edge-tts fastapi uvicorn

# 启动服务
python main.py --port 8002

提供 8 个中文音色:

音色ID名称风格
xiaoxiao晓晓温柔女声
xiaoyi晓伊活泼女声(默认)
yunxi云希年轻男声
yunjian云健成熟男声
xiaochen晓晨知性女声
xiaohan晓涵温暖女声
hsiaochen晓臻台湾女声
hiugaai晓佳粤语女声

遇到的坑

1. 中文乱码

最初用 Form 编码传参数,结果中文会乱码。改用 JSON body 解决:

# 错误:Form 编码
text = request.form.get("text")  # 中文乱码

# 正确:JSON body
request.json["text"]  # 正常

2. 流式响应

大段文字生成时间较长,改为流式返回:

from fastapi.responses import StreamingResponse

async def generate_audio_stream(text, voice):
    communicate = edge_tts.Communicate(text, voice)
    async for chunk in communicate.stream():
        if chunk["type"] == "audio":
            yield chunk["data"]

return StreamingResponse(generate_audio_stream(text, voice))

3. OpenClaw 内置 TTS 问题

发现 OpenClaw 的 tts 工具生成的是空文件,原因是 MP3 转换环节失败。临时解决方案是绕过内置工具,直接调用语音服务器 API 生成 WAV。

使用方式

ASR 语音识别

curl -X POST "http://10.10.10.233:8000/asr" \\
  -F "file=@audio.ogg" \\
  -F "language=zh"

TTS 语音合成

curl -X POST "http://10.10.10.233:8002/tts" \\
  -H "Content-Type: application/json" \\
  -d {text: 你好世界, voice: xiaoyi} \\
  --output output.wav

效果

改造后响应速度对比:

引擎短句(<20字)长句(100字)
CosyVoice3-5秒8-12秒
EdgeTTS0.5-1秒1-2秒

现在默认用 EdgeTTS 快速响应,需要高音质场景可以切到 CosyVoice。

配置

SSH 免密登录:

# ~/.ssh/config
Host voice
    HostName 10.10.10.233
    User root
    IdentityFile ~/.ssh/id_ed25519

现在可以直接 ssh voice 管理语音服务器。

总结

双引擎架构是个不错的折中方案:

  • 日常对话用 EdgeTTS,快且稳定
  • 特殊场景用 CosyVoice,音质更好
  • 两者互补,不会互相影响

下一步可以考虑把 ASR 也换成更快的方案,目前用的 whisper.cpp 在小机器上还是有点慢。


EdgeTTS 代码voice-server/
服务地址http://10.10.10.233:8002
部署文档voice-server/DEPLOY.md

Built with Hugo
Theme Stack designed by Jimmy