m3ta-chiron 91cd0ec8da feat(provider): Cloud-Provider und Vier-Stufen-Fallback-Kette
- elevenlabs: POST /v1/text-to-speech/{voice}, Header xi-api-key, Body mit
  model_id eleven_multilingual_v2 und voice_settings 0.5/0.75, MP3-Bytes.
- openai: POST /v1/audio/speech, Bearer-Key, Body {model, voice, input,
  response_format:mp3}; Modell konfigurierbar (Default tts-1).
- edge: Microsofts Read-Aloud-WSS-Protokoll nach edge-tts-Referenz,
  inklusive aktuellem DRM Sec-MS-GEC v2 (CS64 + verschleierte SHA-256-
  Variante, wörtlich portiert und gegen Referenzvektoren getestet) und
  MUID-Cookie; bei 403 Uhrenkorrektur aus dem Date-Header + ein Retry.
  Klare Protokoll-geaendert-Fehler statt stiller Fehlfunktion.
- chain: geordnete Kette (elevenlabs -> openai -> edge -> osbuiltin), Pin
  per --provider/config, Available ohne Netz-Calls, Fallback mit
  Protokoll je Stufe (nie still). Chain implementiert Provider UND
  DirectSpeaker: Speak orchestriert Bytes -> Player bzw. Direktansage,
  verwirft am null-Player tonlos — CLI und Daemon (Task 04) nutzen
  dieselbe Kette unverändert.
- voices: neutrale Repo-Defaults je Provider+Sprache (Rachel/alloy/
  Katja/Aria); Rangfolge --voice > config-Mapping > Default. KXxZ… bleibt
  bewusst Privat-Default der eigenen config.toml (Spec: nicht
  Repo-Default).

Tests: Cloud-Provider gegen httptest-Fakes (200/500/401, Request-Vertrag
wörtlich), Edge über Interface + Fehlerpfad-Mocks + Loopback-WSS-Fake
(kein echtes Netz) + als testing.Short überspringbare Integration-
Markierung (TALK_TEST_REAL_EDGE=1, am Dev-Host einmalig ausgeführt:
17136 Bytes echtes Audio). Kette: erster 500 -> zweiter getroffen -> Bytes;
Pin, alle-Stufen-tot, Direktansage mit/ohne null-Player.
2026-10-18 16:34:43 +02:00

talk

Status: WIP — aktive Entwicklung (talk 2.0). Binde Spezifikation: .scratch/talk-2-0/spec.md · Implementierungsplan: .scratch/talk-2-0/plan.md

talk macht Skripte und KI-Agenten hörbar: Ein Aufruf — talk "Build fertig" — spricht eine kurze Nachricht über eine TTS-Provider-Kette (ElevenLabs → OpenAI → Edge-TTS → OS-Stimme), serialisiert durch den Daemon talkd. Cross-platform (Windows/macOS/Linux, amd64/arm64), statische Binaries, keine Runtime-Abhängigkeiten.

Befehle

Befehl Zweck
talk "Text" Ansage — Abkürzung für talk say, non-blocking
talk say "Text" Ansage (Text als Argument oder von stdin)
talk wrap -- <Befehl> Befehl ausführen, Erfolg/Misserfolg + Dauer ansagen
talk mute / talk unmute Ansagen dauerhaft stummschalten / Stummschaltung aufheben
talk status Daemon-Status (Queue, Mute, Provider, Version)
talk cancel laufende und geplante Ansagen abbrechen
talk voices verfügbare Stimmen anzeigen
talk test Test-Ansage ausgeben
talk doctor Selbstdiagnose des Setups
talk setup geführte Ersteinrichtung (Wizard)

Say-Flags (gelten auch für talk "Text"): --wait, --now, --priority, --voice, --lang, --provider.

Hinweis: In diesem Stand ist say (und der Default-Aufruf talk "Text") implementiert — die erste Ansage über OS-TTS (blockierend; Daemon-Anbindung folgt). Alle anderen Befehle sind Stubs und melden not implemented yet (Exit-Code ≠ 0).

OS-TTS auf Linux (Dev-Abhängigkeit espeak)

Der OS-Provider osbuiltin nutzt auf Linux zwei Wege:

  • Audio-Bytes (Wiedergabe über den eingebauten oto-Sink): benötigt espeak (oder espeak-ng). Auf NixOS als Dev-Abhängigkeit: nix shell nixpkgs#espeak-ng.
  • Direktansage ohne espeak: spd-say (speech-dispatcher) — spielt selbst über den Daemon ab, kann aber nach spd-say --help keine Bytes in Dateien/Pipes liefern. talk nutzt diesen Weg automatisch, wenn kein espeak vorhanden ist.

TALK_AUDIO_SINK=null (oder audio.sink = "null" in der config.toml) schaltet jede Tongabe ab — für CI und Server.

Entwicklung

go build ./...   # bauen
go test ./...    # Tests
go vet ./...     # statische Analyse
gofmt -l .       # Formatierung prüfen (leerer Output = ok)

CI: .gitea/workflows/test.yml (Gitea Actions) läuft vet, gofmt-Check, Tests und Build bei jedem Push und Pull Request.

Lizenz

MIT — siehe LICENSE.

S
Description
No description provided
Readme MIT
816 KiB
0 Stars 1 Watchers 0 Forks
talk v0.1.1
Latest
2026-10-25 12:59:59 +01:00
Languages
Go 99.3%
Nix 0.5%
Shell 0.2%