Files
meme/tts/COSYVOICE_QUICK_START.md
konjacpotato 6772699cfe
Some checks failed
Gitea Actions Demo / deploy (push) Failing after 2s
commit code
2025-12-29 19:34:39 +08:00

4.8 KiB
Raw Blame History

CosyVoice 引擎集成 - 快速参考

文件清单

已创建/修改的文件:

新增文件

  • tts/cosyvoice_engine.py - CosyVoice 引擎实现
  • tts/COSYVOICE.md - 详细使用指南
  • tts/test_cosyvoice.py - 集成测试文件

修改文件

  • tts/factory.py - 注册 CosyVoice 引擎
  • tts/__init__.py - 导出 CosyVoiceEngine 类
  • tts/examples.py - 添加 CosyVoice 使用示例
  • requirements.txt - 添加 httpx 依赖

核心实现

1. CosyVoice 引擎类 (cosyvoice_engine.py)

from tts.cosyvoice_engine import CosyVoiceEngine

# 创建引擎实例
engine = CosyVoiceEngine(
    api_url="http://192.168.1.200:8000/tts/zero_shot",
    timeout=30.0
)

# 合成语音
audio = await engine.synthesize(
    text="你好世界",
    voice="speaker_id"  # zero_shot_spk_id
)

2. 工厂模式注册

from tts.factory import TTSEngineFactory, TTSEngineType

# 通过工厂创建 CosyVoice 引擎
engine = TTSEngineFactory.create("cosyvoice")

# 或者
engine = TTSEngineFactory.create(TTSEngineType.COSYVOICE)

API 调用示例

POST 请求格式

POST http://192.168.1.200:8000/tts/zero_shot
Content-Type: application/json

{
    "text": "合成的文本内容",
    "zero_shot_spk_id": "发音人ID"
}

Python 集成示例

import asyncio
from tts.factory import TTSEngineFactory

async def main():
    # 创建引擎
    engine = TTSEngineFactory.create("cosyvoice")
    
    # 合成语音
    text = "你好,我是 CosyVoice 合成的语音。"
    audio = await engine.synthesize(
        text=text,
        voice="female_speaker_001"
    )
    
    # 保存音频文件
    with open("output.wav", "wb") as f:
        f.write(audio.getvalue())

asyncio.run(main())

FastAPI 路由示例

from fastapi import APIRouter, HTTPException
from tts.factory import TTSEngineFactory

router = APIRouter(prefix="/api/tts", tags=["tts"])

@router.post("/cosyvoice")
async def synthesize(text: str, speaker_id: str):
    """使用 CosyVoice 合成语音"""
    try:
        engine = TTSEngineFactory.create("cosyvoice")
        audio = await engine.synthesize(text=text, voice=speaker_id)
        return {
            "status": "success",
            "size": len(audio.getvalue())
        }
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail="TTS failed")

支持的引擎列表

获取所有支持的 TTS 引擎:

from tts.factory import TTSEngineFactory

engines = TTSEngineFactory.get_supported_engines()
# 返回: ['edge-tts', 'cosyvoice']

关键特性

异步支持 - 使用 asyncio 异步操作
HTTP 客户端 - 使用 httpx 库进行异步 HTTP 请求
错误处理 - 完善的异常处理和日志记录
连接管理 - 提供 close() 方法管理 HTTP 连接
工厂模式 - 统一的引擎创建和管理接口
参数验证 - 强制要求 voice 参数

依赖项

  • httpx>=0.24.0 - 异步 HTTP 客户端
  • loguru - 日志记录(已存在)

配置建议

环境变量方式

.env 文件中添加:

COSYVOICE_API_URL=http://192.168.1.200:8000/tts/zero_shot
COSYVOICE_TIMEOUT=30

在代码中使用:

import os
from tts.cosyvoice_engine import CosyVoiceEngine

api_url = os.getenv("COSYVOICE_API_URL", "http://192.168.1.200:8000/tts/zero_shot")
timeout = float(os.getenv("COSYVOICE_TIMEOUT", "30"))

engine = CosyVoiceEngine(api_url=api_url, timeout=timeout)

配置类方式

创建 config/cosyvoice.py

from pydantic_settings import BaseSettings

class CosyVoiceSettings(BaseSettings):
    api_url: str = "http://192.168.1.200:8000/tts/zero_shot"
    timeout: float = 30.0
    
    class Config:
        env_prefix = "COSYVOICE_"

settings = CosyVoiceSettings()

故障排查

问题:连接失败

ValueError: Failed to connect to CosyVoice API

检查清单:

  1. CosyVoice 服务是否运行
  2. 网络连接是否正常
  3. API URL 是否正确
  4. 防火墙是否阻止连接

问题:缺少 voice 参数

ValueError: voice (zero_shot_spk_id) is required for CosyVoice

解决方案: 确保在调用 synthesize() 时提供 voice 参数

问题httpx 未安装

ModuleNotFoundError: No module named 'httpx'

解决方案: 安装依赖

pip install httpx

测试

运行集成测试:

python tts/test_cosyvoice.py

运行示例代码:

python tts/examples.py

更多信息


版本信息

  • CosyVoice 引擎版本: 1.0.0
  • 最后更新: 2025年11月
  • 兼容 Python 3.7+