声で機器を制御して、声で応答してくれる音声ソリューション**「すまーときりたん」**を作りました。
#このソリューションの「できること」
- 照明・テレビ・エアコンを赤外線で制御
- 室内の温度・湿度のセンサー計測とデータ読み上げ
- twitterのタイムラインをチェックして
ずん姉様緊急地震速報のツイートを読み上げ - 都バスの運行webサイトをチェックしてバス停へのバス接近情報を読み上げ
https://youtu.be/n8bh0X_IDh8
以下のデモが含まれています:
・声で温度計測を指示、きりたんが読み上げ
・声で照明のON/OFFを指示
すまーときりたんは、マスコットアプリ文化祭2017に参加しています。
#システム構成要素の説明
自宅内およびPC内:
- Google Home - 音声入力(高性能マイクとして利用)と音声認識
- VOICEROID+EX きりたん - かわいくおはなしするよ
- USBシリアルコンバーター(FT232H) + I2Cバス 温湿度気圧センサー(BME280) - 室内を計測するセンサー
- USB赤外線リモコンアドバンス - 赤外線の送受信
- えもふり - きりたんのアニメーションデータを作成
- すまーときりたん - 管理アプリケーション
クラウド:
- IFTTT - Google Home の音声認識文字列を REST API でポスト
- beebotte - REST API でポストされたデータをMQTTのPub/Subで管理
Google Home に**「ねぇgoogle聞いて、部屋の温度を教えて」と話しかける
↓
声を Google Home の音声認識で文字列化し、「聞いて」というキーワードに反応してIFTTTレシピを実行する
↓
IFTTTレシピの Webhook で、認識した文字列を beebotte にパブリッシュする
↓
beebotte をサブスクライブしている すまーときりたん が文字列を受け取る
↓
文字列を解析して、温度の問い合わせコマンドとして認識する
↓
PCに接続されているUSBのシリアルコンバーター(FT232H)を経由して温湿度気圧センサー(BME280)にアクセス
↓
得られた温湿度データからきりたんにしゃべってもらう文章を組み立てる
↓
すまーときりたん から VOICEROID+EX きりたん にしゃべってもらう
↓
同時にえもふり**で出力したきりたんのアニメーションデータを すまーときりたん で再生する
#技術的なポイント
##beebotteの設定
Channelを作って、Topicを作って、ChannelTokenと設定の
CredentialsのSecretKeyを控えておきます。
C#ではnugetでM2Mqttパッケージをインストールしておき、beebotteのSecretKeyを使ってサブスクライブします。
_mqttclient = new MqttClient("mqtt.beebotte.com");
var ret = _mqttclient.Connect(Guid.NewGuid().ToString(), "[secretkey]", "");
_mqttclient.Subscribe(new[] { "ifttt/kiritan" }, new[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
IFTTTではbeebotteのChannelTokenを使ってREST POSTします。
beebotteのDashboards画面は、テストデータ投入などが簡単にできるので、デバッグで活用できます。
##IFTTTの設定
レシピを作ります。Google Assistantは、Google Homeで使っているアカウントに接続します。
this | Google Assistant | Say a Phrase with a text ingredient |
What do you want to say? | 聞いて $ | |
that | Webhook | Make a web request |
URL | https://api.beebotte.com/v1/data/publish/[topic]/[resource]?token=[ChannelToken] | |
Method | POST | |
ContentType | application/json | |
Body | {"data":" {{TextField}}"} |
Adafruit FT232H
http://akizukidenshi.com/catalog/g/gM-08942/
https://learn.adafruit.com/adafruit-ft232h-breakout/overview
三端子レギュレーター 3.3V500mA TA48M033F
http://akizukidenshi.com/catalog/g/gI-00538/
BME280 温湿度・気圧センサモジュールキット
http://akizukidenshi.com/catalog/g/gK-09421
ブレッドボードなどで、FT232HのD0をBME280のSCLへ、D1とD2をBME280のSDAに配線します。
BME280は、I2Cモードになるようにジャンパを設定します。
BME280のVDDは、TA48M033Fで3.3Vを出して入力します。
##センサーの使い方
libMPSSE with C#
http://www.chd.at/blog/electronic/FTDI-in-CS
BME280搭載 温湿度・気圧センサモジュールの使い方(スイッチサイエンス様)
http://trac.switch-science.com/wiki/BME280
ありがたいことに、必要な情報はここに全てあります。
arduino用のスケッチ(Cソース)があるので、C#に移植して使います。
I2Cアクセス部分(Wireライブラリ)は、libMPSSEを使うように書き直します。
USB赤外線リモコンアドバンス
http://bit-trade-one.co.jp/product/module/adir01p/
ライブラリが提供されています。サンプルソースもあるので、読み書きで困ることはないでしょう。
public void Send(byte[] ircode)
{
var irhandle = USBIR.openUSBIR(parentHandle);
if ((irhandle != null)) {
var len = ircode.Length / 4;
USBIR.writeUSBIRData(irhandle, 38000, ircode, len);
USBIR.closeUSBIR(irhandle);
}
}
##VOICEROID+EX きりたん
VOICEROID+EXを制御するDLL
https://hgotoh.jp/wiki/doku.php/documents/voiceroid/voiceroid-001
コマンドライン+パラメータを渡す的な方法で簡単におはなししてくれるととても助かるのですが、残念ながらそういう仕組みはないようです。
VOICEROIDのウィンドウハンドルを捕まえて、エディタコントロールにクリップボード文字列をペースとして渡すという、激しい力押し対応。
ぜひ、すまーとな仕組みが欲しいところ。
※実はすまーとな仕組みといえば、AITalk WebAPIというのがあるのですが、これは¥5,000/月かかるサービスなので、個人が趣味でやるにはお高い..
#FAQ
なぜGoogle Homeをマイクとして使ったの?
USB接続の会議用マイクで集音して音声認識する仕組みも試作しましたが、環境音やテレビの音に影響されやすく、普段使いの音声ソリューションとしては使えないレベルでした。
一方、Google Homeは圧倒的で「言葉を聞き取るハードウェア」としてはこれ以上にないパフォーマンスを発揮したからです。
なぜGoogle Homeをスピーカーとして使わないの?
Google HomeはChromecastデバイスとして使えるので、きりたんの応答をmp3で保存して、その再生をGoogle Homeにキャストすることができます。ということで試作したのですが、この仕組みだと最終的に発声するまで結構時間がかかります..
ということで、きりたんの応答は素直にPCで再生することにしました。
いくらかかった?
参考価格を定価ベースで書いておきます:
Google Home ¥15,120
VOICEROID+EXきりたん ¥11,880
adafruit FT232H ¥1,940
TA48M033F ¥100
BME280 ¥1,080
USB赤外線リモコンアドバンス ¥4,100
その他配線材等 ¥2,000
合計 ¥37,000程度