From 4e394888b0fb578703447784302f44ea40a1b639 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sun, 28 Dec 2025 23:59:07 +0100 Subject: [PATCH] fix tts clearing --- python_bridge/chat_audio_bridge.py | 42 +++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/python_bridge/chat_audio_bridge.py b/python_bridge/chat_audio_bridge.py index b47fa6f..3fb34e1 100755 --- a/python_bridge/chat_audio_bridge.py +++ b/python_bridge/chat_audio_bridge.py @@ -658,10 +658,23 @@ Erst dann starten die automatischen TICKs mit Bildern!""" if self._awaiting_tts.is_set(): logger.info("Heartbeat: Warte auf TTS (Nachricht wurde gesendet)...") - # Warte bis TTS komplett fertig ist (kein Timeout!) + # Warte bis TTS komplett fertig ist (mit Timeout als Fallback!) + # Timeout verhindert dass Heartbeat ewig hängt wenn TTS die + # Nachricht nicht findet (z.B. bei ID-Mismatch oder nur Steuercodes) + tts_wait_start = time.time() + tts_timeout = 30.0 # Maximal 30 Sekunden warten + while self.running and self._awaiting_tts.is_set(): if self._speaking.is_set(): logger.debug("Heartbeat: Claude spricht gerade...") + + # Timeout-Check + if time.time() - tts_wait_start > tts_timeout: + logger.warning(f"Heartbeat: TTS-Timeout nach {tts_timeout}s - fahre trotzdem fort") + console.print("[yellow]⚠️ TTS-Timeout - Nachricht evtl. nicht vorgelesen[/yellow]") + self._awaiting_tts.clear() # Forciere Weiterfahren + break + time.sleep(0.5) logger.info("Heartbeat: TTS fertig, fahre fort") @@ -831,6 +844,8 @@ Erst dann starten die automatischen TICKs mit Bildern!""" # Marker ob wir die ID beim ersten Durchlauf synchronisieren müssen needs_id_sync = True + # Zähler für leere Polls während _awaiting_tts gesetzt ist + empty_polls_while_awaiting = 0 while self.running: try: @@ -841,6 +856,7 @@ Erst dann starten die automatischen TICKs mit Bildern!""" # Debug: Zeige was wir suchen und was wir finden if messages: logger.info(f"TTS: {len(messages)} neue Nachrichten (since={current_since_id})") + empty_polls_while_awaiting = 0 # Reset bei Erfolg # ════════════════════════════════════════════════════════════════ # Bei leerem Ergebnis: Prüfe ob wir die ID synchronisieren müssen @@ -858,6 +874,30 @@ Erst dann starten die automatischen TICKs mit Bildern!""" console.print("[dim]TTS: Position synchronisiert, warte auf neue Nachrichten[/dim]") needs_id_sync = False # Nur einmal pro Session + # ════════════════════════════════════════════════════════════════ + # FALLBACK: Wenn wir auf TTS warten aber keine Nachrichten finden, + # nach einigen Versuchen die ID neu synchronisieren und _awaiting_tts + # clearen damit Heartbeat nicht ewig hängt. + # ════════════════════════════════════════════════════════════════ + if not messages and self._awaiting_tts.is_set(): + empty_polls_while_awaiting += 1 + logger.debug(f"TTS: Keine Nachrichten gefunden, awaiting_tts gesetzt (Versuch {empty_polls_while_awaiting}/20)") + + if empty_polls_while_awaiting >= 20: # Nach ca. 10 Sekunden (20 * 0.5s) + logger.warning("TTS: Keine Nachricht gefunden nach 10s - synchronisiere ID neu") + last_msg = self.chat.get_last_assistant_message() + if last_msg: + old_id = self.last_assistant_message_id + self.last_assistant_message_id = last_msg.id + if self._current_chat_id: + self._save_tts_state(self._current_chat_id, last_msg.id) + logger.info(f"TTS: Notfall-Sync (alt: {old_id[:20] if old_id else 'None'}... -> neu: {last_msg.id[:20]}...)") + # _awaiting_tts clearen damit Heartbeat weitermachen kann + self._awaiting_tts.clear() + logger.info("TTS: _awaiting_tts.clear() (Notfall-Timeout)") + console.print("[yellow]⚠️ TTS: Nachricht nicht gefunden - übersprungen[/yellow]") + empty_polls_while_awaiting = 0 + if messages: logger.debug(f"TTS: {len(messages)} neue Nachrichten gefunden") needs_id_sync = False # Erfolgreich gefunden, kein Sync nötig