Amazon Polly と Slack を使って Alexa へ (物理的に) 話しかけるシステムを作ってみた

概要

巷で流行りの Voice User Interface (VUI)。 マウスやキーボードといったマシン寄りの UI でなく、 人間が生来持っている「声」を活用した UI である。

普通の人であれば便利なのだろうが、自分のような根暗 IT 系エンジニアには地獄のような UI だ。なんでたかが機械に命令するのに口を開かなければならないのか。ああ、面倒くさい。こんなものはキー入力で十分だろう。

というわけで、自分の意思を機械に喋ってもらう仕組みを作ってみた。

動作例

わかりにくいですが、「人気の邦楽をかけて」 と Slack へ打ち込んだ際の様子です。 ちゃんと反応しました!

構成

コアとなる音声合成部分は、Amazon Polly を用いた。 コード全体はこちら。

Amazon Polly (音声合成)

Amazon Polly は、高度なディープラーニング技術を使用したテキスト読み上げサービスで、人間の声のような音声を合成します。
【Amazon Polly】(人工知能を活用したテキスト読み上げサービス)| AWS

とのことで、ディープラーニング技術とやらのおかげか、すごく自然な音声を合成できる代物だ。こいつを使えば、あの忌々しい Alexa 君も余裕でごまかせる。

API からプログラマブルに音声合成できるし、発音レキシコン音声合成マークアップ言語 (SSML) といった仕組みを使えば、発音の仕方までカスタマイズもできるすぐれものだ。

Slack App (喋らせるコマンドを実行するUI)

Slack App でなにができるかについて下記記事がよくまとまっている。

Slack Botの種類と大まかな作り方 – Qiita

凝ったことをしないのであれば、所謂 Bot を作るまでもなく Slash Command や Incoming Webhooks で済むような気がする。

よって、今回は Slash Command を用いて命令を発令するようにした。

AWS Serverless Application Model (AWS SAM)

サーバーサイドは AWS SAM を使ってサーバーレスで構成した。 つらみしかない。Serverless Framework のほうが情報量が多くてもっとやりやすいような気がする。

正直もうしばらく SAM は御免こうむりたい……

AWS IoT Core (MQTT を使った、サーバーレスアプリケーションと社内 LAN 内にある Python クライアント間のリアルタイム通信)

Slack からコマンド実行したら即座に喋って欲しい。ここでポーリングはダサい。 しかし、サーバーレス構成で WebSocket とかって聞いたことが無い。

調べてみたら AWS IoT を使えば MQTT が使えるらしい。 よって、IoT でもなんでもないけど、AWS IoT Core を採用した。

参考: amazon web services – Is it possible to subscribe to a WebSocket in a serverless fashion using AWS? – Stack Overflow

※ ちなみに、AWS AppSync でも WebSocket が使えるらしいが、GraphQL をやったことがなく調べるのが面倒くさいのでやめた。

感想

  • 実際、喋らせるのに結構勇気がいる
    • 基本的に静かな社内で、いきなり機械が喋りだすと怖い
  • もっと人間と話がしたい人生だった