2 Commits
5 changed files with 23 additions and 26 deletions
Binary file not shown.
BIN
View File
Binary file not shown.
+2 -1
View File
@@ -2,4 +2,5 @@ fastapi==0.110.0
uvicorn==0.27.1 uvicorn==0.27.1
python-multipart==0.0.9 python-multipart==0.0.9
aiohttp==3.9.3 aiohttp==3.9.3
edge-tts==6.1.9 edge-tts==6.1.9
requests==2.31.0
+14 -7
View File
@@ -372,9 +372,9 @@
<div class="name">🌐 Edge TTS</div> <div class="name">🌐 Edge TTS</div>
<div class="status" id="edgeStatus">检测中...</div> <div class="status" id="edgeStatus">检测中...</div>
</div> </div>
<div class="tts-option disabled" data-provider="chattts"> <div class="tts-option" data-provider="chattts">
<div class="name">🤖 ChatTTS</div> <div class="name">🤖 ChatTTS</div>
<div class="status">暂未部署</div> <div class="status" id="chatttsStatus">检测中...</div>
</div> </div>
</div> </div>
<div class="voice-select" id="voiceSelect" style="display: none;"> <div class="voice-select" id="voiceSelect" style="display: none;">
@@ -490,13 +490,20 @@
// 更新状态 // 更新状态
data.providers.forEach(p => { data.providers.forEach(p => {
if (p.name === 'edge') { const statusElId = p.name === 'edge' ? 'edgeStatus' :
const statusEl = document.getElementById('edgeStatus'); p.name === 'chattts' ? 'chatttsStatus' : null;
if (statusElId) {
const statusEl = document.getElementById(statusElId);
statusEl.textContent = p.available ? '可用 ✓' : '不可用'; statusEl.textContent = p.available ? '可用 ✓' : '不可用';
const optionEl = ttsOptions.querySelector('[data-provider="edge"]'); const optionEl = ttsOptions.querySelector(`[data-provider="${p.name}"]`);
if (p.available) { if (optionEl) {
optionEl.classList.remove('disabled'); if (p.available) {
optionEl.classList.remove('disabled');
} else {
optionEl.classList.add('disabled');
}
} }
} }
}); });
+7 -18
View File
@@ -145,24 +145,13 @@ class ChatTTSProvider(TTSProvider):
"""检查 ChatTTS 是否可用""" """检查 ChatTTS 是否可用"""
if self._available is None: if self._available is None:
try: try:
import aiohttp import requests
import asyncio resp = requests.get(f"{self.CHATTTS_URL}/health", timeout=5)
if resp.status_code == 200:
async def check(): data = resp.json()
try: self._available = data.get("status") == "ok"
async with aiohttp.ClientSession() as session: else:
async with session.get( self._available = False
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: except Exception as e:
logger.warning(f"ChatTTS check failed: {e}") logger.warning(f"ChatTTS check failed: {e}")
self._available = False self._available = False