hi, hikaru

『駅すぱあと』でお馴染みヴァル研究所で、テクニカルエバンジェリストとして働いている丸山が綴るブログです。

駅の乗り入れ路線を教えてくれるAlexaスキルを作ってみた

スマートスピーカーで色々遊んでみたいなあと思いまして、経路探索WebAPI『駅すぱあとwebサービス』と連携させたアレクサスキルを作ってみました。 今回は備忘録として作成手順をまとめます。

作るもの

「アレクサ、新宿駅の乗り入れ路線を教えて」
新宿駅の乗り入れ路線は24本あります。JR埼京線、JR埼京線快速、JR湘南新宿ライン・・・」

任意の駅の乗り入れ路線を教えてくれるアレクサスキルを作ります。

私はAWSが公式で提供している「Alexaスキル開発トレーニング」でAlexa開発を始めました。手順がとても丁寧に書いてあってわかりやすいです!

developer.amazon.com

今回の手順はざっくりとしか書いてないので、先にこちらを見ておくとスムーズに開発できると思います。

必要なツール、サービス

※Echoがなくても開発はできるところが肝!

作成手順

1. Lambdaの作成

AWSマネジメントコンソールでLambdaのページにアクセスし、Lambda関数を作成します。 関数の作成をクリックし、一から作成で関数を作成していきます。

f:id:hiiiiiiihikaru:20180302103542p:plain

項目 説明
名前 Lambda関数の名前です。これは後から変更することができません。
例:EkiInfoSkill
ランタイム Lambda関数で使用する言語です。
例:Node.js 6.10
ロール Lambda関数のアクセス許可の定義です。
例:既存のロールを選択

正常に作成することができたら、設定を行います。

項目 説明
Designer トリガーの追加から、Alexa Skill Kitをクリック
トリガーの設定 とりあえず無効にしておきましょう。
関数コード コードエントリタイプ:.ZIP ファイルをアップロード
zipファイルはこちらからダウンロードします。https://cdn.rawgit.com/hmaruyama/alexa-skill-eki-info/25d726c2/alexa-skill-eki-info.zip
ランタイム:Node.js 6.10
ハンドラ:index.handler
※アップロードするファイル名を指定します。app.jsならapp.handlerとなります。
環境変数 キー:EKISPERT_KEY
値:駅すぱあとwebサービスのアクセスキー

全ての設定が完了したら保存をクリックします。

次に、作成したLambda関数のテストを行います。

画面右上のテストをクリックします。 イベントテンプレートから、Alexa Start Sessionを選択し、適当にイベント名を入力して作成テストを実行します。

f:id:hiiiiiiihikaru:20180302165027p:plain

テストが成功したらLambdaの設定は完了です。 次のフェーズで、LambdaのAmazonリソースネームを利用するので、右上のarnから始まる文字列を手元にコピーしておきましょう。

2. スキルの作成

Amazon 開発者ポータルの画面右上Developer Consoleから、ALEXAタブをクリック、Alexa Skills Kit始めるから新しいスキルを追加するをクリックします。

スキル情報

項目 説明
スキルの種類 カスタム対話モデル
言語 Japanese
スキル名 例:駅知識
呼び出し名 例:駅知識
グローバルフィールド 全てデフォルトの状態にしておきます。

対話モデル

インテントスキーマ
{
  "intents": [
    {
      "slots": [
        {
          "name": "StationName",
          "type": "ListOfStationName"
        }
      ],
      "intent": "HoroscopeIntent"
    },
    {
      "intent": "AMAZON.HelpIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"
    }
  ]
}
カスタムスロットタイプ

タイプを入力:ListOfStationName

値を入力:

しんじゅく
とうきょう
こうえんじ

カスタムスロットタイプは、ここに羅列したワードを確実に採用する訳ではないらしいです。他のワードも受け付けてくれると。 なので今回は、駅名を入れる箱として利用することにします。

サンプル発話
HoroscopeIntent {StationName} を 教えて
HoroscopeIntent {StationName} の 乗り入れ路線 を 教えて
HoroscopeIntent {StationName} 駅を 教えて
HoroscopeIntent {StationName} 駅の 乗り入れ路線 を 教えて
HoroscopeIntent {StationName} えきを 教えて
HoroscopeIntent {StationName} えきの 乗り入れ路線 を 教えて
HoroscopeIntent {StationName} 駅
HoroscopeIntent {StationName} えき
HoroscopeIntent {StationName}

日本語はあまり柔軟にここを吸収できないらしいです。なのでサンプル対話は頑張ってたくさん入れるとユーザに喜ばれます。

設定

サービスエンドポイントのタイプは、AWS LambdaのARN (Amazonリソースネーム)を選択し、下の入力欄に先ほどコピーしたarnから始まる文字列を貼り付けます。

他の選択肢は全てデフォルトのままでOKです。

テスト

例えば、渋谷駅の乗り入れ路線を教えてとか入力して駅知識を呼び出すをクリックしてください。

json形式のレスポンスが返れば、正常に実行できることが確認できました!わーい!

f:id:hiiiiiiihikaru:20180302165729p:plain

終わりに

所感をつらつらと。

  • 詰まりポイントは沢山ありそうだけど約1時間ほどでAlexaスキルは開発できる
  • 漢字は結構読んでくれるらしい
  • 全てのパターンを毎回手動で確認するのは大変そうなので、自動テストとかあると頼もしいな

実はこのスキルは、モブプログラミングと呼ばれる開発手法で実装したものです。その話はまた別の記事で書くかも。

val-labo.connpass.com

参考資料