| package utils |
|
|
| import ( |
| "fmt" |
| "os" |
| "os/exec" |
| "strings" |
|
|
| "github.com/go-audio/wav" |
| ) |
|
|
| func ffmpegCommand(args []string) (string, error) { |
| cmd := exec.Command("ffmpeg", args...) |
| cmd.Env = []string{} |
| out, err := cmd.CombinedOutput() |
| return string(out), err |
| } |
|
|
| |
| |
| func AudioToWav(src, dst string) error { |
| if strings.HasSuffix(src, ".wav") { |
| f, err := os.Open(src) |
| if err != nil { |
| return fmt.Errorf("open: %w", err) |
| } |
|
|
| dec := wav.NewDecoder(f) |
| dec.ReadInfo() |
| f.Close() |
|
|
| if dec.BitDepth == 16 && dec.NumChans == 1 && dec.SampleRate == 16000 { |
| os.Rename(src, dst) |
| return nil |
| } |
| } |
| commandArgs := []string{"-i", src, "-format", "s16le", "-ar", "16000", "-ac", "1", "-acodec", "pcm_s16le", dst} |
| out, err := ffmpegCommand(commandArgs) |
| if err != nil { |
| return fmt.Errorf("error: %w out: %s", err, out) |
| } |
| return nil |
| } |
|
|
| |
| |
| func AudioConvert(src string, format string) (string, error) { |
| extension := "" |
| |
| switch format { |
| case "opus": |
| extension = ".ogg" |
| case "mp3", "aac", "flac": |
| extension = fmt.Sprintf(".%s", format) |
| default: |
| extension = ".wav" |
| } |
|
|
| |
| if extension == ".wav" { |
| return src, nil |
| } |
|
|
| |
| dst := strings.Replace(src, ".wav", extension, -1) |
| commandArgs := []string{"-y", "-i", src, "-vn", dst} |
| out, err := ffmpegCommand(commandArgs) |
| if err != nil { |
| return "", fmt.Errorf("error: %w out: %s", err, out) |
| } |
| return dst, nil |
| } |
|
|