From b00eec263db8af334afe4cfc3b4adbe1ebd790cb Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 27 Dec 2025 20:50:15 +0100 Subject: [PATCH] dont speak messages with control codes, remove min length message vor words like Ja no etc. --- python_bridge/chat_audio_bridge.py | 70 +++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/python_bridge/chat_audio_bridge.py b/python_bridge/chat_audio_bridge.py index d92caca..91eb522 100755 --- a/python_bridge/chat_audio_bridge.py +++ b/python_bridge/chat_audio_bridge.py @@ -752,34 +752,40 @@ Erst dann starten die automatischen TICKs mit Bildern!""" if self._current_chat_id: self._save_tts_state(self._current_chat_id, msg.id) + # ════════════════════════════════════════════════════════════════ + # WICHTIG: Nachrichten mit Steuercodes werden NICHT vorgelesen! + # Diese sind reine Roboter-Befehle, keine Sprache für Stefan. + # ════════════════════════════════════════════════════════════════ + if self._contains_control_codes(msg.text): + logger.debug(f"TTS: Nachricht enthält Steuercodes, übersprungen") + continue + # Text für Sprache aufbereiten speech_text = self._clean_for_speech(msg.text) logger.debug(f"TTS: Nach Bereinigung: {len(speech_text) if speech_text else 0} Zeichen") - if speech_text and len(speech_text) > 5: - # "Claude sagt:" Prefix entfernen falls vorhanden (wird nicht vorgelesen) - tts_text = speech_text - if tts_text.lower().startswith("claude sagt:"): - tts_text = tts_text[12:].strip() - logger.debug(f"TTS: 'Claude sagt:' entfernt, Rest: {len(tts_text)} Zeichen") + # "Claude sagt:" Prefix entfernen falls vorhanden (wird nicht vorgelesen) + tts_text = speech_text + if tts_text.lower().startswith("claude sagt:"): + tts_text = tts_text[12:].strip() + logger.debug(f"TTS: 'Claude sagt:' entfernt, Rest: {len(tts_text)} Zeichen") - # Prüfe ob nach Entfernen noch Text übrig ist - if not tts_text or len(tts_text) < 3: - logger.debug(f"TTS: Nach Prefix-Entfernung kein Text übrig, übersprungen") - continue + # Prüfe ob nach Entfernen noch Text übrig ist + # Kein Mindestlänge-Check damit auch kurze Antworten wie "Ja!" gesprochen werden + if not tts_text: + logger.debug(f"TTS: Nach Prefix-Entfernung kein Text übrig, übersprungen") + continue - # In Konsole anzeigen (ohne Prefix) - console.print(f"\n[bold blue]Claude:[/bold blue] {tts_text[:200]}") - if len(tts_text) > 200: - console.print(f"[dim]...({len(tts_text)} Zeichen)[/dim]") + # In Konsole anzeigen (ohne Prefix) + console.print(f"\n[bold blue]Claude:[/bold blue] {tts_text[:200]}") + if len(tts_text) > 200: + console.print(f"[dim]...({len(tts_text)} Zeichen)[/dim]") - # Vorlesen (ohne "Claude sagt:" - das ist ja klar) - logger.info(f"TTS: Spreche {len(tts_text)} Zeichen...") - self.tts.speak(tts_text) - self.stats.messages_spoken += 1 - logger.debug("TTS: Sprechen beendet") - else: - logger.debug(f"TTS: Text zu kurz oder leer, übersprungen") + # Vorlesen (ohne "Claude sagt:" - das ist ja klar) + logger.info(f"TTS: Spreche {len(tts_text)} Zeichen...") + self.tts.speak(tts_text) + self.stats.messages_spoken += 1 + logger.debug("TTS: Sprechen beendet") else: logger.debug(f"TTS: Nachricht ist nicht von Claude, übersprungen") @@ -1019,6 +1025,28 @@ Erst dann starten die automatischen TICKs mit Bildern!""" with self._mute_lock: return self._muted + def _contains_control_codes(self, text: str) -> bool: + """ + Prüft ob der Text Steuercodes enthält. + + Nachrichten MIT Steuercodes sind reine Roboter-Befehle + und sollen NICHT vorgelesen werden. + + Steuercodes: + - [FORWARD], [BACKWARD], [LEFT], [RIGHT], [STOP] - Fahrbefehle + - [LOOK_LEFT], [LOOK_RIGHT], [LOOK_UP], [LOOK_DOWN], [LOOK_CENTER] - Kamera + - [READY], [TICK], [START] - System-Marker + """ + control_codes = [ + '[FORWARD]', '[BACKWARD]', '[LEFT]', '[RIGHT]', '[STOP]', + '[LOOK_LEFT]', '[LOOK_RIGHT]', '[LOOK_UP]', '[LOOK_DOWN]', '[LOOK_CENTER]', + '[READY]', '[TICK]', '[START]' + ] + for code in control_codes: + if code in text: + return True + return False + def _clean_for_speech(self, text: str) -> str: """ Entfernt Befehle und technische Teile aus dem Text.