Javaで始めるAlexa Custom Skill開発入門

2017.06.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

最近、Amazon Alexa のCustom Skillを作る勉強をしています。Alexa のCustom SkillはAWS Lambdaを使うのでNode.js、Java、Pythonなどの言語で開発できます。ネットではNode.jsの入門記事が多いのですが、私はJavaとEclipseの開発の方が慣れているのでJavaでやってみました。今回はサンプルを動かすことができましたのでその手順をまとめます。前提としてはAWS LambdaとJavaでの開発経験がある方を対象としています。 Alexaって何という方は以下の記事をご覧ください。

Amazon Alexaの基礎知識

目次

  1. Alexa Skills Kitのサンプルを動かしてみる
  2. Slotを使って声掛けによって結果が変わるCustom Skillを作成する
  3. Sessionを使って何回かやり取りするCustom Skillを作成する

準備

用語に関して

用語に関してはUtteranceIntentInvocation Name は今回のサンプルを試すうえで抑えておいた方がいいと思います。用語に関しては以下の記事が分かりやすかったです。

【Alexa初心者向け】Alexa Skill Kitを噛み砕いて解説してみる

用語は「解説」「Custom Skillの設定」の部分になります。

AWS Toolkit for Eclipseのインストール

EclipseにAWS Toolkit for Eclipse のインストールするとLambdaへのファイルアップロードはEclipseからできるので便利です。AWS Toolkit for Eclipse のインストールやLambdaへのアップロードの手順は以下の記事をご覧ください。

Lambda Function が Java で書けるようになりました!

環境に関して

  • Java:1.8.0_91
  • Eclipse:3.6
  • Alexa Skill Kit:1.3.1

Alexa Skills Kitのサンプルを動かしてみる

まずはサンプルを触りながら覚えていくのがよいと思います。開発するためにはJava Alexa Skills Kit SDKを使います。 Githubの以下のリポジトリからクローンするかダウンロードして下さい。

amzn/alexa-skills-kit-java

次にJava Alexa Skills Kit SDKの中にあるサンプルプロジェクトをEclipseにインポートします。プロジェクトのインポートダイアログを開いてGradleプロジェクトを選択します。

alexa-java-01

プロジェクトルート・ディレクトリにalexa-skills-kit-javaのsamplesフォルダを指定します。

alexa-java-02

Lambdaにアップロードする前に3点ほどソースコードを修正する必要があります。まずはダウンロードした状態だとsamplesの中にあるbuild.bundleの以下の部分が古くなっておりコンパイルエラーが発生するので、Alexa Skills Kitのバージョンを書き換えましょう。書き換えたらパッケージエクスプローラで右クリックして、[Gradle] - [Gradleプロジェクトのリフレッシュ]を選択して下さい。コンパイルエラーが消えると思います。Alexa Skills Kitのバージョンは、alexa-skills-kit-javaフォルダ内のpom.xml を見れば分かります。

compile 'com.amazon.alexa:alexa-skills-kit:1.1.2'

次の修正です。Githubから取得した状態のままではログがCloudWatchに出力されません。build.bundleのdependenciesの中に以下のライブラリを入れましょう。

compile group: 'com.amazonaws', name: 'aws-lambda-java-log4j', version: '1.0.0'

LambdaのログをCloudWatchに出力する場合はロールに権限を追加する必要があります。設定方法に関しては以下の記事をご覧ください。

AWS Lambdaのログまわりに関すること まとめ

最後の修正になります。samplesフォルダ内には多くのサンプルがありますが、今回は helloworld.HelloWorldSpeechletRequestStreamHandlerを試してみたいと思います。HelloWorldSpeechletRequestStreamHandlerを開くと以下のようにsupportedApplicationIdsという変数にIDを追加する処理がありますが、supportedApplicationIdsはLambdaに初めてアップロードする時点では分からないので、Lambdaの環境変数を設定するように修正します。

    static {
        /*
         * This Id can be found on https://developer.amazon.com/edw/home.html#/ "Edit" the relevant
         * Alexa Skill and put the relevant Application Ids in this Set.
         */
    	//supportedApplicationIds.add("amzn1.echo-sdk-ams.app.[unique-value-here]"); ← 修正前
    	supportedApplicationIds.add(System.getenv("ALEXA_APP_ID"));
    }

トリガーの設定

Management ConsoleでLambda Functionが登録されていると思いますので、トリガーを設定します。 トリガーは以下のようにAlexa Skills Kitを選択します。右上のARNは後でCustom Skillを作成する際に必要になるので控えておきましょう。

alexa-java-04

Custom Skillを作成する

Lambdaの設定が完了したら、Amazon Developer Console からCustom Skillを作成します。Amazon Developer Consoleのアカウントがない場合は簡単に作成できるので作りましょう。Custom Skillの作成手順は以下のページを見て下さい。

Amazon AlexaのCustom Skillをサンプルから学ぶ Custom Skillの作成

今回はNameは Hello-World-Exampl-Skill、Invocation Nameはsampleにしました。IntentSchema.jsonSampleUtterance.txt はHelloWorldSpeechletRequestStreamHandler.java と同じ場所にあるspeechAssetsという名前のフォルダの中にありますのでコピペして下さい。作成するとApplication IdというIDが振られるので、Management ConsoleのLambdaの環境変数に設定しましょう。今回はTestできる状態でSaveして終わりにします。

alexa-java-05_11

Application Idが分かったらManagement Consoleから環境変数に登録します。これでLambdaの設定は完了になります。

alexa-java-03

IntentSchemaとSampleUtteranceを設定したらテストができるようになります。Service Simulatorで確認してみましょう。

alexa-java-06

今回のサンプルは SampleUtterance.txt で"say hello"、"say hello world""、"hello"などの声掛けをするとHelloWorldIntentというIntentが呼ばれるように定義されています。SampleUtterance.txtを見ると[Intent名][半角スペース][Utterance]といった書き方になっています。

HelloWorldIntent say hello
HelloWorldIntent say hello world
HelloWorldIntent hello
HelloWorldIntent say hi
HelloWorldIntent say hi world
HelloWorldIntent hi
HelloWorldIntent how are you

HelloWorldIntentは挨拶を返すだけの簡単なものです。Service Simulatorではテキストで声掛けをシミュレートしているのでテキストボックスにhelloと入れてみましょう。Lambda ResponseのテキストボックスにレスポンスのJSONが出力されたら成功になります。

alexa-java-07

最後に

今回はAlexa-skills-kitを使ってサンプルを動かしてみました。次回はSlotを使ってこちらの声掛けによって結果が変わるCustom Skillを作ってみたいと思います。