Compare commits

..

2 Commits

Author SHA1 Message Date
duffyduck 9b5a35cb4a fix: /tts_stream als GET mit Query-Params (war 405 Method Not Allowed)
daswer123 xtts-api-server hat /tts_stream nur als GET:
  allow: GET → POST gab 405 → Request hing.

Umstellung:
- method: 'GET'
- text/language/speaker_wav/stream_chunk_size als URLSearchParams
  im Query-String
- kein body mehr (kein req.write, kein Content-Length)

Ab jetzt echter streaming-Flow: Samples kommen waehrend XTTS noch
rendert, time-to-first-audio ~300-500ms.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 16:52:16 +02:00
duffyduck 5ac1a0a522 revert: XTTS-Endpoint zurueck auf /tts_to_audio/
/tts_stream war bei der aktiven daswer123-Version nicht erreichbar —
Requests hingen stille, App bekam kein Audio.

Zurueck auf /tts_to_audio/ + Queue + 32x AudioTrack-Buffer. Das ist
zwar nicht echt-streaming aber stabil. Ueberlappung sollte durch die
Queue weg sein, Buffer toleriert den bursty Delivery.

Echt-Streaming-Migration spaeter mit verifizierter Server-Version
oder anderem Endpoint.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 16:48:27 +02:00
+11 -17
View File
@@ -195,32 +195,27 @@ async function _runTTSRequest(payload) {
}
/**
* 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.
* Ruft /tts_stream (GET) auf — echter Streaming-Endpoint bei daswer123.
* Samples fliessen waehrend XTTS rendert (chunked transfer).
* Time-to-first-audio ~300-500ms statt 2-4s beim batch-Endpoint.
*
* stream_chunk_size = Characters pro Render-Iteration.
* 40 = guter Kompromiss zwischen Schnellstart und GPU-Effizienz.
* Parameter werden als Query-String uebergeben (GET-API).
*/
function streamXTTSAsPCM(text, language, speakerWav, onPcmChunk) {
return new Promise((resolve, reject) => {
const body = JSON.stringify({
const qs = new URLSearchParams({
text,
language,
speaker_wav: speakerWav || "",
stream_chunk_size: 40,
language: language || "de",
speaker_wav: speakerWav ? speakerWav : "",
stream_chunk_size: "40",
});
const url = new URL(`${XTTS_API_URL}/tts_stream`);
const url = new URL(`${XTTS_API_URL}/tts_stream?${qs.toString()}`);
const options = {
hostname: url.hostname,
port: url.port,
path: url.pathname,
method: "POST",
headers: {
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(body),
},
path: `${url.pathname}?${url.searchParams.toString()}`,
method: "GET",
timeout: 60000,
};
@@ -282,7 +277,6 @@ function streamXTTSAsPCM(text, language, speakerWav, onPcmChunk) {
req.on("error", reject);
req.on("timeout", () => { req.destroy(); reject(new Error("XTTS API Timeout (60s)")); });
req.write(body);
req.end();
});
}