すまーときりたん (Google Homeときりたんが家電を制御するよ！)

[![すまーときりたん紹介 youtube](https://qiita-image-store.s3.amazonaws.com/0/214088/3a3f33c3-746d-f199-0766-31e6f53bdfce.png)](https://youtu.be/n8bh0X_IDh8)

　声で機器を制御して、声で応答してくれる音声ソリューション**「すまーときりたん」**を作りました。

#このソリューションの「できること」
* 照明・テレビ・エアコンを赤外線で制御
* 室内の温度・湿度のセンサー計測とデータ読み上げ
* twitterのタイムラインをチェックして<strike>ずん姉様</strike>緊急地震速報のツイートを読み上げ
* 都バスの運行webサイトをチェックしてバス停へのバス接近情報を読み上げ

すまーときりたんの紹介動画です：
<a href="https://youtu.be/n8bh0X_IDh8"><img src="https://qiita-image-store.s3.amazonaws.com/0/214088/27ce48ae-2714-0047-d28e-cf9e9f0acf82.png" width=400></img></a>
>https://youtu.be/n8bh0X_IDh8
以下のデモが含まれています：
・声で温度計測を指示、きりたんが読み上げ
・声で照明のON/OFFを指示

すまーときりたんは、マスコットアプリ文化祭2017に参加しています。
>https://mascot-apps-contest.azurewebsites.net/Works/302

#システム構成要素の説明
**自宅内およびPC内：**

* **Google Home** 　- 音声入力(高性能マイクとして利用)と音声認識
* **VOICEROID+EX きりたん** 　- かわいくおはなしするよ
* **USBシリアルコンバーター(FT232H) + I2Cバス 温湿度気圧センサー(BME280)** 　- 室内を計測するセンサー
* **USB赤外線リモコンアドバンス** 　- 赤外線の送受信
* **えもふり** 　- きりたんのアニメーションデータを作成
* **すまーときりたん** 　- 管理アプリケーション

**クラウド：**

* **IFTTT** 　- Google Home の音声認識文字列を REST API でポスト
* **beebotte** 　- REST API でポストされたデータをMQTTのPub/Subで管理

#動作の仕組み
![20171121 すまーときりたん 動作フロー図.png](https://qiita-image-store.s3.amazonaws.com/0/214088/843ef2db-30fd-106e-18e1-56bf8ab5d741.png)

　Google Home に**「ねぇgoogle聞いて、部屋の温度を教えて」**と話しかける
　　　<font color="Maroon">**↓**</font>
　声を Google Home の音声認識で文字列化し、**「聞いて」**というキーワードに反応してIFTTTレシピを実行する
　　　<font color="Maroon">**↓**</font>
　IFTTTレシピの Webhook で、認識した文字列を beebotte にパブリッシュする
　　　<font color="Maroon">**↓**</font>
　beebotte をサブスクライブしている **すまーときりたん** が文字列を受け取る
　　　<font color="Maroon">**↓**</font>
　文字列を解析して、**温度の問い合わせコマンド**として認識する
　　　<font color="Maroon">**↓**</font>
　PCに接続されているUSBのシリアルコンバーター(FT232H)を経由して**温湿度気圧センサー(BME280)**にアクセス
　　　<font color="Maroon">**↓**</font>
　得られた温湿度データからきりたんにしゃべってもらう文章を組み立てる
　　　<font color="Maroon">**↓**</font>
　**すまーときりたん** から **VOICEROID+EX きりたん** にしゃべってもらう
　　　<font color="Maroon">**↓**</font>
　同時に**えもふり**で出力したきりたんのアニメーションデータを **すまーときりたん** で再生する


#技術的なポイント
##beebotteの設定
>https://beebotte.com/

　**Channel**を作って、**Topic**を作って、**ChannelToken**と設定の
**Credentials**の**SecretKey**を控えておきます。
　C#ではnugetで**M2Mqtt**パッケージをインストールしておき、beebotteの**SecretKey**を使ってサブスクライブします。

```csharp
_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の設定
>https://ifttt.com/discover

　レシピを作ります。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}}"}|


##センサーの物理設計
![20171122_FT232H_BM280.png](https://qiita-image-store.s3.amazonaws.com/0/214088/bada8e17-8730-370e-a5c7-7cb27b3e4bcc.png)
>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を使うように書き直します。

##赤外線部分
<img src="https://qiita-image-store.s3.amazonaws.com/0/214088/1fb89bc8-240a-b410-b493-4cd219796f3d.jpeg" width=400></img>
>USB赤外線リモコンアドバンス
http://bit-trade-one.co.jp/product/module/adir01p/

　ライブラリが提供されています。サンプルソースもあるので、読み書きで困ることはないでしょう。

```csharp
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/月かかるサービスなので、個人が趣味でやるにはお高い..
>https://www.ai-j.jp/cloud/webapi/price/

#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程度