fix: stream_chunk_size 40 -> 200 gegen Audio-Abbrueche mid-sentence

Bei stream_chunk_size=40 teilte XTTS Text in ~40-char Batches.
Zwischen Batches pausiert XTTS (RTF 1.48 auf RTX 3060 → langsamer
als Realtime-Wiedergabe). AudioTrack-Buffer lief leer, Track
stoppte, nachkommender PCM kam zu spaet → Audio bricht mid-sentence
ab (User-Bug: bei 73-char Text Abbruch nach Wort 'diesmal' was genau
an der 40-char Grenze lag).

stream_chunk_size=200:
- Kurze Saetze (<200 chars) komplett in einem Render → kein Abbruch
- Laengere Texte: groessere Chunks, laenger Audio pro Chunk als
  Render-Pause → Buffer bleibt gefuellt
- Kompromiss: first-audio-latency etwas hoeher, aber keine Abbrueche

Wenn spaeter Audio-Abbrueche bei langen Texten: stream_chunk_size
noch groesser setzen ODER einen "pre-roll" Buffer in der App.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck 2026-04-22 18:06:25 +02:00
parent ee3e0a0af6
commit cd5e6e7ee6
1 changed files with 3 additions and 1 deletions

View File

@ -216,11 +216,13 @@ function streamXTTSAsPCM(text, language, speakerWav, onPcmChunk) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// Wichtig: speaker_wav MUSS als Query-Key dabei sein (Pydantic required) — // Wichtig: speaker_wav MUSS als Query-Key dabei sein (Pydantic required) —
// auch bei default-voice mit leerem Wert. Sonst gibt's HTTP 422. // auch bei default-voice mit leerem Wert. Sonst gibt's HTTP 422.
// stream_chunk_size=200: XTTS rendert groessere Text-Happen, d.h. weniger
// Pausen zwischen Chunks (wenn RTF > 1 ist der Buffer sonst oft leer).
const qs = new URLSearchParams(); const qs = new URLSearchParams();
qs.set("text", text); qs.set("text", text);
qs.set("language", language || "de"); qs.set("language", language || "de");
qs.set("speaker_wav", speakerWav || ""); qs.set("speaker_wav", speakerWav || "");
qs.set("stream_chunk_size", "40"); qs.set("stream_chunk_size", "200");
const url = new URL(XTTS_API_URL); const url = new URL(XTTS_API_URL);
const fullPath = `/tts_stream?${qs.toString()}`; const fullPath = `/tts_stream?${qs.toString()}`;