edaaaaankのぶろぐ

エンジニアとして意識高いブログ更新していきたいけど無理そう

Amazon Lex と Amazon Connectで上司の無駄話をぶった切るbotを作る

CyberAgent Developers Advent Calendar 2018 - Adventarの 19日目の記事です。

※私の職場では上司ととても良い関係を築けており、あくまでもネタブログとしてお読みください。

はじめに

edaaaaankです。
今年はブログを始めると決意してから書かずに2018年を終えてしまいそうだったので、おしり叩くためにAdvent Calendarに参加しました。なんとか間に合ってよかったですε-(´∀`)ホッ💦

今年、AWS re:Inventに参加してきました。

その時に「Create a Question and Answer Bot with Amazon Lex and Alexa」というタイトルのworkshopで、QnA botとコールセンターを作ったのですが、簡単に作れて面白かったので、今回復習することにしました。

ところで、巷では「無駄話が長い上司がいて帰るに帰れない」なんてことがあるみたいですね。
こんな悩みを抱えている人のために何か良い案がないか考え、さもslackで仕事のやりとりをするように見せかけて自分に電話をかけて、無駄話をぶったぎるbotを作ってみることにしました。
その名も電話かける君bot
ちなみに私は会社の上司と良い関係を築いているので必要に迫られることはなさそうです。

workshopではCloudFormationである程度環境設定がされた状態だったので、今回は一から作ってみようと思います。

ちなみに本当は今年発表されたAmazon Parsonalizeについて書きたかったのですが、間に合わなかったので別記事でかければと思います...!

Amazon Lexとは

AWSの公式URLから説明を拝借しまして。。。

Amazon Lexは、音声やテキストを使用して、任意のアプリケーションに対話型インタフェースを構築するサービスです。
また、Amazon Alexaに採用されている深層学習技術と同じ技術を利用することができるので、事前言語での高度な対話ボットを短時間で簡単に構築できます。

【Amazon Lex】人工知能を活用した会話型インターフェイス | AWS

Amazon LexはAlexaとの連携も可能であるため、音声とテキストチャットでのアクセスの両方をサポートすることも可能です。イイネ!

Amazon Connectとは

こちらも公式URLから説明を拝借。。。

Amazon Connectは、セルフサービスのクラウド型コンタクトセンターで、簡単に低コストでカスタマーサービスを提供できるようにします。

Amazon Connect(簡単に使えるクラウド型コンタクトセンター)|AWS

実際にAmazonのコールセンターで使われてる技術を我々も使うことができるのだそうです。すごい!

例えばクレジットカード会社に電話をかけると、カスタマーサービスの人につながる前に、どういう問い合わせなのかシステマチックに聞かれますよね。 そういった問い合わせフローをGUIから簡単に作成することができます。

Amazon ConnectはAmazon Lexとの連携が可能なので、サービス内のカスタマーサポート用のチャットを用意し、お客様に合わせた問い合わせ対応することもできそうです。

また、Amazon Connectは12月12日に東京リージョンが発表され、050, 0800の番号だけでなく0120のフリーダイヤルを利用することが可能となりました。

電話をかけてくれるbotを作ってみる

前置きが長くなりましたが、これだけの素晴らしい機能でくだらないbotを作りたいと思います。

処理の流れとしてはこんな感じ。
①Slackでbotに「call me」と話しかける
②Slackと統合されたAmazon Lexが命令を受け取り、Lambda関数を実行
③Lambda関数からAmacon Connect APIを呼び出し、電話をかける

f:id:edaaaaank:20181219180256p:plain
電話かける君botの処理の流れ

電話番号の取得

まずはAmazon Connectでカスタマーサポートの管理ツールを登録します。

f:id:edaaaaank:20181219173307p:plain
Amazon Connect登録

f:id:edaaaaank:20181219130351p:plain
管理者の作成

f:id:edaaaaank:20181219130515p:plain
データストレージの作成

f:id:edaaaaank:20181219173418p:plain
登録完了

登録が完了したら、電話番号が発行できます。少ないステップで簡単に作成できました。

f:id:edaaaaank:20181219173548p:plain
電話番号の取得

電話を受けた時の対応フローを作成

次にお客様から電話がかかってきた時にどのような対応をするのか、対応フローを作成します。

対応フローには音声の再生、通話ログの有効、対応時間外での対応変更など、さまざまなフローが用意されており、これをGUIで簡単に編集することができます。

f:id:edaaaaank:20181219174631g:plain
問い合わせフローの作成

めっちゃ簡単ですよね?

感覚的に編集できるので、エンジニア以外の人でも問い合わせフローを作成できるのではないでしょうか。

今回はbotが電話をかけてきてくれて適当なことを言って、電話が切れてくれればいいので、下記のような問い合わせフローを作成しました。

f:id:edaaaaank:20181219131836p:plain
今回作成した問い合わせフロー

話したい文章をテキストで入力します。
今回は「ping ping ping ping ping ping bye!」と入力。本当は日本語で面白い言葉を話させたかったのですが、日本語はまだ対応がしきれていないのか、あまりちゃんと動作しなかったので、英語にしました。

Amazon Lexでbotを作成

次はAmazon Lexでbotを作成します。
Amazon Lexはまだ東京リージョンはなく、また日本語も対応されていないため、基本的に英語でのやりとりとなってしまいます。
Amazon Lexと Amazon Translateを組み合わせて日本語対応している方もいるようですが、Lexでも日本語が対応されると嬉しいですね!

予めsampleも用意されているので、簡単なbotであればすぐ作成可能です。
今回はcustom botを選択して登録しました。

f:id:edaaaaank:20181219132119p:plain
Amazon Lexのbot登録

botが登録されたら、「Sample utterances」でチャットで呼びかけるセリフを入力します。

Amazon ConnectのAPIを叩くためのlambdaを用意

lambda関数では下記コードを作成。

'use strict';

const AWS = require('aws-sdk');

module.exports.handler = (event, context, callback) => {
    var connect = new AWS.Connect({region: 'ap-northeast-1'});
    var params = {
        ContactFlowId: '{作成した問い合わせフローID}', 
        DestinationPhoneNumber: '{自分の電話番号}', 
        InstanceId: '{Amazon Connect管理ツールのinstanceId}',
        SourcePhoneNumber: '{Amazon Connectで発行した電話番号}'
    };
    connect.startOutboundVoiceContact(params, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data);           // successful response
    });
    var response = {
        sessionAttributes: event.sessionAttributes,
        dialogAction: {
            type: 'Close',
            fulfillmentState: 'Fulfilled',
            message: {
                contentType: 'PlainText',
                content: "OK, I call!"
            }
        }
    };
    callback(null, response);
};

lambda関数からAmazon LexとAmazon Connectのアクセス許可が必要となるため、ロールに追加します。 関数を作成したら、bot側に関数を指定します。

f:id:edaaaaank:20181219160152p:plain
lambda関数の登録

Amazon Lexをslackで呼び出せるようにする

Amazon Lexはslackやfacebook messanger、twillio SMSなどと統合することが可能です。
今回のbotのテーマとしては、さも仕事のやりとりをしているかのようにチャットを使いながらbotを呼び出すことなので、slackでlexを起動させることにしました。

f:id:edaaaaank:20181219134534p:plain
Amazon LexとSlackを統合する

Slack側の細かい連携フローはこちらを参考にしました。

Amazon Lex ボットと Slack との統合 - Amazon Lex

作業は以上です。

自分のSlackチームにbotが追加されたら、さっそく「call me」してみます。

f:id:edaaaaank:20181219160731g:plain
都合のいいときに電話をかけてくれる電話かける君bot

「OK, I call!」のあと1,2秒後に、私宛に電話がかかってきて「pingpingpingbye!」と一方的に電話をきってきました!
ちなみに、このbot、電話に出ないで切ってしまうと、30秒後にしつこく電話をかけなおしてきます。
「電話なんかほっておいて話を聞け!」みたいな雰囲気でも「こんなに何度もかかってくるのは緊急なのでは!?」と思わせてくれそうですね!

最後に

今回はかなりシンプルな処理のbotを作りましたが、システム障害が発生した時に電話をかけて、障害発生内容を聞くことができる、なんてことも可能そうです。

みなさんはもっと有意義な使い方をしてください。