Alexaをslackから操作できるようにした話

2019-12-05Slack連携, ラズパイSlack, ラズパイ

※こちらの記事は Qiitaにアップした記事 とほぼ同一の内容となっています

はじまり

僕の職場にはAmazon Echoがあって、毎日それで音楽を流してたりする。
大抵は一番近くにいる人が操作している。
別に「この人しか操作しちゃだめ」みたいな規則はないんだけど、自分の席からはだいぶ遠いし
Alexaに聞こえるほどの声を出すとなるとちょっと…。

なので、Slackから操作したい。

準備

以下のモノを用意した
・Raspberry pi zero WHスターターキット
・HDMI→D-SUB変換アダプタ ※購入したのはこちら https://www.amazon.co.jp/dp/B00ZMV7RL2
・スピーカー ※自分でも購入したけど会社に使ってないものがあったのでそちらを借りることに
・ディスプレイ ※会社に以下略 社内WiFiへ繋げる時に使っただけ
・キーボード ※会社に以下略 社内WiFiへ繋げる時に使っただけ

ラズパイはネットに繋げてalexaの射程範囲内にスピーカーを置く他は基本的なセットアップしかしてないです

どうやってAlexaを動かすか

Slack→ラズパイ→スピーカー→alexa
RTM APIとOpen Jtalkでメンションされた内容を音声にしてスピーカーから出力する

botの準備

ワークスペースのアプリ一覧から bots で検索してインストールする

 

設定を追加 からユーザー名を設定し ボットインテグレーションを追加する をクリック
名前は alexis にしました

APIトークンはbotとの通信に使います
あとはbotの設定(アイコンとか表示名とか)なのでよしなにしてください

できあがったらチャンネル詳細のアプリ追加から呼んであげればおしまい

※現在カスタムインテグレーションは非推奨となってますが、ひとまずこの手順で作成しました
そのうちちゃんとつくりたい

Open JTalkを入れる


こちらの手順そのままで入れました。
声質変えたかったけど上手くAlexaが聞き取ってくれないのでデフォルトのまま。

Raspberry piにslack botを入れる

以下のようにディレクトリつくる
 order_to_alexa
 ├media
 └plugin

mediaにはOpen Jtalkで生成した音声ファイルを入れます

https://qiita.com/kunitaya/items/690028e33ba5c666f3e2
上記を参考にRaspberry piにslack botを入れる
run.pyとslackbot_settings.pyはほぼそのままで使えると思います
slackbot_settings.pyのtokenには botの準備 で作成したbotのAPIトークンを入れてください

発話させる部分を書く

$ vim ~/order_to_alexa/plugin/slackbot_plugin.py

 

 # -*- coding: utf-8 -*-
from slackbot.bot import respond_to, listen_to
import re
import subprocess
from time import sleep

@respond_to(u'(.*)’)
def orderToAlexa(message, something):

wakeword=u’アレクサ’
cmd=’echo “'+wakeword+'" | open_jtalk -r 0.9 -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow ~/orderToAlexa/media/wakeword;’

input_msg=u'{}’.format(something)
cmd+=’echo “'+input_msg+'" | open_jtalk -r 0.8 -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow ~/orderToAlexa/media/talk’

subprocess.call(cmd, shell=True)

wake_cmd=’aplay ~/order_to_alexa/media/wakeword’
play_cmd=’aplay ~/order_to_alexa/media/talk’

subprocess.call(wake_cmd, shell=True)
sleep(1)
subprocess.call(play_cmd, shell=True)

message.reply('「アレクサ、’+input_msg+’」と発話しました’)

いろいろ四苦八苦しながら書きました
「アレクサ」と「(命令)」の間で少しディレイさせると上手く聞き取ってくれる(ような気がするというおまじない)

slack bot を起動する

$ nohup python3 order_to_alexa/run.py > /dev/null 2>&1 &

これでチャンネルのalexisにメンション飛ばしたらalexaに取り次いでくれます
おしまい

さいごに

以下のようにSlackで @alexis にメンションします。

すると、、、

こんな感じでアレクサを操作できます。

 

 

2019-12-05Slack連携, ラズパイSlack, ラズパイ

Posted by 金城翔太