音声強化版PaPeRo i をリモートホストのGolangアプリから歌わせる

 音声強化版PaPeRo i をリモートホストから歌わせると同じことをGolangでも試してみました。

Tinker Board S に命令して歌わせる

 まず音声強化版PaPeRo i のTinker Board S にインストール済みのPython3と前出のsing.pyを使って歌わせる方法です。Golangでは準標準パッケージgolang.org/x/crypto/ssh”でssh機能を実現できます。コマンドで

$ ssh linaro@192.168.5.100 /home/linaro/.pyenv/shims/python3 /nvm/test/sing/sing.py -f /nvm/papebot/data/songs/nanatsunoko.wav

とするのと同等の処理は以下の様なGolangコードで実現でき、歌わせることができました。

package main

import (
    "fmt"
    "io"
    "os"
    "time"

    "golang.org/x/crypto/ssh"
)

func SshExec(user, passwd, hostport, command string, stdin io.Reader, stdout, stderr io.Writer) int {
    config := &ssh.ClientConfig{
        User: user,
        Auth: []ssh.AuthMethod{
            ssh.Password(passwd),
        },
        Timeout:         10 * time.Second,
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }
    conn, err := ssh.Dial("tcp", hostport, config)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Dial error to %v: %v", hostport, err)
        return 1
    }
    defer conn.Close()

    session, err := conn.NewSession()
    if err != nil {
        fmt.Fprintf(os.Stderr, "NewSession eror: %v", err)
        return 1
    }
    defer session.Close()

    session.Stdout = stdout
    session.Stderr = stderr
    session.Stdin = stdin
    err = session.Run(command)
    if err != nil {
        fmt.Fprint(os.Stderr, err)
        if ee, ok := err.(*ssh.ExitError); ok {
            return ee.ExitStatus()
        }
        return 1
    }
    return 0
}

func pythonSing() int {
    song := "nanatsunoko.wav"
    user := "linaro"
    passwd := "PASSWORD"
    hostport := "192.168.5.100:22"
    python := "/home/linaro/.pyenv/shims/python3"
    script := "/nvm/test/sing/sing.py"
    path := fmt.Sprintf("/nvm/papebot/data/songs/%s", song)
    command := fmt.Sprintf("%s %s -f %s", python, script, path)
    res := SshExec(user, passwd, hostport, command, os.Stdin, os.Stdout, os.Stderr)
    return res
}

func main() {
    os.Exit(pythonSing())
}

デバッグ時だけでなく最終的にもGolangアプリをTinker Board S 以外のホストで動かしたい場合にはこの方法が良いと思います。

実行ホストにあるwavデータを渡して歌わせる

 デバッグが済んだらアプリをTinker Board S で動かすのであれば、コマンドで

$ cat nanatsunoko.wav | ssh cli@aterm.me aplay -

とするのと同じにする方が適しています。これはGolangでは、

...略...

func tinkerSing() int {
    song := "nanatsunoko.wav"
    user := "cli"
    passwd := "PASSWORD"
    hostport := "aterm.me:22"
    command := "aplay -"
    path := fmt.Sprintf("/nvm/papebot/data/songs/%s", song)
    file, err := os.Open(path)
    if err != nil {
        fmt.Fprintf(os.Stderr, "cannot open %v: %v", path, err)
        return 1
    }
    defer file.Close()
    res := SshExec(user, passwd, hostport, command, file, os.Stdout, os.Stderr)
    return res
}

func main() {
    os.Exit(tinkerSing())
}

となり、歌わせることができました。


0