Cleanup: nur noch ElevenLabs + Edge (Chatterbox/Piper/Referenz-Upload raus); EL-Library-Voices gefiltert

Ursache des Dauerfehlers: "Standardstimme" = Rachel = Library-Voice → Free-Tier verbietet die per API
(402). Fix: /voices liefert bei ElevenLabs NUR eigene Stimmen (category!=premade); Picker wählt
automatisch die erste echte Stimme (nie leer/Standardstimme). UI auf 2 Engines reduziert (EL premium +
Edge gratis), Default-Engine = elevenlabs. Chatterbox/Piper aus /voices+/health entfernt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-28 02:15:27 +02:00
parent dd4c4c8c0f
commit 15d5598eec
6 changed files with 221 additions and 254 deletions
+9 -6
View File
@@ -265,9 +265,12 @@ def elevenlabs_list() -> list[dict]:
req = urllib.request.Request("https://api.elevenlabs.io/v1/voices", headers={"xi-api-key": key})
with urllib.request.urlopen(req, timeout=10) as r:
data = json.loads(r.read())
# NUR eigene Stimmen (generated/cloned/professional) — Library-/premade-Stimmen sperrt das
# Free-Tier per API (402). So landet im Picker nie eine unbrauchbare Stimme.
return [
{"engine": "elevenlabs", "id": v["voice_id"], "label": v.get("name", v["voice_id"]), "clonable": False}
{"engine": "elevenlabs", "id": v["voice_id"], "label": v.get("name", v["voice_id"])}
for v in data.get("voices", [])
if v.get("category") != "premade"
]
except Exception: # noqa: BLE001
log.warning("ElevenLabs-Stimmenliste fehlgeschlagen", exc_info=True)
@@ -356,15 +359,15 @@ class TTSIn(BaseModel):
@app.get("/health")
def health() -> dict:
return {"ok": True, "stt_model": STT_MODEL,
"engines": ["edge", "piper", "chatterbox", "elevenlabs"],
"elevenlabs_key": bool(_eleven_key()),
"piper_voices": [v["id"] for v in piper_list()]}
"engines": ["elevenlabs", "edge"],
"elevenlabs_key": bool(_eleven_key())}
@app.get("/voices")
def voices() -> dict:
return {"voices": edge_list() + piper_list() + chatterbox_list() + elevenlabs_list(),
"default": {"engine": "piper", "voice": PIPER_DEFAULT}}
# Nur die genutzten Engines: ElevenLabs (eigene Stimme) + Edge (gratis, nativ-deutsch).
return {"voices": elevenlabs_list() + edge_list(),
"default": {"engine": "edge", "voice": EDGE_DEFAULT}}
@app.post("/stt")