前回のブログ
前回はSDKのインストール方法と最終的にどういったフローになるかを紹介しました。
今回はユーザーが話しかけた時に、アレクサが処理するリクエストハンドラーについて紹介します。 リクエストハンドラーとはAmazon Developerで登録したインテントを処理するメソッドを指します。 どういうインテントの場合、どういう処理をする。という「どういうインテント」と「どういう処理」を記載する必要があります。
起動リクエストの作成
「アレクサ、○○を開いて」で起動する処理を作成します。 起動リクエストはスキルを公開するに当たり必須機能になります。 起動リクエストはインテントとは少し違いますが、感覚的にはデフォルトで定義されているインテントのような物だと考えてください。
前回作成しnpm installしたソースを置くフォルダに、"index.js"ファイルを作成して、次のソースをコピーしてください。
const Alexa = require('ask-sdk'); //起動リクエスト const LaunchRequestHandler = { canHandle(handlerInput) { console.log('called LaunchRequestHandler.canHandle'); return handlerInput.requestEnvelope.request.type === 'LaunchRequest'; }, handle(handlerInput) { console.log('called LaunchRequestHandler.handle'); return handlerInput.responseBuilder .speak('スキルを起動しました。こんにちは、と言ってください') .reprompt('こんにちは、と言ってください') .getResponse(); } }; exports.handler = Alexa.SkillBuilders.standard() .addRequestHandlers(LaunchRequestHandler) //起動リクエスト .lambda();
「アレクサ、○○を起動して」と言うと次のように処理が動きます。
addRequestHandlersでリクエストハンドラーを追加します。 このハンドラーには"canHandle"と"handle"メソッドが定義してある必要があります。
次にcanHandleメソッドが呼ばれるので、起動リクエストかどうかを判定します。 'LaunchRequest'というリクエストが飛んでくるので、上記ではそれで判定しています。
次にhandleメソッドが呼ばれます。 speakメソッドでアレクサが話す言葉を書いており、 repromptメソッドを追加することで連続してアレクサと会話できるようになります。 v1でいうところの":ask"に当たります。
起動リクエストは必ずrepromptを入れる必要があります。 無い場合、スキルは動きますがAmazonへの公開申請が通りません。
この場合、アレクサが返答したあと5秒ほど放っておくと「こんにちは、と言ってください」と催促するメッセージが流れます。
実際に動かしてみるとCloudWatchにログが出力されるため、メソッドの呼び出し順が確認できると思います。
ヘルプリクエストの作成
「アレクサ、○○の使い方教えて」で起動する処理を作成します。 ヘルプリクエストはスキルを公開するに当たり必須機能になります。
index.jsに次のコードを追加してください。
const HelpIntentHandler = { canHandle(handlerInput) { console.log('called HelpIntentHandler.canHandle'); return handlerInput.requestEnvelope.request.type === 'IntentRequest' && handlerInput.requestEnvelope.request.intent.name === 'AMAZON.HelpIntent'; }, handle(handlerInput) { console.log('called HelpIntentHandler.handle'); return handlerInput.responseBuilder .speak('挨拶をしますので、こんにちは、と言ってください。さぁどうぞ。') .reprompt('こんにちは、と言ってください。さぁどうぞ。') .getResponse(); } }; exports.handler = Alexa.SkillBuilders.standard() .addRequestHandlers(LaunchRequestHandler, HelpIntentHandler)//ヘルプリクエスト .lambda();
const HelpIntentHandler はexports.handlerより上であれば、どこに入れても構いません。
「アレクサ、○○の使い方教えて」というと次のように処理が動きます。
addRequestHandlersでリクエストハンドラーを追加します。 addRequestHandlersはいくつでもハンドラーを追加することができ、登録した順番にcanHandleが呼ばれていきます。
最初にLaunchRequestHandlerのcanHandleメソッドが呼ばれます。 「使い方を教えて」というヘルプインテントの場合、"IntentRequest"というリクエストが飛んで来るため、canHandleはFalseを返します。
次にHelpIntentHandlerのcanHandleメソッドが呼ばれます。 "AMAZON.HelpIntent"というインテント名でリクエストが飛んで来るため、これで判定します。
次にHelpIntentHandlerのhandleメソッドが呼ばれます。 ヘルプリクエストは必ずrepromptを入れる必要があります。 無い場合、スキルは動きますがAmazonへの公開申請が通りません。
ストップorキャンセルリクエストの作成
「アレクサ、ストップ」で起動する処理を作成します。
ストップorキャンセルリクエストはスキルを公開するに当たり必須機能になります。
const CancelAndStopIntentHandler = { canHandle(handlerInput) { console.log('called CancelAndStopIntentHandler.canHandle'); return handlerInput.requestEnvelope.request.type === 'IntentRequest' && (handlerInput.requestEnvelope.request.intent.name === 'AMAZON.CancelIntent' || handlerInput.requestEnvelope.request.intent.name === 'AMAZON.StopIntent'); }, handle(handlerInput) { console.log('called CancelAndStopIntentHandler.handle'); return handlerInput.responseBuilder.getResponse(); } };
ヘルプリクエストなどと同じなのでaddRequestHandlersの部分は省略しています。
「アレクサ、ストップ」というと ('IntentRequest' + 'AMAZON.CancelIntent')の組み合わせか ('IntentRequest' + 'AMAZON.StopIntent')の組み合わせでリクエストが飛んできます。
speakで返事を返してから終了してもいいですし、何も返事を返さずに終了しても大丈夫です。
セッション終了リクエストの作成
repromptでアレクサが返事を待ったけど、ユーザーが何も答えなかった場合に呼ばれます。 すでにスキルが終わった後にリクエストが飛んでくるので、ここで返答することはできません。 必須実装ではありませんが、セッションの内容をDBへ保存するなど、何かしらの処理が入ることが多いです。
const SessionEndedRequestHandler = { canHandle(handlerInput) { console.log('called SessionEndedRequestHandler.canHandle'); return handlerInput.requestEnvelope.request.type === 'SessionEndedRequest'; }, handle(handlerInput) { console.log('called SessionEndedRequestHandler.handle'); return handlerInput.responseBuilder.getResponse(); } };
ヘルプリクエストなどと同じなのでaddRequestHandlersの部分は省略しています。
何も返事を返せないため、ここはspeakなどは行わないで終了します。
独自リクエストの作成
「アレクサ、○○を開いて」→アレクサの返答→「こんにちは」等で起動する処理を作成します。
Amazon Developersで追加した独自インテントに対する処理を書きます。
独自リクエストは最低でも1つは必須実装になります。
const HelloIntentHandler = { canHandle(handlerInput) { console.log('called HelloIntentHandler.canHandle'); return handlerInput.requestEnvelope.request.type === 'IntentRequest' && handlerInput.requestEnvelope.request.intent.name === 'HelloIntent'; }, handle(handlerInput) { console.log('called HelloIntentHandler.handle'); return handlerInput.responseBuilder .speak('こんにちはインテントが呼ばれました。) .getResponse(); } };
ヘルプリクエストなどと同じなのでaddRequestHandlersの部分は省略しています。
「こんにちは」というと 'IntentRequest' + 独自インテントの組み合わせでリクエストが飛んできます。 上記では'HelloIntent'という名前のインテントで判定しています。
独自インテントは、スキルの個性になりますので特に制限はありません。 speakで返事を返してから終了してもいいですし、repromptで会話を続けても大丈夫です。
あとがき
今回はindex.jsにインテントの処理を追加しました。 ここまでで実装しなくてはいけない機能は十分に組み込んであるためスキル開発は可能です。 しかし次回紹介する前処理と後処理を追加することで、処理を共通化し綺麗に書くことができますのでご期待ください。