Golangで音声ファイルを鳴らす

Golangで音声ファイルを鳴らす

Goで音声ファイルを鳴らします github.com/faiface/beepを使います コード

package main

import (
    "os"
    "time"

    "github.com/faiface/beep"
    "github.com/faiface/beep/mp3"
    "github.com/faiface/beep/speaker"
)

func main() {
    if len(os.Args) <= 1 {
        panic("need music file")
    }
    f, err := os.Open(os.Args[1])
    if err != nil {
        panic(err)
    }

    streamer, format, err := mp3.Decode(f)
    if err != nil {
        panic(err)
    }
    defer streamer.Close()

    if err := speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10)); err != nil {
        panic(err)
    }

    done := make(chan bool)
    speaker.Play(beep.Seq(
        streamer,
        beep.Callback(
            func() {
                done <- true
            },
        ),
    ))
    <-done
}

気になりそうなところ

Callbackを渡してるところ

speaker.Play(streamer)だとあんまり綺麗にできなくて

// 音が聞こえる前に終わる :cry: 
speaker.Play(streamer)

// ハングさせる
// 終了を受け取れない :thinking: 
speaker.Play(streamer)
select {}

// Callbackでchannelで終了を通知するようにする :ok_woman: 
speaker.Play(beep.Seq(
    streamer,
    beep.Callback(
        func() {
            done <- true
        },
    ),
))

他の拡張子は?

MP3/WAV/OGG/FLACが(メジャーなものだと)使えるらしい wavの場合 "github.com/faiface/beep/wav" をインポートして wav.Decode(f)でできる

参考

https://github.com/faiface/beep