2016年12月4日日曜日

Amazon PollyとAlexa Voice ServiceでSlackにAlexaを。

こんにちは。okeeeです。

ゆっくりと12月のあかりが灯りはじめ、慌ただしく踊る町を誰もが好きになる最近いかがお過ごしでしょうか。私は11月末から始まったre:Invent 2016でリリースされた新サービスを追っていたら気がついたら12月だった、そんな感じです。
さて、re:Invent2016ではAmazon Lex、Amazon Rekognition、Amazon Pollyが発表され、先にリリースされているAmazon Machine Learningと合わせてAmazon AIプラットフォームとなりました。Rekongnitionが画像認識、PollyがText To Speech(TTS)、LexがAlexaの中身であるNLUとASRとなっています。今回のリリースの中で私の心が一番踊ったのはLexです。「遂にAlexaが」みたいな感じでした。
Alexaについては以前からAmazon Developer側でAlexa Skills Kit(ASK) / Alexa Voice Service(AVS)という形で開発者向けのサービスが提供されていました。スキルと呼ばれるコマンドのようなものをAlexaに追加する機能、Alexaの音声インターフェースにEcho以外からアクセスするサービスです。ただASK / AVSはかなり限定的な内容となっており、NLUやASRに直接アクセスすることができませんでした。Lexの構成要素としてはIntent、Utterance、Slots、NLU、ASRなどなどAVSでおなじみの内容となっています。LexがGAになればそこが開放される形となります。ということで


のような感じで以前からやりたかった「AlexaをSlackに召喚する」が実現できそうです。これが実現できなかった一番の理由は「AVSにテキストのInterfaceがない」という部分になります。現時点でAVSには音声のInterfaceしかありません。

Alexa Voice Service API Overview
https://developer.amazon.com/public/solutions/alexa/alexa-voice-service/content/avs-api-overview

「Voice Service」というくらいなのでしょうがないですね。そのためテキスト⇔音声の部分がSlack(その他テキスト系全般)と接続する際に課題でした。Lexはbotでの利用が想定されており、Facebook Messanger、Slackなどと連携可能となっており、テキストでのInterfaceが用意されます。
※音声→テキスト→AI→テキスト→音声、という流れには変わりなく、TTS/STTなしでのテキストIn/Outになると思います。

ただ、例によってLexはPreviewとなっており、Previewにサインアップして順番が回ってくれば利用できる、という状況です。Previewには即サインアップしたものの、多分おそらく全然来ないと思うので、Polly + AVSで疑似LexとしSlack Botを作ってみます。力技です。

必要なもの

  • Slack
  • Amazon Developer用のAmazon.comアカウント
  • AWSアカウント
  • Alexaへの愛

作るもの

API Gateway + LambdaのSlack Botで、入力されたテキストをPollyを使ってTTSしAVSにぶん投げる、です。

SlackとAPI Gateway Lambda

参考:http://blog.serverworks.co.jp/tech/2015/11/19/blush_muscle_bot/
Outgoing Webhooksで雑にぶん投げます。Trigger wordsは"@polly"としました。

LambdaからPollyを呼び出す

参考:http://blog.serverworks.co.jp/tech/2016/12/02/reinvent-polly-handson/
re:Invent2016で開催されたLambdaでPollyを呼び出してS3に保存するサンプルを流用します。S3に保存する部分はPollyからの音声データ取得時ではなく、AVSからのResponseの音声データを保存するようにします。Pythonです。

LambdaからAVSを呼び出す

参考:https://github.com/jaws-ug-kobe/AlexaPi
Pollyの呼び出しがPythonなのでPythonからAVSを呼び出す形にします。AVSはv1とv2がありv2を利用します。v2は高速化されていたりProtocolがHTTP/2になってたりv1からの変更点が色々とあります。
AVSのAuthorizationはRemote/Localの2パターンがあります。本来はSlack Botとして使う(複数ユーザーがBotを使う)のでRemote AuthorizationしてユーザーごとにLogin With Amazon(LWA)させる形が望ましいのですが、今回は簡略化するためにLocal Authorizationにしました。
※1つのAmazon.comアカウントを複数Slackユーザーで使う形になるので本番には使わないでください。Alexaは買い物も出来るので誰かが勝手にAmazon.comで買い物しちゃう可能性があります。

Tips

ここまでサクッと出来ました。Pollyで取得した音声データのAVSでの認識も特に問題なさそうです。AVSで使う2つのURLの場所を確認したところ、両方共Ashburnにありました。そのためAWSはN.Virginiaを使うと良さげです。
開発環境はローカルにPython3/Boto3を入れたのですが、これはAmazon Linuxを立てたほうが良かった気がします。

課題

PollyはTTSです。AVSに投げることは出来ますがAVSからのResponseをSpeech To Text(STT)することが出来ません。現状AWSではSTT出来ないので、ここは今まで通りWatsonを通すくらいしかなさそうです。とりあえずS3に保存してSlackにはS3のリンクを返す、という苦肉の策。Lexが使えるようになれば解決するのでしょう。
あとPollyでTTSする、音声データをやり取りする、というあたりで少し時間がかかります。ここもLexが使えるようになれば解決できると思います。

まとめ

ということで簡単にSlackからPollyを使ってAVSにつなぐことが出来ました。
コードはそのうち公開する、と思います。

というかLexはよ。Lexはよ。
大事なことなので二回言いました。

そういえばこの投稿はサーバーワークス Advent Calendar 2016の12/4分です。
明日は @GALACTIC1969 さんが私に代わって大爆笑ブログを書いてくれると思うので超ご期待ください。

ではまた。