diff --git a/bridge/aria_bridge.py b/bridge/aria_bridge.py index 3ae635e..5b29890 100644 --- a/bridge/aria_bridge.py +++ b/bridge/aria_bridge.py @@ -544,6 +544,10 @@ class ARIABridge: # STT-Requests die aktuell auf Antwort von der whisper-bridge (Gamebox) warten. # requestId → Future mit dem Text (oder None bei Fehler). self._pending_stt: dict[str, asyncio.Future] = {} + # whisper-bridge service_status: True wenn ready, False/None wenn loading/unbekannt. + # Beeinflusst das Timeout fuer stt_request — bei "loading" warten wir laenger, + # weil das Modell beim ersten Request noch ~1-2 Min runtergeladen werden kann. + self._remote_stt_ready: bool = False def initialize(self) -> None: """Initialisiert alle Komponenten. @@ -1442,13 +1446,30 @@ class ARIABridge: future.set_result(text) return + elif msg_type == "service_status": + # Gamebox-Bridges (whisper / f5tts) melden ihren Lade-Status. + # Wir nutzen das fuer den dynamischen STT-Timeout: solange whisper + # im 'loading' steckt, geben wir der Bridge mehr Zeit (Modell-Download + # kann 1-2 Min dauern), statt nach 45s lokal zu fallbacken. + svc = payload.get("service", "") + state = payload.get("state", "") + if svc == "whisper": + was_ready = self._remote_stt_ready + self._remote_stt_ready = (state == "ready") + if self._remote_stt_ready != was_ready: + logger.info("[rvs] whisper-bridge -> %s", state) + return + else: logger.debug("[rvs] Unbekannter Typ: %s", msg_type) # STT-Orchestrierung: zuerst Remote (Gamebox), Fallback lokal. - # Timeout grosszuegig gewaehlt, damit auch ein erstmaliger Modell-Load - # auf der Gamebox (bis ~30s bei large-v3) durchgeht. - _STT_REMOTE_TIMEOUT_S = 45.0 + # Zwei Timeouts: + # ready=True → 45s reicht selbst fuer lange Audios + # ready=False → 300s, weil das Modell evtl. noch heruntergeladen wird + # (large-v3 ~3GB, kann auf der Gamebox 1-2 Min dauern). + _STT_REMOTE_TIMEOUT_READY_S = 45.0 + _STT_REMOTE_TIMEOUT_LOADING_S = 300.0 async def _process_app_audio(self, audio_b64: str, mime_type: str) -> None: """App-Audio → STT → aria-core. Primaer via whisper-bridge (RVS), Fallback lokal.""" @@ -1514,7 +1535,12 @@ class ARIABridge: if not ok: logger.warning("[rvs] stt_request konnte nicht gesendet werden — skip Remote") return None - return await asyncio.wait_for(future, timeout=self._STT_REMOTE_TIMEOUT_S) + timeout_s = (self._STT_REMOTE_TIMEOUT_READY_S + if self._remote_stt_ready + else self._STT_REMOTE_TIMEOUT_LOADING_S) + logger.info("[rvs] STT-Timeout %ds (whisper-bridge %s)", + int(timeout_s), "ready" if self._remote_stt_ready else "loading") + return await asyncio.wait_for(future, timeout=timeout_s) except asyncio.TimeoutError: logger.warning("[rvs] Remote-STT Timeout (%.0fs)", self._STT_REMOTE_TIMEOUT_S) return None