アレクサに電車の時刻をしゃべらせる 4月12日, 2023


katakuri
御前山のカタクリ

これまで試用してきた「近くの駅の電車発車時刻をアレクサに尋ねる」マイプロジェクトもかなりこなれてきた。「○○(駅名)で次の(上り|下り)の電車は」と聞くと直近の時刻を応えてくれる。色々な時刻の電車を利用する場合には結構便利。

春のダイヤ改正も済んで、時刻表も更新した。アレクサに関連した具体的方法には記事も多いので、ここでは作業全体を見渡すためのポイントと思われる点と、AWS上に設置する短いpythonのコードの例に焦点を絞ってまとめてみた。自分でも、久しぶりにコードなどを更新しようとした時に、「あれれ、これどうするんだっけ?」とちょっととまどうことも多い。── 開発者コンソールにログインしたら英語表記で、日本語に変更するのは? とか。左下の「English(US)」を「Japanese(日本語)」にすればよいだけなのに──。それで、後日のメモになればという思いもあってのことだ。

アレクサに時刻表をしゃべらせるためには、大きく2つのことをしなければならない。

1. アレクサスキルを作成する
2. AWSにlambda関数を作成する

■ アレクサスキル

アレクサ・ディベロッパー・コンソール

設定方法の詳細はあちらこちらに記事も多いので省略するとして、ポイントと思われる点を箇条書きで書き出せば、以下の通り。

○スキルを作成する

  • ・「呼び出し>スキルの呼び出し名」を設定する ── 例: 「チャオの時刻表」
  • ・「対話モデル>インテント」を追加する ── 例: 「SelectTableIntent」
    • 「{St_Name}で次の{UpDown}の電車は」などを登録する。
    • インテントスロット ── この「スロット」の値がlambda関数に渡されて処理対象となる。
      • 例:{St_Name}
        • 「ダイアログ」タグ
        • 「このインテントを完了させるために、このスロットは必須です」を設定する。
        • Alexaの音声プロンプト例 ── 例:{St_Name}はどこですか
        • ユーザーの発話 ── 例:「{St_Name}」「{St_Name}です」「{St_Name}駅です」
        • 「検証」タグ
          • 「検証ルールを作成」 ── 「値セットのみを受け付ける」を選択する。
      • ※例:{UpDown}も同様に作成する

・アセット

  • 「スロットタイプ」 ── ここに「値セット」を作成する。
    • EkinoNamae 該当する駅名リスト
    • NoboriKudari 「上り」「下り」

・エンドポイント

  • スキルID ── こちら側のID(後の手順でlambda関数側に入力が必要なのでCopyしておく)
  • デフォルトの地域 ── あちら側のID(lambda関数側の接続個所。AWSからコピーしてくる)
    • 例: arn:aws:lambda:ap-northeast-….:function:NAME_OF_LAMBDA関数
  • ※ この両IDを設定することでスキルとlambda関数が接続され、問い合わせに対して声で応答がある。

■ AWSにlambda関数を用意する

AWSマネジメントコンソール にアカウントを作成する。(lambda関数を利用するための詳細は省略)

設定する関数の例は github に置いてある。並んでいる mkTimeTableData.py は時刻表データを取得しファイルするためのコード。

  • lambda関数の「関数の概要」に「トリガーを追加」ボタンがあり、ここにAlexaの「スキルID」を登録する。
  • lambda関数のARNが表示されている筈なので、これをアレクサスキルの「エンドポイント」にCopyする。

■ 「テスト」

アレクサスキルに戻ってテストする。

エンドポイントにAWS lambdaのARNを入力する。ここで、想定通りに応えが得られるか十分にテストする。設定に問題があると、スキルに対するlambda関数の応答をテストする手順が混乱するだろう。応答が想定外の場合、右欄「スキルの呼び出し」JSONに表示されるものがヒントになる場合が多く、この欄に何も表示されないタイプのNGは、対話モデルなどに問題があるだろう。また、「スキルが正しく応答できませんでした」という場合は、AWSのlambda関数に問題がある場合が多い。

AWSマネジメントコンソールで、「モニタリング」タブに「View CloudWatch logs」があって、応答のログを確認することができる。そこに「Error」となっている場合、解決のヒントになることがある。

■ 関連ファイルのupload方法

  • ・lambda_function.py
  • ・mg_timetable.txt
  • ・jpholiday folder
    これらをフォルダーに置き、zipに固める。
    • ※ jpholidayパッケージをこのフォルダーに用意するためには、(末尾のドットに注意)
      • $ pip install jpholiday —target .

$ zip -r function.zip .

AWSのコードソース編集画面の右上の「アップロード元」セレクターから「.zファイル」を選び、このファイルをアップロードする。