LoginSignup
9
4

More than 5 years have passed since last update.

JavaでAlexaスキルをつくってみた

Last updated at Posted at 2018-06-01

環境準備

EclipseからAWS Lambdaを利用するためのプラグインのインストール
↓にキレイにまとめて下さっているので、こちらを参考に導入して下さい。
AWS Toolkit for Eclipse - ヤマムギ

おおまかな流れ

  1. Alexa開発者ポータルでスキルを作成する
    • スキル名を決める
    • スキルモデルを選択する
    • スキルの呼び出し名を決める
    • インテントを追加する(必要に応じてインテントスロットを作成)
    • モデルを保存してビルドする
  2. Alexaスキルの脳となるLambdaファンクションを作成する
    • GitHubからサンプルスキルをEclipseにクローン
    • Eclipse上でプロジェクトをインポート
    • Alexa開発者ポータルで作成したインテント用にソースを書き換える
    • AWS上にLambdaファンクションをアップロード
    • LambdaからAlexaスキルの紐付けをする
  3. AlexaスキルからLambdaファンクションへの紐付けをする
  4. テスト実施

Alexaスキルの作成

まずは、Amazon 開発者ポータルにアクセスして、Alexaスキル作成画面に移動します。

スクリーンショット 2018-05-31 23.40.04.png

スクリーンショット 2018-05-31 23.40.25.png
スクリーンショット 2018-05-31 23.40.49.png

image.png

スキル名を決めます。
言語は日本語にしておいてください。

image.png

今回はカスタムスキルを選択します。

image.png

呼び出し名を決めます。
「Alexa、〇〇を開いて」や、「〇〇で△△して」の、”〇〇”の部分になります。

image.png

インテントを作ります。「〇〇で△△して」の”△△”の部分に相当します。

image.png

とりあえず「HelloIntent」というインテントを作りました。

d8d9499b6ff2b28c5488cf0243e66221.png

次はHelloIntentに対して発話例を設定していきますが、
インテントスロットも使ってみようと思うので、「Location」というインテントスロットを設定して、
Amazonの標準スロットAMAZON.Cityを使ってみようと思います。
{Location}には、Amazonで既に登録されている一般的な地名が入ります。
多分大阪市もあるでしょう。知らんけど。

de046866c6b159c335d2ee183c9118d0.png

後はサンプル発話のところに、さっき作ったインテントスロットを絡めて、
ユーザが言いそうな発話例をいくつか登録します。
ある程度登録し終わったら、「モデルを保存」「モデルをビルド」を押します。
ビルドが正常に終了したら、Alexa管理者ポータルの作業は一旦ここで中断です。

Lambdaファンクションの作成

今回は最初にインストールしたAWS Toolkit for Eclipseを使って、
EclipseからLambdaファンクションを作成します。

GitHubのJavaサンプルプロジェクトを利用するので、ここからEclipseにクローンします。
クローンが終わりましたら、helloworldプロジェクトだけインポートし、HelloWorldSpeechlet.javaを編集します。

HelloWorldSpeechlet.java(49行目)

    @Override
    public SpeechletResponse onIntent(SpeechletRequestEnvelope<IntentRequest> requestEnvelope) {
        IntentRequest request = requestEnvelope.getRequest();
        log.info("onIntent requestId={}, sessionId={}", request.getRequestId(),
                requestEnvelope.getSession().getSessionId());
        // リクエストからインテントを取得します
        Intent intent = request.getIntent();
        String intentName = (intent != null) ? intent.getName() : null;
        // インテントからスロットの値を取得します
        Slot slot = intent.getSlot("Location");
        String slotValue = slot.getValue();

        if ("HelloIntent".equals(intentName)) {
            // スロットの値を引数に渡すように変更します
            return getHelloResponse(slotValue);
        } else if ("AMAZON.HelpIntent".equals(intentName)) {
            return getHelpResponse();
        } else {
            return getAskResponse("HelloWorld", "This is unsupported.  Please try something else.");
        }
    }
HelloWorldSpeechlet.java(93行目)
 private SpeechletResponse getHelloResponse(String slotValue) {

       String speechText = null;
       if(slotValue != null && slotValue.contains("大阪")) {
       // スロットの値に"大阪"が含まれる場合
           speechText = "おっす、儲かりまっか?";
       } else {
       // それ以外の場合
           speechText = "こんにちは、お元気ですか?";
       }
       // Create the Simple card content.
       SimpleCard card = getSimpleCard("HelloWorld", speechText);

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

       return SpeechletResponse.newTellResponse(speech, card);
   }

AWSにLambdaファンクションをアップロード

EclipseのプロジェクトエクスプローラのHelloWorldSpeechlet.javaを右クリックして、Amazon Web サービスから「Upload Function to AWS Lambda」を選択します。
(Windowsの場合はhelloworldプロジェクトを右クリックで表示されます。)
d3c3474569fca6c150038ca66131edf4.png

S3バケットやロールを選択してそのまま画面を進めていくと、Lambdaファンクションのアップロードが完了します。

LambdaファンクションからAlexaスキルを紐付けする

0293130e647ab290557dfb07e844b017.png

AWSコンソールのLambdaの管理画面で、先ほどアップロードしたLambdaを選択して、
「トリガーの追加」でAlexa Skills Kitを選択します。
すると画面下に、Alexa SkillのスキルIDを指定するフォームが出てきます。

Alexa開発者ポータルの画面に戻り、
エンドポイントのメニューの中にある「amzn1.ask.skill.」から始まるスキルIDをコピーしてきて貼り付けます。
最後に右上の「保存」を押して終わりです。

AlexaスキルからLambdaファンクションを紐付けする

3bbe8b050fef15a338b89bd90c5c7bb0.png

次は逆に、Lambdaファンクションの管理画面の一番右上にある「arn:aws:lambda:」から始まるARNを、
Alexa管理者ポータルのエンドポイントメニューの「デフォルトの地域」のフォームに貼り付けます。
こちらも最後に「エンドポイントを保存」を押して準備完了です。

実際にテストで動かしてみる

e6206ad13a96d39351f8665750bca0b2.png

Alexa管理者ポータルの「テスト」メニューに移動し、
「サンプルスキルで大阪のあいさつをして」と入力してみます。
Alexaが「おっす、儲かりまっか?」と答えてくれたら成功です!

お疲れ様でした!

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4