[Java Alexa] Slotを使って声掛けによって結果が変わるCustom Skillを作成する

alexa-eyecatch

はじめに

Javaで始めるAlexa Custom Skill開発入門の第2回になります。前回ではJava Alexa Skills Kit SDKの簡単なサンプルを動かしてみました。毎回のIntentは同じレスポンスを返すだけでしたが、今回はこちらの声掛けによって結果が変わるように修正してみよう思います。

実装する

Sample Utterances

まずはAmazon Developer ConsoleでSample Utterancesを以下のように修正します。{Age}のように中括弧で囲まれているのはSlotと言われる変数のようなものです。今回は数値型で定義するので数字であればプログラムの中で取得できます。例えば I am twenty years old と発言するとHelloWorldIntentが実行されプログラム内で20という数値が取得できます。

HelloWorldIntent I am {Age} years old

Intent Schema

次にIntent SchemaでSlotの定義をします。今回はSlot名をAge、型を数値型(AMAZON.NUMBER)にしています。

{
  "intents": [
    {
      "intent": "HelloWorldIntent",
      "slots": [
        {
          "name": "Age",
          "type": "AMAZON.NUMBER"
        }
      ]
    },
    {
      "intent": "AMAZON.HelpIntent"
    }
  ]
}

Slotの型として他には以下のような型があります。独自の型を作成することもできます。

Slot Type Reference - Amazon Apps & Services Developer Portal

Javaのソースコードを修正する

HelloWorldSpeechlet の onIntentメソッドでSlotを取得します。修正したのはハイライトの部分になります。

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

        Intent intent = request.getIntent();
        String intentName = (intent != null) ? intent.getName() : null;

        Slot slot = intent.getSlot("Age");

        if ("HelloWorldIntent".equals(intentName)) {
            return getHelloResponse(slot);
        } else if ("AMAZON.HelpIntent".equals(intentName)) {
            return getHelpResponse();
        } else {
            throw new SpeechletException("Invalid Intent");
        }
    }

レスポンスを返しているgetHelloResponseメソッドを以下のように修正します。引数にSlot型の変数を渡せるようにして中で値を取得しています。

    private SpeechletResponse getHelloResponse(Slot slot) {

        //String speechText = "Hello world";
        String speechText = "You are " + slot.getValue() + " years old";  // 追加

        // Create the Simple card content.
        SimpleCard card = new SimpleCard();
        card.setTitle("HelloWorld");
        card.setContent(speechText);

        // Create the plain text output.
        PlainTextOutputSpeech speech = new PlainTextOutputSpeech();
        speech.setText(speechText);

        return SpeechletResponse.newTellResponse(speech, card);
    }

確認する

Lambda FunctionをアップロードしてService Simulatorで試してみましょう。 以下のように修正した部分がレスポンスに反映されていれば成功です。

java-alexa-slot-01

最後に

今回はSlotを使ったサンプルを作ってみました。何回かやり取りを行うCustom Skillを作ってみたいと思います。
Javaで始めるAlexa Custom Skill開発入門 TOPページへ