Rails Webook

Web業界で働いています。Railsを中心にプログラミングや事業開発のようなことを書いていきます。

限定Tシャツ欲しさにAlexaスキル作りました

f:id:nipe880324:20180614234936j:plain:w420

数ヶ月前にAmazon Echo Dotを買いました。
「うわ、すごい便利!」っというわけではないですが、スマホいじらずに朝の支度しながら今日の天気を聞けるのは楽だなーと思っている今日このごろです。

Alexaが日本で浸透するためかわからないのですが、Alexaスキルを開発した人に「Alexa Tシャツ」か「Amazon Echo Dot」というキャンペーンをやっています。

スキル開発者特典のキャンペーン情報


個人的に「Alexa Tシャツ」がほしかったので、今年の3月のキャンペーンに応募し、スキルを公開し、Tシャツをもらいました。
Alexaスキルを作るだけなら簡単に作れるので、Amazon Echoをもっているかたはぜひチャレンジしてみてください。

▼もらったAlexa Tシャツ
f:id:nipe880324:20180615000510p:plain:w240

動作確認バージョン

  • alexa-sdk 1.0.25
  • Node.js 6.10 (AWS Lambda)


1. 作ったAlexaスキル

f:id:nipe880324:20180614235128p:plain:w320

「ゴミ出しルーレット」というスキルを作りました。
まず、当番の人の名前を登録し、ゴミ出しの当番を聞くと、ランダムに選んでくれるとてもシンプルなAlexaスキルです。
家族でゴミ出し当番の分担を公平にしたいなーと思って作りました。

対話サンプルとしては、とてもシンプルで次のような形です。

f:id:nipe880324:20180614235151p:plain:w240

コマンドは一覧は下記の通りです。

コマンド機能備考
アレクサ、ゴミ出しルーレットで当番を教えて今日のゴミ出しルーレットを選ぶ明日のゴミ出しルーレットなど日付指定ができる
当番を追加するアレクサ、ゴミ出しルーレットで太郎を追加して登録していいですかといったような確認してから登録する流れにしている
当番を削除するアレクサ、ゴミ出しルーレットで太郎を削除して
当番を確認するアレクサ、ゴミ出しルーレットで登録情報を確認して

ソースコードはこちらに公開しています。
https://github.com/nipe0324/alexa-garbage-duty-skill-jp

2. システム構成

f:id:nipe880324:20180615001807p:plain:w420

例えば、「アレクサ、ゴミ出しルーレットで当番を教えて」と話した流れとして次のような流れになります。

1. Alexaが「ゴミ捨てルーレットスキル」と識別し、「当番を教えて」をスキルに送ります。
2. ゴミ捨てルーレットスキルに登録していた発話パターンから「当番を教えて」にマッチするインテントのChoice Intentが選ばれ、Lambdaに送られます。
3. LabmdaのChoiceIntentの処理が実行され、DynamoDBのデータを見ながら、ランダムでゴミ捨て当番を選び、メッセージがAlexaに返される
4. Alexaはメッセージを音声で話す


3. 当番の登録を確認する対話モデルで詰まった

次のように、登録を確認する対話モデルはとても便利なのですが、普通にインテントから登録する形では作れませんでした。
いろいろAlexaスキルでインテントをいじったのですがなかなかうまく作れませんでした。

f:id:nipe880324:20180614235208p:plain:w240

Delegateディレクティブを使ってやることでできました。
ソースコードは次のような形です。

'RegisterIntent': function () {
  // 対話モデル
  var filledSlots = delegateSlotCollection.call(this);

  ...
}

...

function delegateSlotCollection () {
  if (this.event.request.dialogState === "STARTED") {
    // updateIntentありの、Dialog.Delegateディレクティブを返す
    var updatedIntent = this.event.request.intent;
    this.emit(":delegate", updatedIntent);
  } else if (this.event.request.dialogState !== "COMPLETED") {
    // updateIntentなしの、Dialog.Delegateディレクティブを返す
    this.emit(":delegate");
  } else {
    // Dialogが完了し、必須のスロットに値がすべて入ったので、普通のインテントハンドラーが呼ばれます
    return this.event.request.intent;
  }
}


4. まとめ

Alexaスキルはアイデア次第で簡単に作れる仕組みが整っているのでぜひチャレンジしてみてください。
個人的にはAlexaスキルではないのですが、スマートホームのように、電気のON/OFFやテレビやエアコンの操作など行いスマートホーム化を推進したいと思っています。

もし作りたいなと思った場合は、キャンペーンページにも記載されていますが、チュートリアルや簡易なスキルのソースコードもあるので参考にしてみるといいと思います。

Alexaスキル開発チュートリアル
クイズゲームスキルの構築 - GitHub
Alexa 豆知識スキルの作成
Alexa トリビアスキルの開発 - GitHub


以上です。