From 9bb90a777a98b75ce9a971ec78e767b5f2736125 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 11 Jul 2026 23:17:04 +0200 Subject: [PATCH] fix(app): Sprachnachricht-Bubble verschwindet nach manuellem Stop nicht mehr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ohne Ohr (manuelle Aufnahme) + Stop-Button: das echte STT-Endpoint (mit Text) fuellt die Bubble, aber danach klappt ein zweites, LEERES stream_end-Endpoint nach (Audio schon transkribiert). Der Empty-Handler loeschte die Bubble bedingungslos per audioRequestId — auch die schon mit Text gefuellte. Ergebnis: Bubble weg, obwohl ARIA an der Antwort arbeitet; erst nach App-Neustart (aus chat_backup) wieder da. Fix: leeres Endpoint entfernt nur noch den NOCH UNAUFGELOESTEN Platzhalter (Text enthaelt 'Spracheingabe wird verarbeitet'), nicht eine bereits aufgeloeste Bubble. Co-Authored-By: Claude Opus 4.8 --- android/src/screens/ChatScreen.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/android/src/screens/ChatScreen.tsx b/android/src/screens/ChatScreen.tsx index 01b6308..463814f 100644 --- a/android/src/screens/ChatScreen.tsx +++ b/android/src/screens/ChatScreen.tsx @@ -1537,9 +1537,15 @@ const ChatScreen: React.FC = () => { } else { // Kein Speech im Window → Konversation beenden console.log('[Chat] STT-Endpoint ohne Text (reason=%s) — endConversation', ev.reason); - // Placeholder-Bubble wieder weg + // NUR den noch UNAUFGELOESTEN Platzhalter entfernen. Nach manuellem Stop + // klappt oft ein zweites, LEERES stream_end-Endpoint nach (das Audio war + // schon vom echten Endpoint transkribiert) — das darf die bereits mit + // dem STT-Text gefuellte Bubble NICHT loeschen, sonst verschwindet die + // Sprachnachricht obwohl ARIA schon an der Antwort arbeitet. if (ev.audioRequestId) { - setMessages(prev => prev.filter(m => m.audioRequestId !== ev.audioRequestId)); + setMessages(prev => prev.filter(m => + !(m.audioRequestId === ev.audioRequestId + && m.text.includes('Spracheingabe wird verarbeitet')))); } // Bei Passive-Listen + speaker_mismatch oder no-speech: erneut passiv // lauschen (Timer im wakeword-service laeuft weiter, regelt das Ende).