2.0 KiB
2.0 KiB
Task 2: Erste Ansage end-to-end (OS-TTS)
Blockiert durch: 01. Liefert: talk "Hallo Welt" spricht über OS-TTS.
internal/langdetect: reine FunktionDetect(text string) string→"de"|"en"(Default"de"); Heuristik: Common-Word-Listen + Umlaute/ß; tischgesteuerte Tests (de/en/gemischt/leer).internal/provider: InterfaceProvidermitName() string,Available(ctx) bool,Synthesize(ctx, text string, lang string) ([]byte, error)(Rückgabe: dekodierbare Audio-Bytes, Format von der Implementierung dokumentiert; osbuiltin liefert WAV/PCM).- Implementierung
osbuiltin: Linux überespeak/speech-dispatcher-Fallback (externer Prozess — OK, es ist der Notnagel-Provider; wenn Binary fehlt:Available() == false), macOS übersay(Ausgabe in temporäre WAV-Datei), Windows über SAPI (PowerShellSystem.Speech). Fehlende Binary/Runtime → klarer Fehler, kein Panik.
- Implementierung
internal/audio:Sink-Interface (Play(ctx, data []byte) error,Name() string); Implementierungenoto(embedded Playback, PCM/WAV) undnull(verwirft, loggt). Auswahl per Configaudio.sink = "oto"|"null"(Defaultoto).internal/config: minimale Auflösung: Defaults + TOML-Datei (falls vorhanden) + Env-Overrides (TALK_AUDIO_SINK); Platform-Pfad-Auflösung (~/.config/talk|~/Library/Application Support/talk|%APPDATA%\talk, respektiveXDG_CONFIG_HOME/Env); tischgesteuerte Unit-Tests für Merge + Pfadlogik (Pfade injizierbar).cmd/talk:say-Pfad implementiert: Text (Arg oder stdin) → langdetect → Providerauswahl (hier: osbuiltin, Kette kommt in Task 03; Struktur so, dass--provider-Flag schon existiert undosbuiltindefault ist) → Synthesize → Sink.Play. Blocking (Daemon kommt in Task 04).- Abnahme:
talk "Hallo Welt"erzeugt hörbare Ausgabe auf dem Dev-Host (Linux; espeak vorhanden oder als Dev-Abhängigkeit dokumentiert);TALK_AUDIO_SINK=nullläuft ohne Ton durch;go test ./...grün (langdetect + config + provider-mit-fake-proc wo sinnvoll).