diff --git a/__pycache__/tts_service.cpython-310.pyc b/__pycache__/tts_service.cpython-310.pyc index f9b665b..81dcc0d 100644 Binary files a/__pycache__/tts_service.cpython-310.pyc and b/__pycache__/tts_service.cpython-310.pyc differ diff --git a/audio_cache/17aeba5b5a9e4593bd4b385cace035cf.mp3 b/audio_cache/17aeba5b5a9e4593bd4b385cace035cf.mp3 new file mode 100644 index 0000000..6f410f7 Binary files /dev/null and b/audio_cache/17aeba5b5a9e4593bd4b385cace035cf.mp3 differ diff --git a/audio_cache/94e455ca455f44e9914ebf6125fc3264.mp3 b/audio_cache/94e455ca455f44e9914ebf6125fc3264.mp3 new file mode 100644 index 0000000..fd03562 Binary files /dev/null and b/audio_cache/94e455ca455f44e9914ebf6125fc3264.mp3 differ diff --git a/audio_cache/d294e0f73aff47c7ac66dd96808b4161.mp3 b/audio_cache/d294e0f73aff47c7ac66dd96808b4161.mp3 new file mode 100644 index 0000000..8d8c20f Binary files /dev/null and b/audio_cache/d294e0f73aff47c7ac66dd96808b4161.mp3 differ diff --git a/logs/server.log b/logs/server.log index b2a6182..6d7db33 100644 Binary files a/logs/server.log and b/logs/server.log differ diff --git a/tts_service.py b/tts_service.py index f2fd857..c01aa66 100644 --- a/tts_service.py +++ b/tts_service.py @@ -108,32 +108,70 @@ class EdgeTTSProvider(TTSProvider): class ChatTTSProvider(TTSProvider): - """ChatTTS 提供者(本地部署,预留接口)""" + """ChatTTS 提供者(本地部署)""" - # 预留配置 - CHATTTS_URL = os.getenv("CHATTTS_URL", "http://localhost:19020") + # ChatTTS 服务地址 + CHATTTS_URL = os.getenv("CHATTTS_URL", "http://192.168.2.5:12002") def __init__(self): - self._available = False # 暂不可用 + self._available = None async def synthesize(self, text: str) -> Tuple[str, str]: - """ - 使用 ChatTTS 合成语音 - TODO: 后续实现 - """ - raise NotImplementedError("ChatTTS 尚未实现,请先部署 ChatTTS 服务") + """使用 ChatTTS 合成语音""" + import aiohttp + + async with aiohttp.ClientSession() as session: + form = aiohttp.FormData() + form.add_field('text', text) + + async with session.post( + f"{self.CHATTTS_URL}/synthesize", + data=form, + timeout=aiohttp.ClientTimeout(total=60) + ) as resp: + if resp.status != 200: + error = await resp.text() + raise Exception(f"ChatTTS error: {error}") + + data = await resp.json() + # ChatTTS 返回的 URL 是相对路径,需要拼接 + audio_url = f"{self.CHATTTS_URL}{data['audio_url']}" + return None, audio_url def get_name(self) -> str: return "ChatTTS" def is_available(self) -> bool: """检查 ChatTTS 是否可用""" - # TODO: 后续实现检测逻辑 + if self._available is None: + try: + import aiohttp + import asyncio + + async def check(): + try: + async with aiohttp.ClientSession() as session: + async with session.get( + f"{self.CHATTTS_URL}/health", + timeout=aiohttp.ClientTimeout(total=5) + ) as resp: + if resp.status == 200: + data = await resp.json() + return data.get("status") == "ok" + except: + pass + return False + + self._available = asyncio.get_event_loop().run_until_complete(check()) + except Exception as e: + logger.warning(f"ChatTTS check failed: {e}") + self._available = False return self._available - def set_available(self, available: bool): - """设置可用状态(部署后调用)""" - self._available = available + def set_url(self, url: str): + """设置服务地址""" + self.CHATTTS_URL = url + self._available = None # 重新检测 class NoTTSProvider(TTSProvider):