環境準備
EclipseからAWS Lambdaを利用するためのプラグインのインストール
↓にキレイにまとめて下さっているので、こちらを参考に導入して下さい。
[AWS Toolkit for Eclipse - ヤマムギ]
(https://www.yamamanx.com/aws-toolkit-eclipse/)
おおまかな流れ
- Alexa開発者ポータルでスキルを作成する
- スキル名を決める
- スキルモデルを選択する
- スキルの呼び出し名を決める
- インテントを追加する(必要に応じてインテントスロットを作成)
- モデルを保存してビルドする
- Alexaスキルの脳となるLambdaファンクションを作成する
- GitHubからサンプルスキルをEclipseにクローン
- Eclipse上でプロジェクトをインポート
- Alexa開発者ポータルで作成したインテント用にソースを書き換える
- AWS上にLambdaファンクションをアップロード
- LambdaからAlexaスキルの紐付けをする
- AlexaスキルからLambdaファンクションへの紐付けをする
- テスト実施
Alexaスキルの作成
まずは、[Amazon 開発者ポータル]
(https://developer.amazon.com/ja/)にアクセスして、Alexaスキル作成画面に移動します。
スキル名を決めます。
言語は日本語にしておいてください。
今回はカスタムスキルを選択します。
呼び出し名を決めます。
「Alexa、〇〇を開いて」や、「〇〇で△△して」の、**”〇〇”**の部分になります。
インテントを作ります。「〇〇で△△して」の**”△△”**の部分に相当します。
とりあえず**「HelloIntent」**というインテントを作りました。
次はHelloIntentに対して発話例を設定していきますが、
インテントスロットも使ってみようと思うので、「Location」というインテントスロットを設定して、
Amazonの標準スロットAMAZON.Cityを使ってみようと思います。
**{Location}**には、Amazonで既に登録されている一般的な地名が入ります。
多分大阪市もあるでしょう。知らんけど。
後はサンプル発話のところに、さっき作ったインテントスロットを絡めて、
ユーザが言いそうな発話例をいくつか登録します。
ある程度登録し終わったら、**「モデルを保存」と「モデルをビルド」**を押します。
ビルドが正常に終了したら、Alexa管理者ポータルの作業は一旦ここで中断です。
Lambdaファンクションの作成
今回は最初にインストールしたAWS Toolkit for Eclipseを使って、
EclipseからLambdaファンクションを作成します。
GitHubのJavaサンプルプロジェクトを利用するので、[ここ]
(https://github.com/alexa/skill-samples-java)からEclipseにクローンします。
クローンが終わりましたら、helloworldプロジェクトだけインポートし、HelloWorldSpeechlet.javaを編集します。
@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.");
}
}
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プロジェクトを右クリックで表示されます。)
S3バケットやロールを選択してそのまま画面を進めていくと、Lambdaファンクションのアップロードが完了します。
LambdaファンクションからAlexaスキルを紐付けする
AWSコンソールのLambdaの管理画面で、先ほどアップロードしたLambdaを選択して、
「トリガーの追加」でAlexa Skills Kitを選択します。
すると画面下に、Alexa SkillのスキルIDを指定するフォームが出てきます。
Alexa開発者ポータルの画面に戻り、
エンドポイントのメニューの中にある「amzn1.ask.skill.」から始まるスキルIDをコピーしてきて貼り付けます。
最後に右上の「保存」を押して終わりです。
AlexaスキルからLambdaファンクションを紐付けする
次は逆に、Lambdaファンクションの管理画面の一番右上にある「arn:aws:lambda:」から始まるARNを、
Alexa管理者ポータルのエンドポイントメニューの**「デフォルトの地域」のフォームに貼り付けます。
こちらも最後に「エンドポイントを保存」**を押して準備完了です。
実際にテストで動かしてみる
Alexa管理者ポータルの**「テスト」**メニューに移動し、
「サンプルスキルで大阪のあいさつをして」と入力してみます。
Alexaが「おっす、儲かりまっか?」と答えてくれたら成功です!
お疲れ様でした!