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:
1 parent
b31113d3ff
commit
1789073d23
1 file changed
+16
-1
@@ -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
|
||||
|
||||
Reference in new issue
Block a user