Amazon lexで音声チャットボットを作成してみた


天気の良い週末にやることがなく、昼の12時ごろ、趣味の長時間歯磨きをしながらtechCrunchを見ていたら、amazonのlexの記事が乗っていた。

http://jp.techcrunch.com/2017/04/21/20170420amazon-lex-the-technology-behind-alexa-opens-up-to-developers/

> Amazonの仮想アシスタントAlexaを支えているテクノロジーであるAmazon Lexが、今朝（米国時間20日）のロイターの記事によれば、プレビュー段階を終了したということだ。

↓↓↓
https://aws.amazon.com/jp/lex/

```text:
Amazon Lex は、音声やテキストを使用した会話型インターフェイスをさまざまなアプリケーションに構築するためのサービスです。
Lex では、自動音声認識 (ASR) という音声をテキストに変換するための高度な深層学習機能と、
テキストの意図を理解するための自然言語理解 (NLU) を利用できます。
これにより、非常に魅力的なサービスと生き生きとした音声対話を実現するアプリケーションを構築できます。
Amazon Lex を使うと、すべての開発者が Amazon Alexa に採用されている深層学習技術と同じ技術を利用し、
自然言語での高度な対話ボット (チャットボット) を短時間で簡単に構築できるようになります。
```

このページにある[動画](https://www.youtube.com/watch?v=ZdeK8HnhKQ8&feature=youtu.be)は去年の11月末のものだ。
その頃、某ゲームの開発と並行して走る運営の現場の両方が修羅場で、毎日トラブルと戦っていた。さらにトラブルは現場だけとは限らず、外野がキナ臭くなり、モヒカンと肩パッドの荒くれ供から平和を守るために北斗百烈拳を繰り出していた。明日を見失って、CV千葉繁になっていた記憶がうっすらとある。
当然[re:InventのKeynote](https://www.youtube.com/watch?v=cQpW-1Pwa-E)など見る暇はなかった。


# Try a sample

まずはこちらのページでサンプルを作ってみる。
https://console.aws.amazon.com/lex/home?region=us-east-1#bot-create:

![cb-1.png](https://qiita-image-store.s3.amazonaws.com/0/173392/e46f1799-9bde-9cb5-42a6-b27be088eb60.png)
BookTripをクリック。

![cb-2.png](https://qiita-image-store.s3.amazonaws.com/0/173392/f766019c-e50f-f0b7-6793-3b6278ab7f53.png)

IAM：自動的に作ってくれるんはありがたい。念のため後でデタッチされた権限を見ることにするけどな。
Child-Directed?:子供専用ではないからNo。



Createを押しやす。

↓
マイクを許可しますかのプロンプトが出るので、許可にする。
このmacには内臓マイクがないので、iPhoneのヘッドホンを繋いでおく。

![cb-3.png](https://qiita-image-store.s3.amazonaws.com/0/173392/02e6bc55-3e0f-6e03-48f1-c51ca6e8dbb8.png)

しかしこの後、何をどうしたらいいのか、説明がないからさっぱりわからない。。。。。。
困った。

# tutorialの動画をみながらもう一度sample chat botをつくる


AWS Lex Demo Tutorial (Jan 2017)
https://www.youtube.com/watch?v=7uG9cuxNo5k
「花の注文をするチャットボット」を10分くらいで作る様子。


4ヶ月ほど前に親切な人が投稿してくれたチュートリアル動画で、
やさしい英語をえらんで説明してくれているが、
英語のききとりがやっとの自分はYoutobeの字幕機能で補いながらみた。
この通りやってみると、なんとなくわかる。


なおこの動画の中では、まだ「Channels」がFacebookしかないが、
3ヶ月後の現在は、3つに増えている。

- Facebook
- Twilio SMS　←増えた
- Slack　←増えた



花屋のサンプルをそのまま真似して、以下のように作ってみた。
> name:OrderFlowersSitopp
Description:Bot to order flowers on the behalf of a user
Output voice:Joey 

![cb-8.png](https://qiita-image-store.s3.amazonaws.com/0/173392/7a2a6f8c-ffd6-9873-e40b-a085137e857c.png)

Buildをするとtest Botでtext入力できるようになる。
Sample Utterancesの1個めをコピペして、
I would like to pick up flowers
と記入してエンターしてみるとすぐ答えが返ってきた。ほうほう。
![cb-7.png](https://qiita-image-store.s3.amazonaws.com/0/173392/1482b459-d6e7-90b7-c043-bc6bfabbe890.png)
あっ、これもうできちゃったのか。早いなぁ。(΄◉◞౪◟◉｀)




# 音声入力してみる


AWSのLexのコンソールに行く
https://console.aws.amazon.com/lex/home?region=us-east-1#bots:
↓
さっき作った「name:OrderFlowersSitopp」を選ぶ![cb-15.png](https://qiita-image-store.s3.amazonaws.com/0/173392/a09a25e3-a18e-fa29-b869-23c739f81ac6.png)

↓

右側にチャットボットのタブが現れるので、
入力欄のマイク部分をクリックする。そうすると音声入力モードになった。

![cb-13.png](https://qiita-image-store.s3.amazonaws.com/0/173392/cf47ee07-c687-e900-1d7e-e3b7fdbbcefe.png)

↓
Macに繋いだiPhone用のヘッドフォンのマイクのあたりに話しかけると、テキスト化して、チャットにしてくれます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/173392/13712186-2506-d885-29ee-5e4b4525af78.jpeg" width=200>

上の例だと、私の発音が悪いので、rosesがlosesとかclosesになっている。ひどい(笑）
しかもボットはそのまま「Ok your closes will be ready 」と予約終了してしまった。
いったいなんの花が届くのか。。笑

もちろん、これはサンプルだから何も届かないけど、
ちゃんとカスタムスロットに無いものはエラーにしないと、そのまま注文を受け取ったことになってしまうから、
注意が必要ということで。

# sampleを作ってわかったこと

    
- サンプルの3種類は以下の通り。主たる目的はこういうものなのかな。
    - 旅行の予約
    - 花屋のオーダー
    - 歯医者の予約

## 考えられる用途


- 保険の見積もり
- 通販サイトのパスワード忘れた
- 美容院の予約
- ゲームの進行不具合の通報
- ゲームのチート疑惑の通報
- ゲーム掲示板の炎上の通報
- ゲームの..いかん、つい仕事が

これがFacebookのお店のページに備わってたら、確かに気楽に呼び出しやすい。
でも受け取る側はどうなんだろう？ botが応答して解決しない場合もあるだろうし、ちゃんと過去の履歴を呼び出せるのかな？


## 大変そうな点
Sample UtterancesとSlot typesの用意が大変そう。

Sample Utterancesとは、ユーザーがこういったらこの部分をパラメタとして受け取るという設定。花屋の予約sampleでは2個しかなかったけど、こんなんで済むはずがない。

- I would like to pick up flowers
- I would like to order some flowers


様々な言い方を網羅しておかないと、「おっしゃることがわかりません」を連発するポンコツbotになってしまう。
（参考動画 [Virgin Flight - Saturday Night Live](https://www.youtube.com/watch?v=EcwcU0ZG8nk)）

Slot typesは、ユーザーの返答の中から受け付けるキーワードの種類で、花屋の予約sampleでは花の種類3つが該当する。だがこんな少なくて済むはずがない。3種類しか売ってない花屋っていうのだったら別だけど。
- roses
- lilies
- tulips

Sample utterancesもSlot TypesもAlexa Skillsにも同様の設定項目があり、これらをいかにきめ細かに定義できるかでbotの優秀さが決まると思う。

# まとめ

- AWSのlexを使ってchatbotが作れる。
- 連携先は、Facebook、Twilio SMS、slackが選べる。ただし音声入力は、声の入力装置があるプラットフォームじゃないとダメ。（Twilioは電話と連携してるから、これが候補か。）
- Utterancesとslot typesをちゃんと定義しないと、ポンコツbotになってしまう。人工知能というより人工無能。これはAlexa skillsも同じ。
- しゃべった言葉を分解してテキストにするところが人工知能。ここはブラックボックス。
- サンプルでは必要なかったが、ちゃんとbotを作るときにはLambda関数も書く必要がある。（http://docs.aws.amazon.com/ja_jp/lex/latest/dg/getting-started-ex2.html）
- botの会話ログを見るのってどうするんだろ？


以上！