|
|
|
@@ -1401,7 +1401,11 @@ const ChatScreen: React.FC = () => {
|
|
|
|
|
// Fallback mehr: die Bridge schickt speak zuverlaessig mit.
|
|
|
|
|
// Merken ob nach dem Vorlesen 30s weiterlauschen (Gespraech) oder direkt
|
|
|
|
|
// stoppen — onPlaybackFinished liest converseRef. Default true.
|
|
|
|
|
converseRef.current = (message.payload as any).converse !== false;
|
|
|
|
|
// Passiv-Lauschen (30s) NUR wenn das Brain explizit converse:true schickt.
|
|
|
|
|
// Vorher default true → jeder Befehl (auch "Spiele Spotify" mit gesproche-
|
|
|
|
|
// ner Bestaetigung) landete im 30s-Fenster. Jetzt: einzelne Befehle enden
|
|
|
|
|
// sofort (zurueck aufs Wake-Word), nur echte Gespraeche lauschen weiter.
|
|
|
|
|
converseRef.current = (message.payload as any).converse === true;
|
|
|
|
|
const _isSilent = (message.payload as any).speak === false;
|
|
|
|
|
if (_isSilent && wakeWordService.isConversing()) {
|
|
|
|
|
// Klarer Steuerbefehl (Liedersteuerung etc.) = KEINE Konversation →
|
|
|
|
@@ -2299,6 +2303,9 @@ const ChatScreen: React.FC = () => {
|
|
|
|
|
// forwarded direkt an Brain. Im wake-word-conversing-Fall zusaetzlich
|
|
|
|
|
// endConversation: User hat explizit gestoppt → kein Multi-Turn-Resume.
|
|
|
|
|
const handleVoiceButtonStop = useCallback(async (): Promise<void> => {
|
|
|
|
|
// Manueller Stop = endgueltig: auch die NACH der Antwort kommende
|
|
|
|
|
// onPlaybackFinished darf kein 30s-Passiv-Fenster mehr oeffnen.
|
|
|
|
|
converseRef.current = false;
|
|
|
|
|
// Stop = ALLES beenden, vorhersehbar. Spricht ARIA gerade, hart stoppen +
|
|
|
|
|
// laufende Brain-Antwort abbrechen (sonst "sagt sie ihren letzten Satz").
|
|
|
|
|
if (audioService.isPlayingAudio()) {
|
|
|
|
|