Amazon EchoのAlexa Skills Kitを試す

Amazon Echoを手に入れました。2015年7月時点では、まだ、日本語対応はされてないので、英語のみで、[Amazon.com](http://www.amazon.com/Amazon-SK705DI-Echo/dp/B00X4WHP5E)でのみ購入できます。


![echo.jpg](https://qiita-image-store.s3.amazonaws.com/0/60724/0c91a832-46f5-2539-5dfa-ef40c86c7672.jpeg "echo.jpg")

基本は、音声でコントロールします。例えば、

Alexa, play some Prime MusicとかAlexa, what's the weather in Tokyoとか、Amazon Echoに話しかけると答えが返って来ます。
他にもデバイスをコントロールできるのですが、コントロールできるデバイスは決まっているようで[ここ](http://www.amazon.com/gp/browse.html?node=11874301011)で確認できます。
もう少し自由にデバイス接続ができるとうれしいですね。
Amazon Echoの面白いのは、Alexa Skills Kit (ASK)を使うと新しいスキルをAmazon Echoに教えこむことができるのです。しかも、AWS Lambdaと連携して！つまり、自分でプログラミングできるのです。
楽しみですね。

ひとまず、セットアップをします。
といっても簡単ですが。。

## モバイルアプリのダウンロードとセットアップ
この[サイト](http://www.amazon.com/echosetup)にiPhoneかAndroid端末で接続するとそれにあったアプリケーションがダウンロードできるます。2015年7月時点では、USにお住まいの方しかダウンロードできないので、一旦、IDの設定をUSにしてダウンロードする必要があります。

あとは、ウィザード形式でAmazon Echoのセットアップ（Wifiのセットアップ）をするだけですぐ使えます。
簡単ですね！

## Alexa Skills Kitのサンプルを試す
さて、ここからが本番です。
Alexa Skills Kitの[Developing an Alexa Skill as a Lambda Function](https://developer.amazon.com/appsandservices/solutions/alexa/alexa-skills-kit/docs/developing-an-alexa-skill-as-a-lambda-function)に従って、動かしてみましょう。

2015年7月時点では、Alexa Skills Kitは、US East (N. Virginia) regionのみ対応しているとのことで、以後のAWS Lambdaのセットアップは、US East (N. Virginia)で行います。

１．Lambda Functionの設定
Management Consoleにログインし、US Eastを選択、AWS Lambdaを選択します。

![echo1.png](https://qiita-image-store.s3.amazonaws.com/0/60724/badb8c85-ba7f-eec6-c63e-01b216e86b90.png "echo1.png")

Create a Lambda Functionボタンをクリックします。

![echo2.png](https://qiita-image-store.s3.amazonaws.com/0/60724/f4f98599-990d-d5aa-8efd-b70c4ec5558f.png "echo2.png")

Select blueprintのalexa-skills-kit-color-expertを選択します。
サンプルが事前に用意されているのはとても楽ですね。
ウィザードを進めます（Event sourceはデフォルトのまま）。

![echo3.png](https://qiita-image-store.s3.amazonaws.com/0/60724/8460b964-8deb-7bd2-50b9-759207671b8f.png "echo3.png")

Function名を任意に設定し、Roleは、Basic Execution Roleとし、タイムアウトは、60秒にしました。
確認画面後、Create FunctionでLambda Functionが作成されます。

作成後、Lambda FunctionのARNをコピーしておきます。

![echo4.png](https://qiita-image-store.s3.amazonaws.com/0/60724/60f0546b-b8ea-4c8c-f268-ab2e136729f8.png "echo4.png")

Amazon EchoにSkillをセットするために[Amazon Developer Portal](https://developer.amazon.com/edw/home.html#/)にログインします。
初めての人はアカウント登録が必要かもしれません。

App & Serviceタブ、Alexaタブを選択します。

![echo5.png](https://qiita-image-store.s3.amazonaws.com/0/60724/95294770-757f-51c0-8e28-cdb275b9666d.png "echo5.png")

Add a New Skillボタンをクリックします。
名前とInvocation Name及びEndpointを入力します。
Endpointは、先ほどコピーしておいたLambda FunctionのARNをペーストします。

Nameは任意の名前でいいのですが、Invocation Nameは、Amazon Echoに尋ねるときの名前になるので慎重に選択します。Invocation Nameの名前の付け方については[こちら](https://developer.amazon.com/appsandservices/solutions/alexa/alexa-skills-kit/docs/choosing-the-invocation-name-for-an-alexa-skill)のドキュメントで確認してください。
簡単に説明すると、Alexa, ask {Invocation name} to ほげほげ、という形で実行することになります。
一度、パブリッシュすると変更ができません。

次に、Intent SchemaとSample Utterancesを設定します。
ここが結構重要です。
まず、Intent SchemaをJSON形式で設定します。
Intent Schemaとは、Amazon Echoから音声入力で入力されたデータをLambda Functionに入力するときの入力の型を定義しているものになります。
サンプルのLambda Functionには、3つのIntent（メソッドのようなもの）があるので、それぞれの入力型を定義します。ドキュメントにあるJSONをそのままコピペします。

Sample Utterancesは、それぞれのIntentがどのような文で起動されるのかを幾つかAmazon Echoにおしえるものです。

このIntent SchemaとSample Utterancesの考え方は、今後、Alexa Skill Kitを使いこなすために重要そうです。ぜひ、[こちら](https://developer.amazon.com/appsandservices/solutions/alexa/alexa-skills-kit/docs/defining-the-voice-interface)のドキュメントに目を通すことをお勧めします。
入力が終わったらEchoを使ってテストをします。

![echo6.png](https://qiita-image-store.s3.amazonaws.com/0/60724/906c1fb1-1d96-f787-94f3-cf3663e5fb35.png "echo6.png")

上記の画面の状態で、Amazon Echoに対して、Alexa, ask {Invocation Name} what's my favorite colorとか話すと、まず、好きな色教えろと返事があり、それに対して、my favorite color is blueを答えて、もう一度、what's my favorite colorと聞くと、my favorite color is blueがAmazon Echoから返って来ます。

この状態で、Management ConsoleのLambda FuncationのMonitoring機能をみると、Lambda Functionが呼び出されているのがわかります。

![echo7.png](https://qiita-image-store.s3.amazonaws.com/0/60724/d475c23c-0a16-da8d-0c4c-18e06020f0a0.png "echo7.png")

いい感じですね。

Get Startedとしては、サンプルもドキュメントも揃っているので理解しやすいですね。
ざっと、ソースの一部をみておきましょう。

```Node.js
exports.handler = function (event, context) {
    try {
        console.log("event.session.application.applicationId=" + event.session.application.applicationId);

        /**
         * Uncomment this if statement and populate with your skill's application ID to
         * prevent someone else from configuring a skill that sends requests to this function.
         */
        /*
        if (event.session.application.applicationId !== "amzn1.echo-sdk-ams.app.[unique-value-here]") {
             context.fail("Invalid Application ID");
         }
        */

        if (event.session.new) {
            onSessionStarted({requestId: event.request.requestId}, event.session);
        }

        if (event.request.type === "LaunchRequest") {
            onLaunch(event.request,
                     event.session,
                     function callback(sessionAttributes, speechletResponse) {
                        context.succeed(buildResponse(sessionAttributes, speechletResponse));
                     });
        }  else if (event.request.type === "IntentRequest") {
            onIntent(event.request,
                     event.session,
                     function callback(sessionAttributes, speechletResponse) {
                         context.succeed(buildResponse(sessionAttributes, speechletResponse));
                     });
        } else if (event.request.type === "SessionEndedRequest") {
            onSessionEnded(event.request, event.session);
            context.succeed();
        }
    } catch (e) {
        context.fail("Exception: " + e);
    }
};
```
LaunchRequest、IntentRequest、SessionEndedRequestというのが、Amazon Echoから来るようです。
これをみるとセッションの扱いや基本的なAlexa Skill Kitの流れがわかるので参考になります。
同一セッションで長い会話ができるのは面白いです。
しかし、Lambdaを使っていてセッションデータの共有ってどうなっているのか気になります。
同じコンテナに行く前提なのだろうか？
この辺りはもう少し掘り下げよう。

# 免責
こちらは個人の意見で、所属する企業や団体は関係ありません。