###概要:
飲み会に遅刻しそう、先に乾杯しちゃって欲しいけど、幹事に連絡がつかない、そんな経験ありませんか?
私が所属するaNo研は、遠隔伝言グラス「スマートグラス e幹事」を発表しました。
この記事は、「スマートグラス e幹事」に使われている技術を紹介します。
####実施例
しゃべるグラス「e幹事」、Lineからしゃべってくれる機能搭載!
— aNo研 (@anoken2017) 2018年10月7日
Lineの会話を見落としていた、を防ぎます。
#M5Stack #IF_DIY pic.twitter.com/ybPbU2XzkD
###RasberryPI準備
事前に、LineDeveloperのHPから、アカウントを取得して、Developer TrialMessaging のLineBotを取得してください。
####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に入力します。
####実装例
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();
}