2.1 KiB
2.1 KiB
Task 3: Provider-Kette mit Cloud-Anbietern
Blockiert durch: 02. Liefert: Vier-Stufen-Fallback mit Keys + Fake-barkeit.
- Provider-Implementierungen (je
internal/provider/<name>):elevenlabs: POST<endpoint>/v1/text-to-speech/<voiceID>, Headerxi-api-key, Body{text, model_id: "eleven_multilingual_v2", voice_settings:{stability:0.5,similarity_boost:0.75}}, Antwort = Audio-Bytes (mp3). Key:TALK_ELEVENLABS_KEY; Default-Voice-IDKXxZd16DiBqt82nbarJx. Endpunkt konfigurierbar (Defaulthttps://api.elevenlabs.io).openai: POST<endpoint>/v1/audio/speech, Bearer-KeyTALK_OPENAI_KEY, Body{model:"gpt-4o-mini-tts"|"tts-1", voice, input, response_format:"mp3"}— Entscheidungsnotiz: Modell-String konfigurierbar, Defaulttts-1. Endpunkt Defaulthttps://api.openai.com.edge: Microsoft Edge-TTS-Endpunkt (kostenlos, kein Key) — WebSocket/REST nach aktuellem bekannten Protokoll (edge-tts-kompatibel, Stimmen z. B.de-DE-KatjaNeural/en-US-AriaNeural); Endpunkt konfigurierbar; bei Protokoll-Änderung: klarer Fehler.osbuiltin: existiert (Task 02).
- Kette
internal/provider/chain.go: Resolver liefert geordnete Kette laut Config (Default-Reihenfolge oben);--provider-Flag undprovider = "…"-Config pinnen;Available()prüft Key/Endpunkt; Synthesize fällt bei Fehler (HTTP != 2xx, Timeout, Netz) auf den nächsten durch; letzter Fehler wird geloggt/gemeldet, nie still. - Voice-Mapping:
voice.<provider>.<lang>aus config.toml; Defaults je Provider+Sprache hinterlegt (neutral, dokumentiert). - Tests: jeder Cloud-Provider gegen
httptest-Fake (200 mit Bytes; 500 → Fehler; 401 → Fehler) außer edge (WebSocket-Protokoll — edge wird über Interface + Fehlerpfad-Mock und eine alstesting.Shortüberspringbare Integration-Testmarkierung behandelt; Dokumentationspflicht im Report, welche Teile fake-bar getestet sind); Kettentests: erster 500 → zweiter getroffen → Bytes. - Abnahme:
talk "Test" --provider=elevenlabsmit echtem Key funktioniert am Dev-Host ( einmalig manuell, im Report dokumentiert); ohne jeden Key wählt die Kette edge bzw. osbuiltin;go test ./...grün.