LoginSignup
3
1

More than 5 years have passed since last update.

グラスをスマートにする技術~その2:Line MessageAPI~

Last updated at Posted at 2018-12-06

概要:

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

実施例

システム構成

181125_3.png

RasberryPI準備

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

Line Developer

Line Developer

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

実装例

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/

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1