fix(app): verlorene Aufnahme sichtbar machen statt still zu loeschen
Beweis aus den Logs: die Whisper-Bridge startete MITTEN in der ersten Aufnahme
neu (stream.start 16:35:43 -> boot 16:36:02), damit war die Sitzung weg. Die App
fiel in den 3s-Fallback (reason=...no-response) und entfernte die Bubble
kommentarlos — fuer den Nutzer sah es aus, als waere nie etwas gesendet worden.
Jetzt wird bei 'no-response' die Platzhalter-Bubble durch einen Hinweis ersetzt
('Aufnahme ging verloren — Spracherkennung war nicht erreichbar'). Der stille
no-speech-Fall (Du hast wirklich nichts gesagt) bleibt wie bisher. tsc: 0 Fehler.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1802,9 +1802,20 @@ const ChatScreen: React.FC = () => {
|
|||||||
// dem STT-Text gefuellte Bubble NICHT loeschen, sonst verschwindet die
|
// dem STT-Text gefuellte Bubble NICHT loeschen, sonst verschwindet die
|
||||||
// Sprachnachricht obwohl ARIA schon an der Antwort arbeitet.
|
// Sprachnachricht obwohl ARIA schon an der Antwort arbeitet.
|
||||||
if (ev.audioRequestId) {
|
if (ev.audioRequestId) {
|
||||||
setMessages(prev => prev.filter(m =>
|
// 'no-response' heisst: die Spracherkennung hat GAR NICHT geantwortet
|
||||||
!(m.audioRequestId === ev.audioRequestId
|
// (Worker neu gestartet / nicht erreichbar) — die Aufnahme ist also
|
||||||
&& m.text.includes('Spracheingabe wird verarbeitet'))));
|
// wirklich verloren gegangen, Du hast nicht etwa nichts gesagt. Das
|
||||||
|
// zeigen wir an, statt die Bubble stillschweigend zu entfernen; sonst
|
||||||
|
// wirkt es, als waere die Nachricht nie gesendet worden.
|
||||||
|
const lost = String(ev.reason || '').includes('no-response');
|
||||||
|
setMessages(prev => lost
|
||||||
|
? prev.map(m => (m.audioRequestId === ev.audioRequestId
|
||||||
|
&& m.text.includes('Spracheingabe wird verarbeitet'))
|
||||||
|
? { ...m, text: '⚠️ Aufnahme ging verloren — die Spracherkennung war gerade nicht erreichbar. Bitte nochmal aufnehmen.' }
|
||||||
|
: m)
|
||||||
|
: prev.filter(m =>
|
||||||
|
!(m.audioRequestId === ev.audioRequestId
|
||||||
|
&& m.text.includes('Spracheingabe wird verarbeitet'))));
|
||||||
}
|
}
|
||||||
// Passiv-Lauschen: leeres Endpoint (no-speech / Silero-Musik / speaker_
|
// Passiv-Lauschen: leeres Endpoint (no-speech / Silero-Musik / speaker_
|
||||||
// mismatch). NICHT sofort beenden — solange die Stille-Toleranz ab
|
// mismatch). NICHT sofort beenden — solange die Stille-Toleranz ab
|
||||||
|
|||||||
Reference in New Issue
Block a user