fix: /tts_stream — speaker_wav muss IMMER als query-param gesetzt sein

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) <noreply@anthropic.com>
This commit is contained in:
duffyduck 2026-04-22 16:47:28 +02:00
parent c62ceafdc2
commit 73263b69a6
1 changed files with 3 additions and 1 deletions

View File

@ -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);