""" TTS 服务集成模块 提供高层 TTS 服务接口,直接使用配置文件中的 TTS 设置。 """ from io import BytesIO from typing import Optional from config.settings import settings from tts.factory import TTSEngineFactory from tts.base import TTSEngine from utils.logger import logger class TTSService: """ TTS 服务 提供统一的 TTS 调用接口,自动使用配置文件中的引擎和参数。 """ _engine: Optional[TTSEngine] = None @classmethod def _get_engine(cls) -> TTSEngine: """ 获取 TTS 引擎实例 Returns: TTSEngine 实例 """ if cls._engine is None: cls._engine = TTSEngineFactory.create(settings.TTS_ENGINE) logger.info( f"TTS Service initialized with engine: {settings.TTS_ENGINE}" ) return cls._engine @classmethod async def synthesize( cls, text: str, language: Optional[str] = None, voice: Optional[str] = None, rate: Optional[float] = None, pitch: Optional[float] = None, ) -> BytesIO: """ 将文本合成为语音 Args: text: 要合成的文本 language: 语言代码,默认使用配置文件中的 TTS_LANGUAGE voice: 声音 ID,默认使用配置文件中的 TTS_VOICE rate: 语速,默认使用配置文件中的 TTS_RATE pitch: 音调,默认使用配置文件中的 TTS_PITCH Returns: BytesIO 对象,包含合成后的音频数据 """ engine = cls._get_engine() # 使用配置文件中的默认值 language = language or settings.TTS_LANGUAGE voice = voice or settings.TTS_VOICE or None rate = rate or settings.TTS_RATE pitch = pitch or settings.TTS_PITCH logger.debug(f"Synthesizing text with TTS Service: {text[:50]}...") return await engine.synthesize( text=text, language=language, voice=voice, rate=rate, pitch=pitch, ) @classmethod async def get_supported_voices(cls, language: Optional[str] = None) -> list[dict]: """ 获取支持的声音列表 Args: language: 语言代码,默认使用配置文件中的 TTS_LANGUAGE Returns: 声音列表 """ engine = cls._get_engine() language = language or settings.TTS_LANGUAGE return await engine.get_supported_voices(language) @classmethod def get_engine_info(cls) -> dict: """ 获取当前 TTS 引擎信息 Returns: 包含引擎名称、版本、当前配置等信息的字典 """ engine = cls._get_engine() return { "engine_name": engine.get_engine_name(), "engine_version": engine.get_engine_version(), "config": { "language": settings.TTS_LANGUAGE, "voice": settings.TTS_VOICE or "default", "rate": settings.TTS_RATE, "pitch": settings.TTS_PITCH, }, } @classmethod def reset_engine(cls) -> None: """重置 TTS 引擎实例(仅在切换引擎时需要调用)""" cls._engine = None TTSEngineFactory.clear_instances() logger.info("TTS Service engine reset")