package cmd import ( "bytes" "os" "os/exec" "strings" ) var rawPiperCmd = strings.Split("piper --model /home/toor/piper_models/en_US-ryan-medium.onnx --output-raw", " ") var rawAplayCmd = strings.Split("aplay -r 22050 -f S16_LE -t raw -", " ") func Say(msg []byte) error { buf := new(bytes.Buffer) buf.Write(msg) r, w, err := os.Pipe() if err != nil { return err } defer r.Close() piperCmd := exec.Command(rawPiperCmd[0], rawPiperCmd[1:]...) piperCmd.Stdin = buf piperCmd.Stdout = w err = piperCmd.Start() if err != nil { return err } w.Close() defer piperCmd.Wait() aplayCmd := exec.Command(rawAplayCmd[0], rawAplayCmd[1:]...) aplayCmd.Stdin = r return aplayCmd.Run() }