この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
今日は札幌オフィスで「Edisonもくもく会」が開催されました!社外の方も含め、7人でもくもくとEdisonを弄り倒しました。超楽しかったです。もし次回遊びに来たい!という方がいらっしゃいましたら、ぜひご連絡下さい。
僕はIntel EdisonにUSBオーディオを接続し、喋らせてみました!
やってみた
デバイスの準備
今回使ったUSBオーディオはBuffaloのUSBオーディオ変換ケーブル BSHSAU01BKです。特にカーネルのリビルドなどは特に必要なく、USBポートに繋ぐだけで認識しました。opkg install alsa-utilsで必要なパッケージをどーんと入れてます。
またベースの機材はIntel Edison Kit for Arduino + Grove Starter Kitで、A0にGrove - Rotary Angle Sensor、D2にGrove - Touch Sensorを接続しました。
ソースコード
gobotを使ってGo言語で書いてます。またVoice Text Web APIを利用するために、yosssi/go-voicetextを使いました。
package main
import (
"fmt"
"os"
"os/exec"
"github.com/yosssi/go-voicetext"
"github.com/hybridgroup/gobot"
"github.com/hybridgroup/gobot/platforms/gpio"
"github.com/hybridgroup/gobot/platforms/intel-iot/edison"
)
func getVoice(pitch int) (path string) {
cli := voicetext.NewClient(os.Getenv("VOICETEXT_API_KEY"), nil)
result, err := cli.TTS("エジソンもくもく会", &voicetext.TTSOptions{
Speaker: voicetext.SpeakerHikari,
Pitch: pitch,
Volume: 200,
})
if err != nil {
panic(err)
}
f, err := os.Create("edison.wav")
if err != nil {
panic(err)
}
defer func() {
if err := f.Close(); err != nil {
panic(err)
}
}()
if _, err := f.Write(result.Sound); err != nil {
panic(err)
}
return "./edison.wav"
}
func main() {
gbot := gobot.NewGobot()
flg := 0
e := edison.NewEdisonAdaptor("edison")
touch := gpio.NewButtonDriver(e, "touch", "2")
rotary := gpio.NewAnalogSensorDriver(e, "rotary", "0")
work := func() {
gobot.On(touch.Event("push"), func(data interface{}) {
fmt.Println("pushing...")
if flg == 0 {
fmt.Println("start.")
flg = 1
angle, _ := rotary.Read()
pitch := int(
gobot.ToScale(gobot.FromScale(float64(angle), 0, 3000), 0, 200),
)
fmt.Println(angle)
fmt.Println(pitch)
path := getVoice(pitch)
cmd := exec.Command("aplay")
cmd.Args = []string{"aplay", "-D", "plughw:1", path}
cmd.Dir = "."
err := cmd.Run()
if err != nil {
panic(err)
}
flg = 0
fmt.Println("end.")
}
})
gobot.On(touch.Event("release"), func(data interface{}) {
fmt.Println("released.")
})
}
robot := gobot.NewRobot("audioBot",
[]gobot.Connection{e},
[]gobot.Device{touch, rotary},
work,
)
gbot.AddRobot(robot)
gbot.Start()
}
結果
go buildして作成されたバイナリファイルをIntel Edisonに転送します。環境変数VOICETEXT_API_KEYに、Voice Text Web APIのAPIキーを入れておきます。
タッチセンサーに触れると、ロータリースイッチの角度を取得してピッチを設定し、Voice Text Web APIからWAVファイルを取得して、USBオーディオから喋ります。
さいごに
こういったUSB周辺機器が簡単に使えるのもEdisonの強みだなーと思います。USBカメラなども繋げてみると楽しそうですね。今度チャレンジしてみたいと思います。