【MESH カスタムタグ】google home miniに好きな言葉をしゃべらせる

#やりたいこと
MESHで気軽にTTS(Text to Speech)を使えるようにしたい

#実行結果
動きタグを振るとGoogle Home Miniが入力したテキストをしゃべります。
![名称未設定-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/159447/c9fafdbf-ed61-5ef9-6a7d-82268eaf83cf.jpeg)
動画のリンク：https://youtu.be/uFISjYJPvVQ

#必要なもの
- MESHアプリ対応スマートフォン
- MESHタグ
- MESH SDKのアカウント
- Raspberry Piと(設定に必要なキーボード,SDカードなど)
- Wifi環境
- Google Home (Mini)

#設定方法と実行方法
###仕組み
![システム構成図.png](https://qiita-image-store.s3.amazonaws.com/0/159447/a54f4f36-0c6e-2732-7594-2bec142d9b59.png)

###Google Home MiniとRaspberry Piの設定
下記のリンクを参考にして設定してください。
・[GitHub - noelportugal/google-home-notifier](https://github.com/noelportugal/google-home-notifier) 
・[Google Homeで時報を知らせる](https://qiita.com/udon11/items/fef44cec7b243f93151b)
・[Twitterの通知をGoogle Homeに教えてもらう](https://kotodama.today/?p=744)

###MESH SDKのカスタムタグの設定
PC等のブラウザでMESH SDKを開き、新しいタグを作り下記のjsonコードをインポートしてください。その後、スマートフォン側のアプリにカスタムタグを追加してください。

```mesh-googlehome.json
{"formatVersion":"1.0","tagData":{"name":"GoogleHomeSpeak","icon":"data:image/jpeg;base64,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","description":"","functions":[{"id":"function_0","name":"言葉を話す","connector":{"inputs":[{"label":""}],"outputs":[{"label":""}]},"properties":[{"name":"text","referenceName":"speakText","type":"string","defaultValue":"ここに入力してください"},{"name":"address","referenceName":"ipAddress","type":"string","defaultValue":"address"}],"extension":{"initialize":"","receive":"","execute":"var endPointURL = \"https://\" + properties.ipAddress + \".ngrok.io/google-home-notifier\";\n\najax ({\n    url : endPointURL,\n    type : 'post',\n    headers: {'Content-Type': 'application/x-www-form-urlencoded'},\n    timeout : 5000,\n\tdata:{text:properties.speakText},\n    success : function ( contents ) {\n\t\tlog('trigger success');\n        callbackSuccess( {\n            resultType : 'continue'\n        } );_\n    },\n    error : function ( request, errorMessage ) {\n        log('trigger : Network error');\n\t\tlog(endPointURL);\n\t\tlog('trigger  : ' + errorMessage);\n        callbackSuccess( {\n            resultType : 'continue'\n        } );\n    }\n});\n \nreturn {\n    resultType : 'pause'\n};","result":"return {\n    resultType : \"continue\"\n}\n"}}]}}
```
##

　
####実行方法
スマートフォンでアプリを立ち上げて、トリガーとなるタグと追加したカスタムタグをつなげてください。
その後、下記の画像のように**text**の部分に**しゃべらせたい言葉**を入力し、**address**の部分にRaspberry Pi側で実行中のサービスで**xxxxxxx**と表示されている部分を入力してください。
`curl -X POST -d "text=Hello Google Home" https://xxxxxxx.ngrok.io/google-home-notifier`
あとはトリガーが実行したら、Google Homeが入力されたテキストをしゃべります。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/159447/30328507-ea34-1ca1-3fbe-a1d4b367d92a.png)

#感想
レスポンスもよく3-5秒後に喋ってくれるので、ラピッドプロトタイピングで音声フィードバックを検証するのに便利だと思いました。個人的には、addressの**xxxxxx**の生成される乱英数字を固定したかったのですが、ngrokのサブドメイン固定が月額で有料だったので諦めました。笑