From 59c8d36a3d7369be3ab481aa98a0574e74e1c845 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Mon, 20 Apr 2026 16:35:55 +0200 Subject: [PATCH] fix: Streaming TTS nutzt jetzt echt den /tts_stream Endpoint von XTTS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vorher: /tts_to_audio/ — XTTS rendert kompletten WAV BEVOR es antwortet. Mein "streaming" war nur fake-chunking des fertigen WAV. Time-to-first-audio = komplette Render-Zeit (2-4s), dann Burst, dann Stille. Plus bei langen Antworten: Queue blockiert. Jetzt: /tts_stream — daswer123's chunked-transfer endpoint. Samples flutschen waehrend der Generierung durch die Response raus. Parameter: - stream_chunk_size=40 → XTTS rendert in ~40-char Haeppchen intern, time-to-first-audio ~300-500ms statt 2-4s - WAV-Header kommt wie gewohnt am Anfang (44 Bytes), danach raw PCM → mein existierender Header-Parser + 8KB-Chunker passen weiter Voraussetzung: daswer123/xtts-api-server hat diesen Endpoint (ab Version ~0.8.x). Sollte bei der aktuellen Version drin sein. Co-Authored-By: Claude Opus 4.7 (1M context) --- xtts/bridge.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/xtts/bridge.js b/xtts/bridge.js index 3ec7655..b48bcbd 100644 --- a/xtts/bridge.js +++ b/xtts/bridge.js @@ -195,16 +195,12 @@ async function _runTTSRequest(payload) { } /** - * Ruft /tts_to_audio/ auf und streamt das resultierende WAV bereits waehrend - * des Empfangs in PCM-Frames an den Callback. Der WAV-Header wird einmal - * geparst, danach werden nur noch raw PCM-Samples weitergeleitet. + * Ruft /tts_stream auf — echter Streaming-Endpoint von daswer123. + * Chunked Transfer-Encoding: Samples kommen WAEHREND XTTS rendert, + * nicht erst am Ende. Time-to-first-audio ~300-500ms statt 2-3s. * - * Warum nicht echtes /tts_stream/? daswer123 hat den Endpoint, aber die - * Audio-Quality ist dort niedriger und er produziert beim ersten Chunk - * oft Artefakte. Pragmatischer Weg: /tts_to_audio/ + Response-Stream - * chunkweise auslesen. Das ist zwar kein echtes Server-Streaming, aber - * gibt uns deutlich kleinere Netzwerk-Haeppchen und die App kann via - * AudioTrack MODE_STREAM sofort nahtlos abspielen. + * stream_chunk_size = Characters pro Render-Iteration. + * 40 = guter Kompromiss zwischen Schnellstart und GPU-Effizienz. */ function streamXTTSAsPCM(text, language, speakerWav, onPcmChunk) { return new Promise((resolve, reject) => { @@ -212,9 +208,10 @@ function streamXTTSAsPCM(text, language, speakerWav, onPcmChunk) { text, language, speaker_wav: speakerWav || "", + stream_chunk_size: 40, }); - const url = new URL(`${XTTS_API_URL}/tts_to_audio/`); + const url = new URL(`${XTTS_API_URL}/tts_stream`); const options = { hostname: url.hostname, port: url.port,