グラスをスマートにする技術～その２：Line MessageAPI～

###概要：
　飲み会に遅刻しそう、先に乾杯しちゃって欲しいけど、幹事に連絡がつかない、そんな経験ありませんか？
　私が所属するaNo研は、遠隔伝言グラス「スマートグラス e幹事」を発表しました。
　この記事は、「スマートグラス e幹事」に使われている技術を紹介します。

####実施例
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">しゃべるグラス「e幹事」、Lineからしゃべってくれる機能搭載！<br>Lineの会話を見落としていた、を防ぎます。<br> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://twitter.com/hashtag/IF_DIY?src=hash&amp;ref_src=twsrc%5Etfw">#IF_DIY</a> <a href="https://t.co/ybPbU2XzkD">pic.twitter.com/ybPbU2XzkD</a></p>&mdash; aNo研 (@anoken2017) <a href="https://twitter.com/anoken2017/status/1048852425933611009?ref_src=twsrc%5Etfw">2018年10月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


###システム構成
![181125_3.png](https://qiita-image-store.s3.amazonaws.com/0/73020/4d1cd299-2d9a-45e6-1b21-98be13077c05.png)

###RasberryPI準備
事前に、LineDeveloperのHPから、アカウントを取得して、Developer TrialMessaging のLineBotを取得してください。

####Line Developer

[Line　Developer](https://developers.line.biz/ja/services/messaging-api/)

Channel Secret のシークレットキと、Channel Access Token のトークンをいれて、
下記のコマンドを打ちます。

```
export LINE_CHANNEL_SECRET=YOUR_LINE_CHANNEL_SECRET
export LINE_CHANNEL_ACCESS_TOKEN=YOUR_LINE_CHANNEL_ACCESS_TOKEN
```

####line-bot-sdk-python
Line BotのPythonサンプルをダウンロードし、pythonの依存ライブラリをインストールします。

```
 $ git clone  https://github.com/line/line-bot-sdk-python.git
 $ cd ~/line-bot-sdk-python
 $ pip3 install -r requirements.txt
```

####python-osc
pythonでOSCを使うためのライブラリ、python-oscのインストールします。

```
pip3 install python-osc
```

####ngrok
Lineのサーバから、LAN内で運用しているRasberryPIにアクセスするために、
ネットワークをリレーするツール、ngrokをインストールします。

```
 $ brew update
 $ brew install homebrew/binary/ngrok2
```

```
 $ ngrok http 8000
```
ngrok で取得した、グローバルIPアドレスを、Line DeveloperのWebHookURLに入力します。

![181125_ekanji_3.png](https://qiita-image-store.s3.amazonaws.com/0/73020/b7ce7887-1fd1-5097-d0cc-8510e0dc7ba6.png)

####実装例
line-bot-sdk-pythonのサンプルのひとつ、flask-kitchensinkの、
handle_text_message関数を以下のように編集します。
Lineから受信したメッセージをOSCに変換して送信します。
M5Stackでは、OSCからのメッセージをAquesTalkTTSに入力して音声を出力します。


####RasberryPI
```
from pythonosc import osc_message_builder
from pythonosc import udp_client
port_num = 10000
parser = argparse.ArgumentParser()
parser.add_argument("--ip", default="192.168.1.", help="The ip of th OSC Server")
parser.add_argument("--port", type=int, default=port_num, help="The port the OSC server is listening on")
args = parser.parse_args()
client = udp_client.SimpleUDPClient(args.ip, args.port)


@handler.add(MessageEvent, message=TextMessage)
def handle_text_message(event):
    text = event.message.text
    cmd = 'talk ' + text
    print(cmd)
    text2 ='speak to message'
    client.send_message("/msg", cmd)
    line_bot_api.reply_message(event.reply_token, TextSendMessage(text=text2))

```

####M5stack

```
#include <M5Stack.h>
#include <ArduinoOSC.h>
#include <AquesTalkTTS.h>
const char* ssid = "";
const char* password = "";
WiFiUDP udp;
ArduinoOSCWiFi osc;
const int recv_port = 10000;
void messageCb(OSCMessage& m) {
  String str = m.getArgAsString(0);
  int len = str.length(); 
  String cmd = str.substring(0, 4);
  String value = str.substring(5);
  if (cmd == "talk") {
    TTS.playK(value.c_str(), 100);
    delay(3000);
  }
}
void setup() {
  M5.begin();
  setupWiFi();
  osc.begin(udp, recv_port);
  osc.addCallback("/msg", &messageCb);
  int iret = TTS.createK("");
}
void loop() {
  osc.parse();
}


```



-----------
aNo研：https://anoken.jimdo.com/