Posted at

Amazon EchoのAlexa Skills Kitを試す

More than 3 years have passed since last update.

Amazon Echoを手に入れました。2015年7月時点では、まだ、日本語対応はされてないので、英語のみで、Amazon.comでのみ購入できます。

echo.jpg

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

Alexa, play some Prime MusicとかAlexa, what's the weather in Tokyoとか、Amazon Echoに話しかけると答えが返って来ます。

他にもデバイスをコントロールできるのですが、コントロールできるデバイスは決まっているようでここで確認できます。

もう少し自由にデバイス接続ができるとうれしいですね。

Amazon Echoの面白いのは、Alexa Skills Kit (ASK)を使うと新しいスキルをAmazon Echoに教えこむことができるのです。しかも、AWS Lambdaと連携して!つまり、自分でプログラミングできるのです。

楽しみですね。

ひとまず、セットアップをします。

といっても簡単ですが。。


モバイルアプリのダウンロードとセットアップ

このサイトにiPhoneかAndroid端末で接続するとそれにあったアプリケーションがダウンロードできるます。2015年7月時点では、USにお住まいの方しかダウンロードできないので、一旦、IDの設定をUSにしてダウンロードする必要があります。

あとは、ウィザード形式でAmazon Echoのセットアップ(Wifiのセットアップ)をするだけですぐ使えます。

簡単ですね!


Alexa Skills Kitのサンプルを試す

さて、ここからが本番です。

Alexa Skills KitのDeveloping an Alexa Skill as a Lambda Functionに従って、動かしてみましょう。

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

1.Lambda Functionの設定

Management Consoleにログインし、US Eastを選択、AWS Lambdaを選択します。

echo1.png

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

echo2.png

Select blueprintのalexa-skills-kit-color-expertを選択します。

サンプルが事前に用意されているのはとても楽ですね。

ウィザードを進めます(Event sourceはデフォルトのまま)。

echo3.png

Function名を任意に設定し、Roleは、Basic Execution Roleとし、タイムアウトは、60秒にしました。

確認画面後、Create FunctionでLambda Functionが作成されます。

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

echo4.png

Amazon EchoにSkillをセットするためにAmazon Developer Portalにログインします。

初めての人はアカウント登録が必要かもしれません。

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

echo5.png

Add a New Skillボタンをクリックします。

名前とInvocation Name及びEndpointを入力します。

Endpointは、先ほどコピーしておいたLambda FunctionのARNをペーストします。

Nameは任意の名前でいいのですが、Invocation Nameは、Amazon Echoに尋ねるときの名前になるので慎重に選択します。Invocation Nameの名前の付け方についてはこちらのドキュメントで確認してください。

簡単に説明すると、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を使いこなすために重要そうです。ぜひ、こちらのドキュメントに目を通すことをお勧めします。

入力が終わったらEchoを使ってテストをします。

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

いい感じですね。

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を使っていてセッションデータの共有ってどうなっているのか気になります。

同じコンテナに行く前提なのだろうか?

この辺りはもう少し掘り下げよう。


免責

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