Files
meme/tts/service.py
2025-11-28 20:27:10 +08:00

120 lines
3.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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")