feat(queue): TTS-Abspiel-Queue — back-to-back-Antworten sprechen nacheinander
Bisher war die serialisierte Sprachausgabe zweier fast gleichzeitig fertiger Antworten Timing-Glueck: PcmStreamPlayer.start() ruft stopInternal() (flush+ release), eine neue Antwort haette die laufende also abgeschnitten, sobald ihr Audio waehrend der Wiedergabe der ersten ankam. Jetzt echte Abspiel-Queue im audioService: kommt eine neue HOERBARE Antwort waehrend eine andere noch hoerbar spielt (pcmAudiblePlaying bis PcmPlaybackFinished, nicht nur bis Stream-Ende), werden ihre PCM-Chunks gepuffert und erst nach dem Drain der laufenden nachgespielt. Bei wartender Antwort meldet PcmPlaybackFinished NICHT 'fertig' (kein Wake-Word-Re-Arm). Harter Stop/Barge-In/Mute verwirft die Queue. Race gegen gleichzeitige Chunks einer dritten Antwort geschlossen (Flags vor await gesetzt). onPcmCached meldet den WAV-Pfad nachgespielter Antworten fuer Mund-Button-Replay. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1731,6 +1731,13 @@ const ChatScreen: React.FC = () => {
|
||||
// das Mikro greifen kann.
|
||||
wakeWordService.stopBargeListening().catch(() => {});
|
||||
});
|
||||
// Aus der TTS-Queue nachgespielte (zweite) Antwort: ihren WAV-Cache-Pfad an
|
||||
// die Bubble haengen, damit der Mund-Button/Play sie auch abspielen kann.
|
||||
const unsubPcmCached = audioService.onPcmCached((messageId, audioPath) => {
|
||||
if (!messageId || !audioPath) return;
|
||||
setMessages(prev => prev.map(m =>
|
||||
m.messageId === messageId ? { ...m, audioPath } : m));
|
||||
});
|
||||
|
||||
return () => {
|
||||
unsubWake();
|
||||
@@ -1739,6 +1746,7 @@ const ChatScreen: React.FC = () => {
|
||||
unsubPassive();
|
||||
unsubTtsStart();
|
||||
unsubTtsEnd();
|
||||
unsubPcmCached();
|
||||
};
|
||||
}, [wakeWordActive]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user