feat(audio): mp3 dekodieren für Cloud-Provider (reiner Go-Dekoder)

oto-Sink bekommt eine Format-Weiche: RIFF/WAVE-PCM (osbuiltin) und MP3
(ElevenLabs/OpenAI/Edge ab Task 03). Dekoder ist github.com/hajimehoshi/
go-mp3 v0.3.4 — reines Go ohne CGO, verifiziert per GOOS/GOARCH-Matrix mit
CGO_ENABLED=0 (alle 6 Targets bauen). Der Dekoder liefert immer 16-Bit-LE
stereo (Mono-Quellen wie Edge 24 kHz werden gespiegelt); die Sample-Rate
kommt aus dem ersten Frame. Fixtures sind echte, einmalig erzeugte MP3s
(mono 24 kHz 48 kbit/s = Edge-Format, stereo 44,1 kHz = Cloud-typisch),
als Base64 eingebettet — Tests bleiben werkzeugfrei.
This commit is contained in:
m3ta-chiron committed 2026-10-18 16:33:46 +02:00
1 parent ae9f3b680e
commit 7a843ae441
7 files changed
+211 -6

No files matched your search

+3 -2
View File
@@ -67,11 +67,12 @@ func contextFor(f pcmFormat) (*otoContext, error) {
return c, nil
}
// Play implementiert Sink: dekodiert WAV (RIFF/PCM) und spielt die Samples
// Play implementiert Sink: dekodiert die Daten (RIFF/WAVE-PCM von osbuiltin
// oder MP3 von den Cloud-Providern, siehe mp3.go) und spielt die Samples
// blockierend ab. Fehler des Audio-Geräts oder des Formats werden klar
// gemeldet.
func (OtoSink) Play(ctx context.Context, data []byte) error {
f, pcm, err := decodeWAV(data)
f, pcm, err := decodeAudio(data)
if err != nil {
return err
}