ef8b747c7b
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 35s
CI/CD Pipeline / Frontend Lint (push) Successful in 1m11s
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 3m26s
CI/CD Pipeline / Unit Tests (push) Successful in 4m25s
CI/CD Pipeline / Integration Tests (push) Successful in 1m32s
CI Build & Deploy Pipeline / Build Staging API Image (push) Waiting to run
CI Build & Deploy Pipeline / Build Staging Web Image (push) Waiting to run
CI Build & Deploy Pipeline / Build Staging Worker Image (push) Waiting to run
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Blocked by required conditions
CI Build & Deploy Pipeline / Staging E2E Tests (push) Blocked by required conditions
CI Build & Deploy Pipeline / Staging API Integration Tests (push) Blocked by required conditions
CI Build & Deploy Pipeline / Build Production API Image (push) Waiting to run
CI Build & Deploy Pipeline / Build Production Web Image (push) Waiting to run
CI Build & Deploy Pipeline / Build Production Worker Image (push) Waiting to run
CI Build & Deploy Pipeline / Deploy Production (push) Blocked by required conditions
CI Build & Deploy Pipeline / Production Browser E2E (push) Blocked by required conditions
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com> Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
87 lines
2.5 KiB
Python
Executable File
87 lines
2.5 KiB
Python
Executable File
"""TTS 服务工厂.
|
||
|
||
根据配置创建对应的 TTS 服务实例。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import logging
|
||
import os
|
||
|
||
from packages.ports.tts_service import TtsService
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# 可用的 provider 映射
|
||
_PROVIDERS: dict[str, type[TtsService]] = {}
|
||
|
||
|
||
def register_provider(name: str, cls: type[TtsService]) -> None:
|
||
"""注册 TTS 供应商."""
|
||
_PROVIDERS[name] = cls
|
||
|
||
|
||
def get_tts_service(provider: str | None = None, **kwargs) -> TtsService:
|
||
"""获取 TTS 服务实例.
|
||
|
||
Args:
|
||
provider: 供应商名称(None 则从环境变量读取 TTS_PROVIDER)
|
||
**kwargs: 传递给服务构造函数的参数
|
||
|
||
Returns:
|
||
TTS 服务实例
|
||
|
||
Raises:
|
||
ValueError: 不支持的供应商
|
||
"""
|
||
if provider is None:
|
||
provider = os.environ.get("TTS_PROVIDER", "")
|
||
|
||
if not provider:
|
||
# 自动检测:配置了 CosyVoice API Key 则默认用 cosyvoice,否则用 mock
|
||
try:
|
||
from packages.shared.config import get_shared_settings
|
||
|
||
settings = get_shared_settings()
|
||
if getattr(settings, "cosyvoice_api_key", ""):
|
||
provider = "cosyvoice"
|
||
else:
|
||
provider = "mock"
|
||
except Exception:
|
||
provider = "mock"
|
||
|
||
provider = provider.lower()
|
||
|
||
if provider not in _PROVIDERS:
|
||
# 延迟导入避免循环依赖
|
||
if provider == "mock":
|
||
from packages.adapters.tts.mock_tts_service import MockTtsService
|
||
|
||
_PROVIDERS["mock"] = MockTtsService
|
||
elif provider in ("cosyvoice", "aliyun", "dashscope"):
|
||
from packages.adapters.tts.cosyvoice_tts_service import CosyVoiceTtsService
|
||
|
||
_PROVIDERS["cosyvoice"] = CosyVoiceTtsService
|
||
_PROVIDERS["aliyun"] = CosyVoiceTtsService
|
||
_PROVIDERS["dashscope"] = CosyVoiceTtsService
|
||
provider = "cosyvoice"
|
||
else:
|
||
logger.warning("未知 TTS provider: %s,回退到 mock", provider)
|
||
from packages.adapters.tts.mock_tts_service import MockTtsService
|
||
|
||
_PROVIDERS["mock"] = MockTtsService
|
||
provider = "mock"
|
||
|
||
cls = _PROVIDERS[provider]
|
||
return cls(**kwargs)
|
||
|
||
|
||
def available_providers() -> list[str]:
|
||
"""获取可用的供应商列表."""
|
||
# 确保 mock 已注册
|
||
if "mock" not in _PROVIDERS:
|
||
from packages.adapters.tts.mock_tts_service import MockTtsService
|
||
|
||
_PROVIDERS["mock"] = MockTtsService
|
||
return list(_PROVIDERS.keys())
|