Fix nakładania się TTS: lock serializuje odtwarzanie odpowiedzi

- _speak() z lockiem (blocking=False): druga odpowiedź nie odtwarza się,
  gdy pierwsza wciąż gra (piper+pw-play)
- zapobiega nakładaniu się głosów dwóch odpowiedzi LLM
This commit is contained in:
pali112 committed 2026-10-21 19:50:49 +02:00
1 parent b31113d3ff
commit 1789073d23
1 file changed
+16 -1
+16 -1
View File
@@ -291,6 +291,7 @@ class XSayATC:
self._record_proc = None
self._ptt_toggled = False # dla trybu "toggle"
self._pending_send = None # tekst do wyslania z glownego watku (po STT)
self._speak_lock = threading.Lock() # serializacja TTS (jedna odpowiedz naraz)
# Sluzba ATC, na ktora bylismy ostatnio nastrojeni (do resetu rozmowy)
self._last_facility = None
@@ -1387,13 +1388,27 @@ class XSayATC:
return env
def _speak(self, text):
"""Synteza mowy (piper) i odtworzenie. Watek roboczy."""
"""Synteza mowy (piper) i odtworzenie. Watek roboczy.
Lock serializuje TTS — inaczej dwie odpowiedzi naraz sie nakladaja
(piper + pw-play z dwoch watkow jednoczesnie)."""
if not self.config.get("tts_enabled", True):
xp.log("[XSayATC] TTS wylaczone.")
return
text = (text or "").strip()
if not text:
return
if not self._speak_lock.acquire(blocking=False):
# Inna odpowiedz wlasnie gra — nie nakladaj, po prostu pomin.
xp.log("[XSayATC] TTS: pomijam (inny komunikat gra)")
return
try:
self._speak_locked(text)
finally:
self._speak_lock.release()
def _speak_locked(self, text):
"""Wlasciwa synteza + odtworzenie (pod lockiem)."""
piper = self.config.get("piper", "/opt/piper-tts/piper")
model = self.config.get("piper_model", "")
import tempfile