feat(audio): Wake-Word parallel zu TTS mit AcousticEchoCanceler
Du kannst jetzt "Computer" sagen waehrend ARIA noch redet — TTS verstummt, neue Aufnahme startet. Vorher musste man warten oder manuell den Voice-Button tappen. Native (OpenWakeWordModule.kt): - AudioRecord-Source von MIC auf VOICE_COMMUNICATION (aktiviert auf den meisten Geraeten Echo-Cancellation + Noise-Suppression) - Zusaetzlich AcousticEchoCanceler/NoiseSuppressor/AutomaticGainControl explizit aktiviert wenn vorhanden — robuster auf Geraeten wo die VOICE_COMMUNICATION-Source die Effects nicht automatisch mitbringt - releaseAudioEffects() im stop/dispose JS (wakeword.ts): - Neue API: startBargeListening / stopBargeListening — Wake-Word parallel aktivieren, ohne den State 'conversing' zu verlassen - onWakeDetected unterscheidet jetzt: in 'conversing' → barge-in- Callback (nicht der normale wake-callback). Sonst Standard-Pfad. - onBargeIn-Subscriber-API + isBargeListening-Getter Lifecycle-Wiring (audio.ts + ChatScreen): - audioService.onPlaybackStarted callback (neu) - ChatScreen: Bei TTS-Start → wakeWord.startBargeListening - ChatScreen: Bei TTS-Ende → wakeWord.stopBargeListening (sonst kein AudioRecord fuer die naechste Aufnahme) - ChatScreen: Bei BargeIn → haltAllPlayback + cancel_request + 150ms-Pause + neue Aufnahme starten issue.md + README aktualisiert. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -545,9 +545,43 @@ const ChatScreen: React.FC = () => {
|
||||
}
|
||||
});
|
||||
|
||||
// Barge-In via Wake-Word: User sagt "Computer" waehrend ARIA spricht.
|
||||
// Wake-Word-Service hat bei TTS-Start parallel zu lauschen begonnen
|
||||
// (mit AcousticEchoCanceler damit ARIAs eigene Stimme nicht triggert).
|
||||
const unsubBarge = wakeWordService.onBargeIn(async () => {
|
||||
console.log('[Chat] Barge-In via Wake-Word — TTS abbrechen + neue Aufnahme');
|
||||
audioService.haltAllPlayback('barge-in via wake-word');
|
||||
setAgentActivity({ activity: 'idle', tool: '' });
|
||||
rvs.send('cancel_request' as any, {});
|
||||
// Kurze Pause damit halt durchgreift, dann neue Aufnahme starten
|
||||
await new Promise(r => setTimeout(r, 150));
|
||||
const windowMs = await loadConvWindowMs();
|
||||
const started = await audioService.startRecording(true, windowMs);
|
||||
if (started) {
|
||||
ToastAndroid.show('🎤 Mikro offen — sprich jetzt', ToastAndroid.SHORT);
|
||||
playWakeReadySound().catch(() => {});
|
||||
}
|
||||
});
|
||||
|
||||
// TTS-Lifecycle: solange ARIA spricht und Wake-Word verfuegbar ist,
|
||||
// parallel mitlauschen — User kann "Computer" sagen statt manuell tappen.
|
||||
const unsubTtsStart = audioService.onPlaybackStarted(() => {
|
||||
if (wakeWordService.isConversing() && wakeWordService.hasWakeWord()) {
|
||||
wakeWordService.startBargeListening().catch(() => {});
|
||||
}
|
||||
});
|
||||
const unsubTtsEnd = audioService.onPlaybackFinished(() => {
|
||||
// Vor naechster Aufnahme: barge-listening aus damit der AudioRecorder
|
||||
// das Mikro greifen kann.
|
||||
wakeWordService.stopBargeListening().catch(() => {});
|
||||
});
|
||||
|
||||
return () => {
|
||||
unsubWake();
|
||||
unsubSilence();
|
||||
unsubBarge();
|
||||
unsubTtsStart();
|
||||
unsubTtsEnd();
|
||||
};
|
||||
}, [wakeWordActive]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user