fix tts clearing

This commit is contained in:
duffyduck 2025-12-28 23:59:07 +01:00
parent 72008cf97a
commit 4e394888b0
1 changed files with 41 additions and 1 deletions

View File

@ -658,10 +658,23 @@ Erst dann starten die automatischen TICKs mit Bildern!"""
if self._awaiting_tts.is_set(): if self._awaiting_tts.is_set():
logger.info("Heartbeat: Warte auf TTS (Nachricht wurde gesendet)...") 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(): while self.running and self._awaiting_tts.is_set():
if self._speaking.is_set(): if self._speaking.is_set():
logger.debug("Heartbeat: Claude spricht gerade...") 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) time.sleep(0.5)
logger.info("Heartbeat: TTS fertig, fahre fort") 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 # Marker ob wir die ID beim ersten Durchlauf synchronisieren müssen
needs_id_sync = True needs_id_sync = True
# Zähler für leere Polls während _awaiting_tts gesetzt ist
empty_polls_while_awaiting = 0
while self.running: while self.running:
try: try:
@ -841,6 +856,7 @@ Erst dann starten die automatischen TICKs mit Bildern!"""
# Debug: Zeige was wir suchen und was wir finden # Debug: Zeige was wir suchen und was wir finden
if messages: if messages:
logger.info(f"TTS: {len(messages)} neue Nachrichten (since={current_since_id})") 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 # 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]") console.print("[dim]TTS: Position synchronisiert, warte auf neue Nachrichten[/dim]")
needs_id_sync = False # Nur einmal pro Session 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: if messages:
logger.debug(f"TTS: {len(messages)} neue Nachrichten gefunden") logger.debug(f"TTS: {len(messages)} neue Nachrichten gefunden")
needs_id_sync = False # Erfolgreich gefunden, kein Sync nötig needs_id_sync = False # Erfolgreich gefunden, kein Sync nötig