先日AWSで公開されたBlogで興味深いエントリーがありました。
「Create New Voice-Driven Capabilities for Alexa with AWS Lambda」
TechCrunchの紹介記事はこちら
Amazon、AlexaとEchoをアンバンドル、それぞれをサードパーティーに公開―1億ドルの支援ファンドも
先のブログで発表されたのは、以下の3つのこと。
今回はこの内のAlexa Skills Kitについて、調べてみた。
そもそもAlexaって何って?
AlexaはAmazon Echoに採用されているクラウドベースの音声認識サービスです。
どのようにしてユーザーがAlexa Skillを使うか
Getting Started with the Alexa Skills Kitの図によれば、ユーザーが「Alexa, ask Greeter to say hello world.」と質問すると、Alexaがこの文脈を以下のように解析します。
-
Alexa
はセッションの開始を意味します -
ask 〜1〜 to 〜2〜
は、Alexaがサポートしているフレーズの文脈 -
〜1〜
にはinvocation name
と呼ばれる機能を識別する名称が入る -
〜2〜
はinvocation name
という機能に対して渡される質問やコマンド
このように、Alexaが対応しているフレーズに沿って話しかけることで、特定の機能に対して指示をだすことが出来ます。
Amazon Alexa Skills Kitはどのように使うか
Lambdaファンクションの作成
発表ではLambdaを使えるということだったので、こちらのドキュメントを参考に進めます
Developing an Alexa Skill as a Lambda Function
Lambdaファンクションをus-east-1
に作成します。
(Amazon Alexa Skillsが対応しているリージョンはus-east-1
だけです)
作成するLambdaファンクションのCode Template
はAlexa Skills Kit Color Expert
を選択します。
Lambdaファンクションの編集画面でSample Event
としてドロップダウンにAlexa
用のサンプルが3つ追加されています。
Sample EventでAlexa Intent - MyColorls
を実行してみます。
"request": {
"type": "IntentRequest",
"requestId": "request5678",
"intent": {
"name": "MyColorIsIntent",
"slots": {
"Color": {
"name": "Color",
"value": "blue"
}
サンプルのJSONでは、request typeがIntentRequest
となっているので、ファンクションのソースを覗くと、以下の判定によりonIntentが呼び出されるのがわかります。
} 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") {
onIntentの中では、Sample Eventで指定されているintent nameのMyColorIsIntent
が実行されるようになっています
function onIntent(intentRequest, session, callback) {
console.log("onIntent requestId=" + intentRequest.requestId
+ ", sessionId=" + session.sessionId);
var intent = intentRequest.intent,
intentName = intentRequest.intent.name;
// Dispatch to your skill's intent handlers
if ("MyColorIsIntent" === intentName) {
setColorInSession(intent, session, callback);
} else if ("WhatsMyColorIntent" === intentName) {
setColorInSessionの中では、Sample Eventで指定されている、slots Colorがある場合は、I now know your favorite color is〜
とEventで指定した色が含まれた返事が生成されます。
つまり、Alexaに対してAlexa, my favorite color is blue
と問いかけるとSample EventのようなデータがLambdaファンクションに渡されてきます。
Lambdaで処理した結果、I now know your favorite color is blue. You can ask me your favorite color by saying, what's my favorite color?
が呼び出し元(Amazon Echoなど)に返されます。
Alexa Skillsを登録する
実際に作成したLambdaファンクションをAmazon Echoから実行するには、Alexa Skillsを登録する必要があります。
Alexa Skillsを作るにはdeveloper portalにアカウントが作られている必要があります。
ダッシュボードのAlexaからAdd a New skill
ボタンをクリックします。
-
Name
:Echo Appに表示される名称 -
Invocation Name
:Alexaに対して実行させる機能を識別するための名称- 名称は重複してはなりません。ガイドライン
-
Version
:バージョン -
Endpoint
:LambdaファンクションのARNを入力します
Skillが登録されるとApplication IDが発行されるので、このIDをLambdaファンクションに書きます。
さっきのサンプルはLambda上で動かすだけだったので、ソース上でコメントアウトされていましたが、実際に外部から呼び出す場合は、Application IDが必須となります。
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");
}
*/
これでテスト用のAmazon Echoを登録して、実行できるようになるみたいですが、、、
Amazon Echoを持っていないので、試すことが出来ません。。
ほしいな〜〜
あとがき
Amazon Alexaを利用することで、音声から新しいサービスを利用できるようになるわけですが、現状はAmazon EchoとEcho Appしか対応していません。
しかし、今回の発表では音声入力するデバイス側に対してもAlexa Voice Servicesとして提供されるので、Alexaを使うデバイスと、Alexaを介してオリジナルのサービスを提供する事が可能な環境が出来上がります。
新しいスタートアップが登場して、今までにないサービスが提供されるかもしれませんね。