音声強化版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