ビルトインインテントを実装する

ビルトインインテントを実装する

Alexa Skills Kitは、ビルトインインテントのライブラリを提供します。これらのインテントは、サンプル発話を入力せずに、カスタムスキルで使うことができます。

ビルトインインテントの概要

たとえば、ビルトインのAMAZON.HelpIntentは、スキルのヘルプをリクエストする一般的な言い方に自動的にマッピングされます。このインテントの使用を選択すると、ユーザーは「ヘルプ」などと言うことでスキルを呼び出すことができ、Alexaサービスはお使いのサービスにAMAZON.HelpIntentIntentRequestを送信します。お使いのサービスは、このインテントをスキルに合った方法で処理します。

同様に、ビルトインインテントAMAZON.SearchAction<object@WeatherForecast>は、天気予報をたずねる共通の方法に自動でマッピングされます。このインテントを実装すると、ユーザーが「神戸の天気は?」と言うことで、Alexaサービスがお使いのサービスにAMAZON.SearchAction<object@WeatherForecast>IntentRequestを送信します。このときスロット値には、「神戸」が入ります。

ビルトインインテントが便利な理由はいくつかあります。

  • インテント用にサンプル発話を記述する手間が省けます。
  • ユーザーは、さまざまなスキルに共通した、一貫したフレーズを使ってインテントにアクセスできるため、スキルを簡単に操作できます。
  • Alexaサービスの音声認識機能向上やインテントのサンプル発話に更新があった場合にそのメリットを活用できます。

ビルトインインテントライブラリは、以下の一般的なカテゴリーに分類されます。

利用可能なすべてのビルトインインテントのリファレンスについては、ビルトインインテントライブラリを参照してください。

ビルトインインテントを実装する

ビルトインインテントを実装するには、インテントをインテントスキーマに追加し、コードでインテントを処理します。

ビルトインインテントの検索

ビルトインインテントは開発者コンソールのビルドページから検索できます。カスタム>対話モデル>インテントの順に移動し、新しいインテントを追加して、Alexaのビルトインライブラリから既存のインテントを使用オプションを選択します。

インテント名を指定する際は、AMAZON名前空間を含めてください。たとえば、以下のスキーマには、2つのカスタムインテントと3つのビルトインインテントが含まれます。ビルトインの以下のセットを、天気予報を取得するスキルで使用します。

  • AMAZON.SearchAction<object@WeatherForecast>
  • AMAZON.CancelIntent
  • AMAZON.HelpIntent
  • AMAZON.StopIntent

次の例では、インテントスキーマに4つのビルトインインテントと、WeatherOnThisDayというカスタムインテントが含まれます。

{
  "interactionModel": {
    "languageModel": {
      "invocationName": "マイ天気",
      "intents": [
        {
          "name": "AMAZON.CancelIntent",
          "samples": []
        },
        {
          "name": "AMAZON.HelpIntent",
          "samples": []
        },
        {
          "name": "AMAZON.StopIntent",
          "samples": []
        },
        {
          "name": "AMAZON.SearchAction<object@WeatherForecast>",
          "samples": []
        },
        {
          "name": "WeatherOnThisDay",
          "slots": [
            {
              "name": "PastYear",
              "type": "AMAZON.FOUR_DIGIT_NUMBER"
            }
          ],
          "samples": [
            "{PastYear}の今日の天気を教えて",
            "{PastYear}の天気はどうだった"
          ]
        }
      ],
      "types": []
    }
  }
}

開発者コンソールとSkill Management APIに互換性がある完全なインテントスキーマについては、対話モデルのスキーマを参照してください。

カスタムインテントの場合と同様に、コードでビルトインインテントを処理します。スキーマ内のすべてのインテントにハンドラーを含めてください。次の例は、4つのビルトインインテントと1つのカスタムインテントを含む対話モデルのインテントハンドラーです。

クリップボードにコピーされました。

このサンプルコードはAlexa Skills Kit SDK for Node.js (v2)を使用しています。

const WeatherOnThisDayHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'WeatherOnThisDay';
    },
    handle(handlerInput) {
        const speakOutput = 'WeatherOnThisDayインテントを呼び出しました。';

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};

const WeatherForecastHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.SearchAction<object@WeatherForecast>';
    },
    handle(handlerInput) {
        const speakOutput = 'ビルトインの天気予報インテントを呼び出しました。';

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};


const HelpIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.HelpIntent';
    },
    handle(handlerInput) {
        const speakOutput = 'この日の現在の天気や過去の天気をたずねることができます。 どうぞ。';

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};


const CancelAndStopIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && (Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.CancelIntent'
                || Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.StopIntent');
    },
    handle(handlerInput) {
        const speakOutput = 'さようなら。';

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .getResponse();
    }
};

クリップボードにコピーされました。

このサンプルコードはAlexa Skills Kit SDK for Pythonを使用しています。

class WeatherOnThisDayHandler(AbstractRequestHandler):
    """WeatherOnThisDayインテントのハンドラー"""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("WeatherOnThisDay")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response

        # ハンドラーのロジックをここに書きます。この例では、
        # ユーザーが呼び出したインテントを示すプレースホルダーだけを返します。

        speak_output = "WeatherOnThisDayインテントを呼び出しました。"

        return (
            handler_input.response_builder
                .speak(speak_output)
                # .ask("ユーザーが応答できるようセッションを開いたままにする場合はここに再プロンプトを追加してください")
                .response
        )

class WeatherForecastHandler(AbstractRequestHandler):
    """AMAZON.SearchAction<object@WeatherForecast>インテントのハンドラー"""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("AMAZON.SearchAction<object@WeatherForecast>")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response

        # ハンドラーのロジックをここに書きます。この例では、
        # ユーザーが呼び出したインテントを示すプレースホルダーだけを返します。

        speak_output = "ビルトインの天気予報インテントを呼び出しました。"

        return (
            handler_input.response_builder
                .speak(speak_output)
                # .ask("ユーザーが応答できるようセッションを開いたままにする場合は再プロンプトを追加してください")
                .response
        )

class HelpIntentHandler(AbstractRequestHandler):
    """Helpインテントのハンドラー"""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("AMAZON.HelpIntent")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
 speak_output = "この日の現在の天気や過去の天気をたずねることができます。 どうぞ。"

        return (
            handler_input.response_builder
                .speak(speak_output)
                .ask(speak_output)
                .response
        )


class CancelOrStopIntentHandler(AbstractRequestHandler):
    """CancelおよびStopインテントの単一ハンドラー"""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return (ask_utils.is_intent_name("AMAZON.CancelIntent")(handler_input) or
                ask_utils.is_intent_name("AMAZON.StopIntent")(handler_input))

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        speak_output = "さようなら。"

        return (
            handler_input.response_builder
                .speak(speak_output)
                .response
        )

クリップボードにコピーされました。

このサンプルコードはAlexa Skills Kit SDK for Javaを使用しています。

// これらのハンドラーのそれぞれは、Javaクラスです。

/**
 * *****************************************
 * WeatherOnThisDayHandlerクラス
 * *****************************************
 */

package handlers;

import com.amazon.ask.dispatcher.request.handler.HandlerInput;
import com.amazon.ask.dispatcher.request.handler.RequestHandler;
import com.amazon.ask.model.Response;

import java.util.Optional;

import static com.amazon.ask.request.Predicates.intentName;

public class WeatherOnThisDayHandler implements RequestHandler {

    @Override
    public boolean canHandle(HandlerInput input) {
        return input.matches(intentName("WeatherOnThisDay"));
    }

    @Override
    public Optional<Response> handle(HandlerInput input) {

        // ハンドラーのロジックをここに書きます。この例では、
        // ユーザーが呼び出したインテントを示すプレースホルダーだけを返します。

        String speechText = "WeatherOnThisDayインテントを呼び出しました。";
        return input.getResponseBuilder().withSpeech(speechText).build();
    }

}

/**
 * *****************************************
 * WeatherForecastHandlerクラス
 * *****************************************
 */

package handlers;

import com.amazon.ask.dispatcher.request.handler.HandlerInput;
import com.amazon.ask.dispatcher.request.handler.RequestHandler;
import com.amazon.ask.model.Response;

import java.util.Optional;

import static com.amazon.ask.request.Predicates.intentName;

public class WeatherForecastHandler implements RequestHandler {

    @Override
    public boolean canHandle(HandlerInput input) {
        return input.matches(intentName("AMAZON.SearchAction<object@WeatherForecast>"));
    }

    @Override
    public Optional<Response> handle(HandlerInput input) {

        // ハンドラーのロジックをここに書きます。この例では、
        // ユーザーが呼び出したインテントを示すプレースホルダーだけを返します。

        String speechText = "ビルトインの天気予報インテントを呼び出しました。";
        return input.getResponseBuilder().withSpeech(speechText).build();
    }

}

/**
 * *****************************************
 * HelpIntentHandlerクラス
 * *****************************************
 */

package handlers;

import com.amazon.ask.dispatcher.request.handler.HandlerInput;
import com.amazon.ask.dispatcher.request.handler.RequestHandler;
import com.amazon.ask.model.Response;

import java.util.Optional;

import static com.amazon.ask.request.Predicates.intentName;

public class HelpIntentHandler implements RequestHandler {

    @Override
    public boolean canHandle(HandlerInput input) {
        return input.matches(intentName("AMAZON.HelpIntent"));
    }

    @Override
    public Optional<Response> handle(HandlerInput input) {
        String speechText = "この日の現在の天気や過去の天気をたずねることができます。 どうぞ。";
        return input.getResponseBuilder()
                .withSpeech(speechText)
                .withSimpleCard("HelloWorld", speechText)
                .withReprompt(speechText)
                .build();
    }
}

/**
 * *****************************************
 * CancelandStopIntentHandlerクラス
 * *****************************************
 */

package handlers;

import com.amazon.ask.dispatcher.request.handler.HandlerInput;
import com.amazon.ask.dispatcher.request.handler.RequestHandler;
import com.amazon.ask.model.Response;

import java.util.Optional;

import static com.amazon.ask.request.Predicates.intentName;

public class CancelandStopIntentHandler implements RequestHandler {
    @Override
    public boolean canHandle(HandlerInput input) {
        return input.matches(intentName("AMAZON.StopIntent").or(intentName("AMAZON.CancelIntent")));
    }

    @Override
    public Optional<Response> handle(HandlerInput input) {
        String speechText = "さようなら";
        return input.getResponseBuilder()
                .withSpeech(speechText)
                .withSimpleCard("HelloWorld", speechText)
                .build();
    }
}

Alexaサービスからのリクエストを処理する方法の詳細については、Alexaから送信されたリクエストを処理するを参照してください。

ユーザーは、標準の共通フレーズを言うことで、ビルトインインテントをリクエストします。このため、サービスは、意図した目的に対して一貫した方法でインテントを処理する必要があります。たとえば、ヘルプに関連しない他の機能をAMAZON.HelpIntentに追加すると、ヘルプが提供されることを想定して「ヘルプ」、または「何ができるの?」などの単語を言ったユーザーは混乱してしまいます。 AMAZON.SearchAction<object@WeatherForecast>インテントを含める場合、ユーザーは、インテントハンドラーにより天気情報が提供されるように「天気予報は何ですか」というフレーズを使用できます。

ビルトインインテントの意図する目的とサンプル発話を判断するには、ビルトインインテントライブラリおよび標準ビルトインインテントを参照してください。

ビルトインインテントの代わりにカスタムインテントを使用する

AMAZON.StopIntentを実装する必要があります。他のビルトインインテントの実装は推奨ではありますが、任意です。インテントスキーマにビルトインインテントを含めない場合、たとえユーザーがビルトインインテントのフレーズを言ったとしても、Alexaサービスがサービスにそのインテントを送信することは決してありません。

これらのフレーズを、サンプル発話の中で独自に作成したカスタムインテントにマッピングすることはできます。たとえば、MyHelpIntentインテントを作成して、以下のようなサンプル発話を記述することができます。

ヘルプ
どうすればいいの
何を聞けばいいの

サービスは、これらのフレーズがビルトインのAMAZON.HelpIntentと重複していたとしても、MyHelpIntentに対してIntentRequestを受け取ります。

ビルトインインテントのほうが、独自に作成したサンプル発話よりも幅広い範囲を網羅できるため、この方法は推奨されません。代わりに、ビルトインインテントを使い、スキル固有の発話で拡張します。

サンプル発話を追加してビルトインインテントを拡張する

追加のサンプル発話を追加することで、標準ビルトインインテントを拡張できます。ビルトインインテントの拡張は、スキル固有の発話を指定したい場合に便利です。

ビルトインインテントを拡張する

  1. Alexa開発者コンソールを開いて、ログインします。
  2. スキルタブのスキル名列で、カスタムスキルの名前をクリックします。
  3. 左側のサイドバーから、カスタム>対話モデル>インテントの横の追加をクリックします。
  4. Alexaのビルトインライブラリから既存のインテントを使用を選択します。
  5. ビルトインインテントを見つけてインテントを追加をクリックします。
  6. インテントを追加したら、左側のナビゲーションでそれを選択し、サンプル発話を入力します。

次の例は、ビルトインインテントを拡張したJSON対話モデルです。

{
  "name": "AMAZON.HelpIntent",
  "slots": [],
  "samples": [
    "タクシーの呼び方を教えて",
    "タクシーを呼ぶのを手伝って"
  ]
}

開発者コンソールとSkill Management APIに互換性がある完全なインテントスキーマについては、対話モデルのスキーマを参照してください。

この例では、ユーザーが次のいずれかを実行するたびに、AlexaがAMAZON.HelpIntentインテントをスキルに送信します。

  • スキルを呼び出して、ヘルプをリクエストするいずれかの標準的なリクエスト(「ヘルプ」、「使い方を教えて」など)を言った場合
  • スキルを呼び出して、カスタムフレーズのいずれか(「タクシーの呼び方を教えて」または「どうやってタクシーを呼ぶの」)を言った場合

ビルトインインテントへ移行する

Alexa Skills Kitの以前のバージョンでは、これらのビルトインインテントを提供していませんでした。独自バージョンのキャンセル、停止、ヘルプを実装しているかもしれません。その場合もこれらのカスタムインテントは引き続き動作しますが、今後、発話への改良が行われた場合にもメリットを受けられるよう、ビルトインインテントに移行してください。

スキルをビルトインインテントに移行する

  1. カスタムインテント名をビルトインインテント名に置換してインテントスキーマを更新します。
  2. カスタムインテントのサンプル発話を削除します。ただし、サンプル発話を追加してビルトインインテントを拡張するにあるとおり、スキル固有のサンプル発話は残しておくことができます。
  3. コードのインテントハンドラーをビルトインインテント名で更新します。

インテントと対話モデルについて:

スキルのサービスのエンコーディングについて: Alexaから送信されたリクエストを処理する