From 73263b69a64df522daa2d05a829d0d63881e5c01 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Wed, 22 Apr 2026 16:47:28 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20/tts=5Fstream=20=E2=80=94=20speaker=5Fwa?= =?UTF-8?q?v=20muss=20IMMER=20als=20query-param=20gesetzt=20sein?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit XTTS-Server (daswer123) markiert speaker_wav als required Pydantic-Feld. Mein 'if (speakerWav) qs.set(...)' hat den Key bei default-voice weggelassen → HTTP 422 'Field required, input: null' → Fallback auf /tts_to_audio/ hat gegriffen, aber Streaming nie gefunden. Log-Beweis vom User: XTTS /tts_stream 422: {"detail":[{"type":"missing","loc":["query", "speaker_wav"],"msg":"Field required","input":null}]} Fix: Key immer setzen, leerer String bei default-voice. POST-Variante (/tts_to_audio/ JSON-Body) hat das auch so akzeptiert — GET-Query nun gleiches Verhalten. Ab jetzt sollte /tts_stream endlich greifen und echte Streaming-Latenz (~300-500ms) zeigen. Co-Authored-By: Claude Opus 4.7 (1M context) --- xtts/bridge.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xtts/bridge.js b/xtts/bridge.js index d2783f5..023925c 100644 --- a/xtts/bridge.js +++ b/xtts/bridge.js @@ -214,10 +214,12 @@ async function _runTTSRequest(payload) { */ function streamXTTSAsPCM(text, language, speakerWav, onPcmChunk) { return new Promise((resolve, reject) => { + // Wichtig: speaker_wav MUSS als Query-Key dabei sein (Pydantic required) — + // auch bei default-voice mit leerem Wert. Sonst gibt's HTTP 422. const qs = new URLSearchParams(); qs.set("text", text); qs.set("language", language || "de"); - if (speakerWav) qs.set("speaker_wav", speakerWav); + qs.set("speaker_wav", speakerWav || ""); qs.set("stream_chunk_size", "40"); const url = new URL(XTTS_API_URL);