diff --git a/xtts/voxtral/bridge.py b/xtts/voxtral/bridge.py index e1d2a1c..47d67f9 100644 --- a/xtts/voxtral/bridge.py +++ b/xtts/voxtral/bridge.py @@ -428,6 +428,17 @@ class SessionManager: }) else: self._update_noise_floor(sess, rms) + # No-Speech-Timeout: wurde die GANZE Zeit KEINE Stimme erkannt + # (last_voice_at==0), feuert der normale Endpoint unten NIE — der braucht + # last_voice_at>0. Ohne das bleibt ein reines Stille-Fenster offen bis + # Hardcap/manuellem Stop → genau Stefans Repro: "die Stille-Ende wird nie + # erreicht, stop ich selbst ist es weg". Nach endpoint_ms Stille ab Start + # schliessen wir das Fenster selbst als no-speech (leer, lautlos, zurueck + # aufs Wake-Word). voiced_frames==0 → _finalize verwirft ohne Transkript, + # also KEIN Phantom. + if sess.last_voice_at == 0 and (now - sess.started_at) * 1000.0 >= sess.endpoint_ms: + await self._finalize(sess, "no_speech") + return # Endpoint: hat der User schon gesprochen UND ist es seit endpoint_ms still? if sess.last_voice_at > 0 and (now - sess.last_voice_at) * 1000.0 >= sess.endpoint_ms: await self._finalize(sess, "endpoint")