package transcode import ( "os" "github.com/go-audio/audio" "github.com/go-audio/wav" ) func writePCM16WAV(path string, sampleRate int, channels int, samples []float64) error { if channels <= 0 { channels = 1 } if err := os.MkdirAll(dirOf(path), 0o755); err != nil && dirOf(path) != "." { return err } f, err := os.Create(path) if err != nil { return err } defer f.Close() enc := wav.NewEncoder(f, sampleRate, 16, channels, 1) data := make([]int, len(samples)) for i, s := range samples { data[i] = floatToInt16(s) } if err := enc.Write(&audio.IntBuffer{ Format: &audio.Format{SampleRate: sampleRate, NumChannels: channels}, Data: data, }); err != nil { return err } return enc.Close() } func floatToInt16(f float64) int { if f > 1 { f = 1 } if f < -1 { f = -1 } return int(f * 32767) } func dirOf(path string) string { for i := len(path) - 1; i >= 0; i-- { if path[i] == '/' || path[i] == '\\' { return path[:i] } } return "." }