遂にGAとなった Amazon Lex をiOS SDKから使用してみました。

eyecatch-lex

1 はじめに

2017/04/20に一般公開となったAmazon Lex(以下、Lex)は、既に、ここDevelopers.IOでもいくつか紹介されています。

一般公開されたAmazonのAIサービスLexでFacebook MessengerのBotをつくってみた
【新機能】Amazon LexがGA(一般利用開始)に!Slackに入れて使ってみた
Amazon Lexのプレビューが通ったので使ってみた

Botの作成方法などは、先の記事を参考にさせて頂くとして、私は、同時に公開されたSDKで、iPhoneからLexのBotを使ってみたので、これを紹介させて下さい。

最初に動作しているようすです。音声入力に対して音声で返答するBotです。SDKは、非常に良く出来ており、このようなものが、ほんの数行で書けてしまいます。

2 Botの作成

Botの方は、最初から用意されているサンプルの一つである、「OrderFlowers」をそのまま利用させて頂きました。

002

特に、提供されたテンプレートから変更することなく、テストを行うところまで進めますが、ここで指定した Bot name (今回は、BotSampleとしました)は、後ほどiPhoneアプリの作成時に必要となるので記憶しておきます。

006

テストで動作が確認出来たら、Publishボタンで公開しますが、ここで指定する alias(今回は、BotSampleAliasとしました)も、iPhoneアプリ作成で必要ですので、記録しておいて下さい。

008

今回のサンプルでは、最終的なアクションは構築しませんので、Botの作成作業は、ここで終了とします。

3 Identity poolの作成

iPhoneからAWSのリソースであるLexを使用するためには、権限が必要ですが、ここでは、CognitoからIdentity poolを発行し、Roleで権限を付与します。

011

今回は、匿名でのログイン(ゲストユーザ)で使用しますので、Enable access to unauthenticated identitiesにチェックを入れておきます。

012

その他の設定は、デフォルトのまま進めて作成を完了し、 Sample codeのところで表示されるIdentity Pool IDをコピーしておきます。これも、iPhoneアプリの作成で必要となります。

014

なお、ここまでの操作で作成されたIdentity poolのRoleには、特に権限が付与されていませんので、Dashboardから編集画面を開いて、Unauthenticated roleの名前を確認します。(ここでは、Cognito_BotSampleIdentityUnauth_Roleとなっていました)

016

続いて、IMAのRolesで、当該Roleを編集し、PermissionsAmazonLexFullAccessを追加します。

017 020

4 iPhoneアプリの作成

準備が揃ったので、いよいよiPhoneアプリの作成です。

SDKは、CocoaPodsで簡単に導入できます。AWSLex及び、AWSCognitoだけが記載されていますが、AWSCoreは依存関係で自動的に入ります。

source 'https://github.com/CocoaPods/Specs.git'
target 'BotSampleApp' do
  platform :ios, '9.0'
  use_frameworks!
     pod 'AWSLex'
     pod 'AWSCognito'
end

iOS 10以降では、マイクの利用に許可が必要ですので、info.plistに以下の行を追加します。

<key>NSMicrophoneUsageDescription</key>
<string>For interaction with Amazon Lex</string>

CognitoによるIdentity発行と権限取得、そして、Lexの初期化は下記のとおりです。ここで、先の作業で取得した、Bot nameBot Aliaspool IDが、それぞれ使用されることになります。

import AWSCore
import AWSLex

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let poolId = "us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
        let credentialsProvider = AWSCognitoCredentialsProvider(regionType:.USEast1,identityPoolId:poolId)
        let configuration = AWSServiceConfiguration(region:.USEast1, credentialsProvider:credentialsProvider)
        AWSServiceManager.default().defaultServiceConfiguration = configuration

        let BotName = "BotSample"
        let BotAlias = "BotSampleAlias"
        let chatConfig = AWSLexInteractionKitConfig.defaultInteractionKitConfig(withBotName: BotName, botAlias: BotAlias)

        AWSLexInteractionKit.register(with: configuration!, interactionKitConfiguration: chatConfig, forKey: "AWSLexVoiceButton")

        chatConfig.autoPlayback = false

        AWSLexInteractionKit.register(with: configuration!, interactionKitConfiguration: chatConfig, forKey: "chatConfig")
    }
}

最後に、Botを開始するボタンの配置ですが、こちらも、予め機能を実装したものが提供されています。

ストーリーボードでUIViewを配置し、Custom ClassをAWSLexVoiceBottnに設定するだけです。

021

5 最後に

提供されているSDKは、非常に良く出来ており、簡単な作業でLexのボットを試すことが出来ました。

これで、気楽にBotを楽しめそうです。

6 参考リンク


Amazon Lex: Use Natural Language to Trigger Business Workflows
Amazon Lex > Developer Guide > What Is Amazon Lex
aws/aws-sdk-ios

AWS Cloud Roadshow 2017 福岡