fix: Streaming TTS — Queue in XTTS-Bridge + groesserer Android-Buffer
1) Ueberlappende Streams Wenn zwei xtts_requests schnell hintereinander kamen, rannten sie parallel durch handleTTSRequest. Beide HTTP-Requests an XTTS liefen gleichzeitig, beide streamen PCM an App → Chunks aus BEIDEN Renders landeten interleaved in der AudioTrack-Queue → Chaos. Fix: ttsQueue als Promise-Chain — handleTTSRequest() haengt sich ans Ende der Kette an. Requests werden sequenziell abgearbeitet. 2) AudioTrack-Buffer zu klein fuer bursty Delivery XTTS /tts_to_audio/ ist NICHT echt streaming — der Server rendert intern den kompletten WAV und schickt ihn dann burst-weise. Der alte 8x-MinBuffer (ca 200-400ms) war zu klein um das abzufangen. Fix: Buffer auf 32x MinSize / mind. 128KB = ca. 2.7s bei 24kHz. Das toleriert typische XTTS-Render-Latenz. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+14
-1
@@ -95,7 +95,20 @@ function connectRVS(forcePlain) {
|
||||
|
||||
// ── TTS Request Handler ─────────────────────────────
|
||||
|
||||
async function handleTTSRequest(payload) {
|
||||
// ── TTS-Queue ──────────────────────────────────────
|
||||
// XTTS verarbeitet Requests sequenziell, damit Streams sich nicht ueberlappen.
|
||||
// Ohne Queue wuerden parallele Requests parallel streamen → App bekommt
|
||||
// interleaved PCM-Chunks aus zwei Rendern → klingt wie Chaos.
|
||||
let ttsQueue = Promise.resolve();
|
||||
|
||||
function handleTTSRequest(payload) {
|
||||
ttsQueue = ttsQueue.then(() => _runTTSRequest(payload)).catch(err => {
|
||||
log(`TTS-Queue Fehler: ${err.message}`);
|
||||
});
|
||||
return ttsQueue;
|
||||
}
|
||||
|
||||
async function _runTTSRequest(payload) {
|
||||
const { text, voice, requestId, language, messageId } = payload;
|
||||
if (!text) return;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user