🔊

子供が自分でEC2のマイクラサーバーを起動できるように家庭用Alexaスキルを作ってみた

2023/12/15に公開

これはエンジニア転職のLAPRAS/エンジニア採用のLAPRAS SCOUTを提供するLAPRASのAdvent Calendar 2023 15 日目の記事です。

https://qiita.com/advent-calendar/2023/lapras


最近作った家庭用の Alexa スキルを紹介します!

💘 モチベーション

現在、以下の記事で紹介したように AWS EC2 で家族専用のマイクラサーバーを運用しています。

https://zenn.dev/ryo_kawamata/articles/ccaf0461ba8e7b

今まで子供とマイクラで遊ぶ際は、都度自分が AWS のコンソールからサーバーを起動していたのですが、自分の不在時に子供だけで遊びたいというケースもあり、少し不便でした。

そこで、Alexa を使って声でサーバーを操作できるようにしたら子供が自由に使えて便利かなと思い今回の開発に至りました。

🔊 作ったもの

以下ツイート動画のように、サーバーの起動・停止・状態確認ができる Alexa スキルを作りました。

起動ワードの「マイクラサーバー」を発話した後に、サーバー名操作内容を指示することで、該当のサーバーを操作できます。

※ ここでいうサーバー名はEC2のインスタンスのニックネームです。家では「ポケモン」と「サバイバル」の2つのサーバーを運用しています。

https://twitter.com/KawamataRyo/status/1728754566328631709

今はもう子供が自由にマイクラサーバーを起動・停止しています。少しですが、父の仕事ぶりを見せられたので良かったかなと思ってます💪

🛠️ Alexa スキルの作り方

Alexa スキルの作り方をポイントのみ紹介します。ここで紹介するコードは以下リポジトリで公開しています。

https://github.com/kawamataryo/minecraft-server-alexa-skill

1. Amazon Developer Console でスキルを作成

Alexa の開発者コンソールからスキルを作成します。コンソールへのログインには通常の AWS アカウントではなく、Amazon Developer アカウントが必要なので注意です。

https://developer.amazon.com/alexa/console/ask

ポイントは、ホスティングサービスで 独自のプロビジョニング を選ぶことです。これを選ぶことでスキルのエンドポイントとして自分の AWS の Lambda を使えるようになります。

2. スキルのインテントを作成

Alexa スキル開発で重要なワードとして インテントスロットダイアログ があります。

ワード 説明
インテント ユーザーの発話とスキルのアクションを紐づけるもの
スロット インテントの中でユーザーの発話から抽出したい情報を指定するもの。抽出されたものがインテントのアクション呼び出し時に渡される(関数呼び出しの引数のようなもの)
ダイアログ スキル内でのAlexaとユーザーの対話。この対話の中でインテントに紐づけられた発話をすることで特定のアクションが実行される

たとえば天気予報というインテントを作り、都市名というスロットを指定すると、ユーザーが「明日の東京の天気は?」と発話した際に、Alexa が「東京」をスロットとして抽出しインテントに対応した処理を実行してくれます。

今回のスキルでは、SERVER_NAMEOPERATION_NAMEというスロットと、それを使うServerOperationIntentというインテントを作成しました。


また、ServerOperationIntent では、Alexaのオートデリゲートという機能を使って、スロットに指定した SERVER_NAMEOPERATION_NAME を対話の中から自動で収集してくれるよう設定しています。

たとえば、「マイクラサーバー」「起動して」とサーバー名を省いてユーザー発話した場合でも、Alexa が「サーバー名は?」と必要な情報を聞いてくれるようになります。

最終的な対話モデルのスキーマ定義は以下のようになりました。

https://github.com/kawamataryo/minecraft-server-alexa-skill/blob/master/model_schema.json#L1-L223

それぞれのスロットに対して、類語やサンプル発話を設定しています。これを設定することでAlexa がユーザーの発話をより正確に理解できるようになります。

3. Serverless Framework で Lambda を実装

以下ドキュメントを参考に、Alexaスキルのリクエストを受け取り、EC2のインスタンスを操作する Lambda 関数を Serverless Framework で実装しました。

https://www.serverless.com/framework/docs/providers/aws/events/alexa-skill

Alexaスキルのエンドポイントとなるlambdaでは、各インテントに対応したhandlerを実装する必要があります。

今回は以下5つのインテントに対応したhandlerを実装しました。

LaunchRequestHandler
Alexaスキルの起動時に呼ばれるハンドラーです。スキルの起動ワードを発話すると、speechTextで指定した文言をAlexaが返し、対話が始まります。

https://github.com/kawamataryo/minecraft-server-alexa-skill/blob/master/src/handlers/launchRequestHandler.ts#L1-L17

ErrorHandler
エラーが発生した際に呼ばれるハンドラーです。

https://github.com/kawamataryo/minecraft-server-alexa-skill/blob/master/src/handlers/errorHandler.ts#L1-L16

helpIntentHandler
ユーザーが「ヘルプ」と発話した際に呼ばれるハンドラーです。スキルの使い方を説明します。

https://github.com/kawamataryo/minecraft-server-alexa-skill/blob/master/src/handlers/helpIntentHandler.ts#L1-L18

stopIntentHandler
ユーザーが「終了」「おわり」などスキルを停止する発話をした際に呼ばれるハンドラーです。スキルを終了します。

https://github.com/kawamataryo/minecraft-server-alexa-skill/blob/master/src/handlers/cancelAndStopIntentHandler.ts#L1-L19

ServerOperationHandler
これが今回のメインのハンドラーです。ServerOperationIntent に対応しています。SERVER_NAME、OPERATION_NAMEのスロットを受け取り、それに応じた処理を実行します。

https://github.com/kawamataryo/minecraft-server-alexa-skill/blob/master/src/handlers/serverOperationHandler.ts#L53-L88

指示に応じたEC2の操作は、このマップで定義しています。

https://github.com/kawamataryo/minecraft-server-alexa-skill/blob/master/src/handlers/serverOperationHandler.ts#L37-L51

最後に、それらのハンドラーを内包したエンドポイントとなる関数を定義します。

https://github.com/kawamataryo/minecraft-server-alexa-skill/blob/master/src/index.ts#L11-L29

これでAlexaスキルのリクエストを受け取るLambda関数の実装は完了です。
Serverless Framework でデプロイし、そのエンドポイントを Alexa スキルに設定します。

DeveloperコンソールからAlexaスキルをビルドすれば準備完了です。

コンソールのテスト画面またはEchoデバイスから、スキルの動作を確認できます🎉

⛷️ おわりに

はじめてのAlexaスキル開発でしたが意外と簡単に実装することができました。ドキュメントやチュートリアルが日本語で整備されているのも助かりました。

今回のケースのように声を起点に何らかの処理をしたいケースは割とあると思います。その際は積極的にAlexaを使っていきたいです。またひとつ自分の引き出しが増えて良かったです💪

Discussion