あなたのAlexaダッシュボード 設定

Alexaから送信されたリクエストを処理する

カスタムスキルのクラウドベースサービスを作成するには、主に次の処理を行うためのコーディングが必要です。

  • Alexaサービスから送信されるさまざまなタイプのリクエストを処理する。
  • リクエストに対して適切な応答を返す。

このドキュメントでは、リクエストのタイプと、それに対する応答の例を説明します。

このトピックのコード サンプルについて

サービスは、あらゆるプログラム言語でコーディングできます。Alexa Skills Kitでは、GitHubにJavaとJavascript両方のサンプルとライブラリを用意しています。

このトピックのコードサンプルは、このJavaライブラリを使用していますが、Javaライブラリの使用も、Javaによるコーディングも、必須ではありません

このJavaライブラリには、サービスが受け取るリクエストタイプごとに実装できるメソッドを含むSpeechletインターフェースが用意されています。Alexaサービスからリクエストを受け取ってSpeechletに送信するクラスは、サービスのホスティング方法によって次のように異なります。

  • サービスをAWS Lambda関数としてAWS LambdaAmazon Web Servicesのサービス)にデプロイする場合は、関数にハンドラーを指定します。このハンドラーは、ライブラリのSpeechletRequestStreamHandlerクラスを拡張して作成することができます。ハンドラーは、Speechletの適切なメソッド(onLaunch()onIntent()など)を呼び出してリクエストを送信します。
  • サービスを、クラウドプロバイダーにウェブサービスとしてデプロイする場合は、SpeechletServletクラスを拡張します。- このクラスは、HTTPリクエスト本文のシリアライズおよびデシリアライズを処理してSpeechletの適切なメソッド(onLaunch()onIntent()など)をリクエストに応じて呼び出すJava EEサーブレットを実装します。

Javaのサンプルは、amzn/alexa-skills-kit-javaリポジトリでいくつか参照できます。JavaのSpeechletは、Lambda関数またはウェブサービスとしてホスティングできます。

AlexaスキルにAWS Lambda関数を使用する場合、サポート対象言語にはJava、Python、Node.js、C#が含まれます。

Node.js用Alexa Skills Kitソフトウェア開発キット(SDK)

Githubで入手可能なNode.js用Alexa Skills Kit SDKがあります。このキットには説明とサンプルコードが含まれています。

サービスに対するリクエストの妥当性を検証する

ウェブサービスまたはLambda関数は、リクエストを受け取る前に、そのリクエストが当該サービスに向けたものかどうかを検証する必要があります。これにより、他人にエンドポイントアドレスを知られたり、エンドポイントを他人のスキルのコンフィギュレーションに使用されたり、そのコンフィギュレーションによって自分のサービスにリクエストを送信されたりすることを防止できます。

この検証を行うために、Alexaから送信されるすべてのリクエストには、アプリケーションIDが含まれています。このIDをチェックして、リクエストがそのサービスに対するものかどうかを検証できます。

スキルのアプリケーションIDを取得する

IDは、開発者ポータルで取得できます。

  1. 開発者ポータルにログインし、「Apps & Services」をクリックし、一番上のナビゲーションで「Alexa」をクリックして、Alexaセクションを開きます。
  2. リストで、IDを取得するスキルの「Edit」をクリックします。
  3. Skill Information」をクリックします。
  4. ページにアプリケーションIDが表示されます。

リクエストのアプリケーションIDがスキルのIDと一致することを検証する(Javaライブラリ)

JavaライブラリのSpeechletServletクラスを使用する場合は、このクラスによって、受信したリクエストのアプリケーションIDの検証が行われます。以下のシステムプロパティで、アプリケーションID、またはカンマで区切ったIDのリストを設定します。

com.amazon.speech.speechlet.servlet.supportedApplicationIds

リクエストのapplicationIdがこのプロパティのIDと一致しない場合、SpeechletServletはメソッドを呼び出さずに、HTTPエラーコード(400 Bad Request)を返します。このプロパティを空にすると、アプリケーションIDの検証は実行されません。開発中やテスト中は検証を無効にすることができますが、スキルをエンドユーザーに公開する際には、アプリケーションIDを設定して検証を有効にすることをお勧めします。

システムプロパティsupportedApplicationIdsは、ウェブサービスの起動時にJVMに引数を渡すことで設定できます。

  • Launcherクラス(サンプルで使われているLauncher.javaなど)を使用してEclipseでサービスを実行する場合は、以下のように実行構成にVM引数を追加できます。

    -Dcom.amazon.speech.speechlet.servlet.supportedApplicationIds=comma-separated-list-of-ids

  • Antスクリプトでアプリケーションを開始する場合、スクリプトの<java>タグ内に以下のプロパティを追加します。

      <java classname="Launcher" classpathref="java.sdk.classpath" fork="true">
          <sysproperty key="com.amazon.speech.speechlet.servlet.supportedApplicationIds"
                       value="comma-separated-list-of-ids" />
      </java>
    
  • Elastic Beanstalkでサービスをホスティングする場合、Elastic Beanstalkのコンソールでシステムのプロパティを設定できます。AWS Elastic Beanstalkにカスタムスキルのウェブサービスをデプロイするの「Elastic BeanstalkのJavaシステムプロパティを設定する」を参照してください。

JavaライブラリのクラスSpeechletRequestStreamHandlerを使用してAWS LambdaでSpeechletをホスティングする場合は、SpeechletRequestStreamHandlerクラスを拡張し、サポートするIDおよびSpeechletをクラスのコンストラクターに渡す必要があります。例:

public final class HelloWorldSpeechletRequestStreamHandler extends SpeechletRequestStreamHandler {
    private static final Set<String> supportedApplicationIds = new HashSet<String>();
    static {
        /*
         * このIDはhttps://developer.amazon.com/edw/home.html#/で確認できます 
         * 該当項目を「編集」する
         * Alexaスキルに対して行い、関係するアプリケーションIDをこのSetに含めてください。
         */
        supportedApplicationIds.add("amzn1.echo-sdk-ams.app.[unique-value-here]");
    }

    public HelloWorldSpeechletRequestStreamHandler() {
        super(new HelloWorldSpeechlet(), supportedApplicationIds);
    }
}

リクエストのアプリケーションIDがスキルのIDと一致することを検証する(その他の言語)

applicationIdは、次のように、リクエストのJSON本文のsessionオブジェクトに含まれています。

{
  "version": "string",
  "session": {
    "new": boolean,
    "sessionId": "string",
    "application": {
      "applicationId": "string"
    },
    ...(リクエストの残りの部分は省略)    
  }
}

コードで、このapplicationIdプロパティをリクエストのJSON本文から取り出し、スキルに割り当てられたIDと照合します。リクエストのapplicationIdがスキルのIDと一致しない場合は、HTTPエラーコードを返してリクエストを拒否します。

Alexaから送信されるリクエストのタイプ

サービスは、以下の3つのタイプのリクエストを受け取って応答を返す必要があります。

  • LaunchRequest
  • IntentRequest
  • SessionEndedRequest

次に示すのはオプションのインターフェースですが、使用時には以下のリクエストを処理する必要があります。

リクエストのタイプを判別する(Javaライブラリ)

Javaライブラリを使用する場合は、SpeechletServletクラスまたはSpeechletRequestStreamHandlerクラスによって、Alexaから送信されたリクエストのタイプが判別され、対応するSpeechletのメソッドが呼び出されます。

  • onLaunch()
  • onIntent()
  • onSessionEnded()

メソッドの呼び出しには、リクエストのタイプを表すオブジェクトの引数(LaunchRequestIntentRequestSessionEndedRequestのいずれか)、および現在のセッションを表すオブジェクトの引数(Session)が含まれます。

AudioPlayerインターフェースを使用する場合、SpeechletクラスでAudioPlayerインターフェースおよびPlaybackControllerインターフェースも実装する必要があります。これらのインターフェースは、リクエストを転送するための類似したメソッド(onPlaybackStarted()など)を備えています。

リクエストのタイプを判別する(その他の言語)

Java以外の言語でウェブサービスまたはLambda関数を作成する場合は、受信したリクエストを検証してリクエストのタイプを判別し、タイプに応じて適切な処理を実行するコードを作成します。リクエストタイプは、JSONのrequestオブジェクトのプロパティの1つで判別できます。

{
  "version": "1.0",
  "session": {
    ...(セッションプロパティは省略)
  },
  "request": {
    "type": "LaunchRequest",
    "requestId": "request.id.string",
    "timestamp": "string"
  }
}

requesttypeプロパティは、次のいずれかです。

  • LaunchRequest
  • IntentRequest
  • SessionEndedRequest
  • プレフィックスがAudioPlayerのタイプ(例: AudioPlayer.PlaybackStarted)。AudioPlayerのリクエストを参照してください。
  • プレフィックスがPlaybackControllerのタイプ(例: PlaybackController.NextCommandIssued)。PlaybackControllerを参照してください。

これらのリクエストのJSON構造の詳細については、標準のリクエストタイプのリファレンスを参照してください。

LaunchRequest

ユーザーが、呼び出し名のみでスキルを呼び出し、インテントに対応するコマンドを言わなかった場合、サービスはLaunchRequestを受け取ります。例:

User: アレクサ、十二星座占いを起動して

機能が1つしかない(ジョークを言うなど)スキルの場合、サービスはユーザーに詳しい情報を尋ねることなくアクションを実行できます。ユーザーからさらに情報を得る必要がある場合は、プロンプトを返します。優れたプロンプトを設計する方法のガイダンスについては、Alexaの発話内容を参照してください。

このJavaの例では、サービスは情報をログに書き込み、次いで歓迎の応答を返すためのメソッドを呼び出します。

@Override
public SpeechletResponse onLaunch(final LaunchRequest request, final Session session)
        throws SpeechletException {

    log.info("onLaunch requestId={}, sessionId={}", request.getRequestId(),
    session.getSessionId());
    return getWelcomeResponse();
}

LaunchRequestは常に新しいセッションを開始します。

IntentRequest

ユーザーがインテントに対応するコマンドを言うと、サービスはIntentRequestを受け取ります。サービスに送信されるリクエストのオブジェクトには、特定のインテントおよびスロット値(定義されている場合)が含まれています。

ここでのインテントとは、ユーザーの話したリクエストを満たすアクションを表します。インテントには、ユーザーのリクエストを満たすために必要な追加情報を収集するための、スロットと呼ばれる引数を任意で含めることができます。インテントはAlexaに固有のものであり、Androidのインテントと同じ構造ではありません。

インテントとスロットの定義方法について詳しくは、以下を参照してください。

ユーザーによるスキルとの対話の開始方法に応じて、IntentRequestは新しいセッションを開始するか、または既存のセッションを継続します。

  1. ユーザーが、必要な情報すべてを1つのフレーズに含めてAlexaに質問または命令したとします。この場合は、新しいIntentRequestが送信され、新しいセッションが開始されます。

    User: アレクサ、「十二星座占い」で双子座の運勢を調べて

    この場合、LaunchRequestはサービスに送信されません。代わりに、IntentRequestによってセッションが開始されます。

  2. セッションがすでに開始されている状態で、ユーザーが音声インターフェースで定義されているインテントに対応するコマンドを言ったとします。この場合は、既存のセッションでIntentRequestが送信されます。

    User: アレクサ、「十二星座占い」を起動して(このコマンドによって、サービスにLaunchRequestが送信され、新しいセッションが開きます)
    Alexa: 十二星座占いまたはラッキーナンバーを聞くことができます。どちらにしますか?(LaunchRequestへの応答)
    User: 双子座の運勢を教えて(このコマンドによって、すでに開いているセッションのIntentRequestがサービスに送信されます)

以下のJavaの例では、onIntent()メソッドがインテント名を取り出し、そのインテントがMyColorIsIntentWhatsMyColorIntentのどちらであるかによって別のメソッドを呼び出します。

@Override
public SpeechletResponse onIntent(final IntentRequest request, final Session session)
        throws SpeechletException {
    log.info("onIntent requestId={}, sessionId={}", request.getRequestId(),
            session.getSessionId());

    // requestオブジェクトからインテントを取得します。
    Intent intent = request.getIntent();
    String intentName = (intent != null) ? intent.getName() : null;

    // メモ: セッションがインテントで始まる場合、歓迎のメッセージはレンダリングされません。
    // 代わりに、インテント固有の応答が返されます。
    if ("MyColorIsIntent".equals(intentName)) {
        return setColorInSession(intent, session);
    } else if ("WhatsMyColorIntent".equals(intentName)) {
        return getColorFromSession(intent, session);
    } else {
        throw new SpeechletException("Invalid Intent");
    }
}

Alexa Skills Kitには、一般的によく必要とされるアクション(停止、キャンセル、ヘルプの提供など)を実行する、一連のビルトインインテントが含まれています。これらのインテントを使用する場合は、IntentRequestリクエストを処理するコードで、これらのインテントも処理する必要があります。ビルトインインテントの詳細については、ビルトインインテントを実装するを参照してください。

the skill builder (beta)を使用していて、ダイアログモデルを作成済みの場合、IntentRequestにはdialogStateプロパティが含まれます。これを使用して、ユーザーとの会話の現在のステータスを判別し、会話がまだ完了していない場合にはDialog.Delegateディレクティブを返すことができます。

SessionEndedRequest

開いていたセッションが以下のいずれかの理由で閉じられた場合、サービスはSessionEndedRequestを受け取ります。

  1. ユーザーが終了すると言った場合。
  2. ユーザーが応答しなかった場合。またはユーザーが、端末によるユーザーの応答聞き取り中に、音声インターフェースに定義されているインテントと一致しない言葉を発した場合。
  3. エラーが発生した場合。

応答でshouldEndSessionフラグがtrueに設定されている場合にも、セッションが終了します。この場合、サービスはSessionEndedRequest受け取りません

サービスは、SessionEndedRequestに応答を返すことはできません。

AudioPlayerリクエストおよびPlaybackControllerリクエスト

AudioPlayerリクエストおよびPlaybackControllerリクエストは、AudioPlayerインターフェースを使用して音声をストリーミングする場合にのみ、サービスに送信されます。AudioPlayerリクエストは、Alexaが現在の再生状況をサービスに通知するために送信します。PlaybackControllerリクエストは、ユーザーがハードウェア(リモコンなど)のボタンを使用して端末を操作すると送信されます。

これらのリクエストのJSON形式の詳細については、AudioPlayerのリクエストおよびPlaybackControllerのリクエストを参照してください。

応答を返す

サービスは、LaunchRequestリクエストおよびIntentRequestリクエストに対して応答を返します。各応答は、カスタムスキルのJSONインターフェースのリファレンスに記載されている応答形式に従っていなければなりません。

Javaライブラリでは、SpeechletResponseクラスがリクエストへの有効な応答を実現します。応答を作成するには、このクラスのオブジェクトを作成し、プロパティを設定します。

応答には以下を含めることができます。

  • 音声に変換してユーザーに対して読み上げるテキスト。プレーンテキストまたはSSMLでマークアップしたテキストを使用できます。
    • Javaライブラリでは、PlainTextOutputSpeechクラスまたはSsmlOutputSpeechクラスを使用します。
    • JSONでは、outputSpeechオブジェクトでテキストまたはSSMLを提供します。
    • SSMLを使用する場合、audioタグを使用して、応答の一部として再生するMP3のURLを指定することもできます。
  • Amazon Alexaアプリに表示するカード。カードには、プレーンテキスト形式のタイトルおよびコンテンツ本文のほか、任意で画像を1つ追加することができます。応答にカードを追加する方法については、スキルの返答にカードを追加するを参照してください。
  • 再プロンプトが必要な場合に、音声に変換してユーザーに対して読み上げるテキスト(Javaライブラリの場合はRepromptクラス、JSON形式の場合はrepromptオブジェクト)。このテキストは、サービスが応答を送信後にセッションを開いたままにしている状態のときに、ユーザーが、音声ストリーミングが有効になっている間に音声インターフェースで定義されたインテントに対応する言葉を発しなかった場合に使用されます。
  • 特定のインターフェース(音声ストリーミング用のAudioPlayerインターフェースなど)を使用して端末レベルで実行するアクションを指定する、一連のディレクティブ。応答に含めることができるディレクティブの詳細については、以下を参照してください。

    ディレクティブを返すには、次のようにします。

    • Javaライブラリでは、SpeechletResponse.setDirectives()メソッドを使用して応答にディレクティブを追加します。ライブラリには使用できる各ディレクティブのクラス(AudioPlayer.PlayDirectiveなど)が含まれています。
    • JSONでは、directivesプロパティに、各ディレクティブのJSONを含む配列を追加します。
  • Alexaが応答テキストを読み上げた後に、セッションを閉じるか維持するかを示すフラグ(Javaライブラリの場合はSpeechletResponse.setShouldEndSession()、JSONの場合はshouldEndSessionプロパティ)。

さらに、現在のセッションで保存したい属性を応答に含めることもできます。これは、セッションのデータを保持するために役立ちます。

  • Javaライブラリでは、Session.setAttribute()メソッドおよびSession.getAttribute()メソッドを使用して、セッションの属性を設定および取得します。Sessionオブジェクトは、onLaunch()onIntent()およびonSessionEnded()メソッドに渡されます。
  • Javaライブラリを使用しない場合は、JSONでsessionAttributesプロパティによってセッションの属性を設定します。

  • JavaライブラリのSpeechletResponseクラスには、応答を構成するために役立つメソッドが含まれています。

  • newTellResponse - ユーザーに何かを伝えるための応答。この応答の再生後は、セッションが閉じられます。
  • newAskResponse - ユーザーに質問する応答。この応答の再生後は、ユーザーの応答を受け取るためにセッションが開いたまま維持されます。

これらのメソッドの詳細については、カスタムスキルのJavaライブラリのリファレンスを参照してください。

以下のJavaの例は、スロットから色の値を取り出し、セッションの属性に保存し、読み上げテキストおよびAmazon Alexaアプリのカードによる応答を生成しています。

private SpeechletResponse setColorInSession(final Intent intent, final Session session) {
    // インテントからスロットを取得します。
    Map<String, Slot> slots = intent.getSlots();

    // スロットのリストから色スロットを取得します。
    Slot favoriteColorSlot = slots.get(COLOR_SLOT);
    String speechText, repromptText;

    // お気に入りの色をチェックして、ユーザーに対する出力を作成します。
    if (favoriteColorSlot != null) {
        // ユーザーのお気に入りの色をセッションに保管し、応答を作成します。
        String favoriteColor = favoriteColorSlot.getValue();
        session.setAttribute(COLOR_KEY, favoriteColor);
        speechText =
                String.format("お気に入りの色は%sですね。「私のお気に入りの色は何?」"
                        + "と話しかけて、お気に入りの色を尋ねることができます", favoriteColor);
        repromptText =
                "「私のお気に入りの色は何?」と話しかけてお気に入りの色を尋ねることができます";

    } else {
        // お気に入りの色が分からないのでエラーをレンダリングします。
        speechText = "I'm not sure what your favorite color is, please try again";
        repromptText =
                "お気に入りの色が分かりません。「私のお気に入りの色は赤」と話しかけて"
                        + "お気に入りの色を伝えてください";
    }

    return getSpeechletResponse(speechText, repromptText, true);
}

...

private SpeechletResponse getSpeechletResponse(String speechText, String repromptText,
        boolean isAskResponse) {
    // シンプルなカードのコンテンツを作成します。
    SimpleCard card = new SimpleCard();
    card.setTitle("Session");
    card.setContent(speechText);

    // プレーンテキストの出力を作成します。
    PlainTextOutputSpeech speech = new PlainTextOutputSpeech();
    speech.setText(speechText);

    if (isAskResponse) {
        // 再プロンプトを作成します
        PlainTextOutputSpeech repromptSpeech = new PlainTextOutputSpeech();
        repromptSpeech.setText(repromptText);
        Reprompt reprompt = new Reprompt();
        reprompt.setOutputSpeech(repromptSpeech);

        return SpeechletResponse.newAskResponse(speech, reprompt, card);

    } else {
        return SpeechletResponse.newTellResponse(speech, card);
    }
}

録音済みの短い音声を応答で使用する

録音済みの短い音声をサービスの応答に組み込むには、MP3ファイルのURLを指定します。これによって、MP3がAlexaサービスによって応答時に再生されます。これは、以下のような場合に有効です。

  • 標準的なAlexaの音声ではなく、ブランドに関連する音声を使用して応答したい場合。例:
    • ニュースヘッドラインのスキルで、有名レポーターによるヘッドラインの読み上げ音声を再生する。
    • ビデオゲーム関連のスキルで、ゲームのキャラクターの声で事前に録音された応答を返す。
  • 通常のテキスト読み上げによる応答に、音響効果を追加する(特にゲームやエンターテイメント系のスキルなど)。
  • スキルでブランドを印象付けるため、よく知られたジングルやサウンドを追加する。
  • 現在の読み上げ処理能力では対応できない応答を返す(翻訳スキルで英語以外の言語の応答を返すなど)。

録音済みの音声を使用するには、SSMLで応答を記述し、<audio>タグでMP3ファイルのURLを指定します。たとえば、以下のようなSSMLを記述します。

<speak>
    Car-Fuへようこそ。 
    <audio src="https://carfu.com/audio/carfu-welcome.mp3" /> 
    配車または料金の見積もりをリクエストできます。どちらにしますか?
</speak> 

Alexaがこの応答を再生すると、以下のように聞こえます。

Alexa: Car-Fuへようこそ。
(指定した音声ファイルcarfu-welcome.mp3が再生されます)
Alexa: 配車または料金の見積もりをリクエストできます。どちらにしますか?”

優れたユーザーエクスペリエンスを提供するには、サービスの応答に組み込む音声ファイルは非常に短いものにする必要があります。1つの応答に最大5つの音声ファイルを使用できます。1つの応答ですべての音声ファイルを再生する場合は、合計再生時間が90秒を超えてはいけません。音声ファイルについての具体的な要件および制限については、音声合成マークアップ言語(SSML)のリファレンスを参照してください。

応答でSSMLを使用する方法やその他のサポートされるタグの詳細については、音声合成マークアップ言語(SSML)のリファレンスを参照してください。

想定される入力エラーを処理する

音声インターフェースでは、ユーザーの無効なデータの入力を回避することができません。また、ユーザーの言葉を間違って解釈して、スロット値に誤りが生じる可能性もあります。こうしたエラーがないかをチェックし、適切に処理するコードを作成する必要があります。

カスタムまたは標準スロットタイプの無効な値

カスタムスロットタイプとして定義されたスロット、または標準タイプのリストの1つを使用して定義されたスロットが、そのタイプで定義された値のリストに含まれない値を受け取る場合があります。

たとえば、カスタムスロットタイプLIST_OF_SIGNSで12個の星座を定義したとします。ユーザーが「青色のホロスコープを教えて」と言った場合、AlexaはSignスロットに「青色」という単語が与えられたリクエストをサービスに送信します。この場合、Signの値を検証し、有効な星座ではないことをユーザーに伝えるコードが必要となります。問題とダイアログエラーの処理に関する推奨事項については、Alexaの発話内容を参照してください。

無効な数字、日付、時刻、時間のスロット値

スロットタイプAMAZON.NUMBERAMAZON.DATEAMAZON.TIME、およびAMAZON.DURATIONはすべて、ユーザーの言葉を別のデータタイプに変換するためのものです。これらのスロットを使用する場合、ユーザーの入力の誤りや言葉の解釈の誤りによって、変換が行われずに、スロット値が無効になることがあります。

たとえば、単純な計算を行うインテントで以下のようなAMAZON.NUMBERを使用するとします。

SampleNumberAddIntent   {xValue}と{yValue}を足すといくつ

AlexaはxValueおよびyValueとして渡されたデータを数字に変換しようとします。しかし、ユーザーがこのフレーズを言うときに、xValueyValueのスロットで必ず数字だけを使うよう強制することはできません。ユーザーが「赤と青を足すといくつ」といったナンセンスなフレーズを言う場合もあれば、Alexaがユーザーの言葉の解釈を誤り、数値に変換できない場合もあります。

このため、スロットデータを使用する前に必ず検証するコードを作成する必要があります。例:

// xValueとyValueはスロットです。すでに取得が済んでおり、その取得元は
// インテントです。両スロットがnullでないことを最初に確認します。
if (xValue != null && yValue != null) {
    // スロットから値を取得します。スロット値はすでに指定されており、
    // 文字列です。
    String xString = xValue.getValue();
    String yString = yValue.getValue();

    // これらの文字列に数値が含まれていることを確認してから解析し、
    // 文字列を実数にします。
    Float xFloat = (StringUtils.isNumeric(xString)) ? Float
            .parseFloat(xString) : null;
    Float yFloat = (StringUtils.isNumeric(yString)) ? Float
            .parseFloat(yString) : null;

    if (xFloat != null && yFloat != null) {

        // どちらのスロットにも有効な数値が含まれていたので、続行して
        // 通常の処理を行います...
        ...

    } else {
        // いずれかまたは両方のスロットに数値が含まれない場合
        speechOutput = String
                .format("申し訳ありません。追加する数字を聞き取れませんでした。");
    }
}

スロットの数が変化するインテント

インテントには1つまたは複数のスロットを追加できますが、すべてのスロットに値を渡さないサンプル発話を作成することも可能です。たとえば、GetHoroscopeインテントに、SignスロットとDateスロットを追加し、以下のサンプル発話を指定するとします。

GetHoroscope {Sign}の運勢を教えて
GetHoroscope 今月の{Date}の{Sign}の運勢を教えて 
GetHoroscope 私の運勢を教えて

この例では、サービスに送信されるGetHoroscopeインテントに、スロット値が1つも含まれていない場合、1つのスロット値(Sign)が含まれている場合、2つのスロット値(DateおよびSignの両方)が含まれている場合が想定されます。

このため、スロット値を使用する前にnullでないことを検証する必要があります。

または、Dialogディレクティブを使用して、次のようにスロット値を簡単に収集することもできます。

  1. the skill builder (beta)を使用して、ダイアログモデルでスロットを必須に指定します。

    the skill builderの中に、Alexaがユーザーにスロット値を尋ねるプロンプトと、それらの質問への応答としてユーザーが話す可能性のある発話を作成します。

  2. コードで、IntentRequest.dialogStateプロパティをチェックします。COMPLETEではない場合、Dialog.Delegateディレクティブを返します。

その後、Alexaは定義済みのプロンプトを使用して、値をユーザーに尋ねます。すべての必須スロットに値が入ると、IntentRequest.dialogStateプロパティがCOMPLETEに設定されます。

スロット値の収集と確認のその他の処理方法については、ユーザーとの会話の管理についてを参照してください。

次のステップ

コーディングに関するトピック

その他のトピック:

リファレンス: