Posted at

電車の運行情報を教えてくれるAlexa Skillを作ってみた

More than 1 year has passed since last update.

この記事はGoogle Home向けに作った 電車の運行情報を教えてくれるAssistant対応アプリを作ってみた のAlexa Skill版です。


構成

Alexa Skillの基本構成は以下のようになります。Lambdaの部分はHerokuなどを使って自前で準備したサービスを使うこともできます。今回はそのままLambdaを使いました。

これらの基本構成は会社の同僚が作った 嫁をなだめるSkill を参考にすれば大枠は完成します。今回はそれ以外の部分を中心にまとめます。


Alexa Skill Kit

Amazon Echoに向かって「○○を開いて」と言ったら起動し、様々な音声コマンドに反応する仕組みを自前で作ることができるプラットフォームがAlexa Skillです。


Skill Builder

Skill BuilderはまだBETA機能ですが、Google HomeのDialog Flowのように複雑な音声コマンドに対応するSkillを開発できるようになります。まずは以下のように運行情報を問い合わせるカスタムIntentを作成します。

Train の部分はカスタムスロットで以下のようにSynonyms(同義語)の設定ができます。

Synonymsを設定することで異なるワードも同じ意味として解釈してハンドリングすることができるようになります。


Lambda

Synonyms(同義語)で設定した id をチェックして鉄道会社ごとのサイトにアクセスし運行情報をチェックします。以下はNode.jsで実装した例です。

// 省略

'TrainStatusIntent': function () {
var train = this.event.request.intent.slots.Train;
var speechOutput = train.value + 'の運行情報を取得できませんでした。';
// SlotにSynonymが設定されているかをチェックして鉄道会社ごとにサイトをチェックする

if ('resolutions' in train) {
if (train.resolutions["resolutionsPerAuthority"][0]["status"]["code"] == 'ER_SUCCESS_MATCH') {
var slotId = train.resolutions["resolutionsPerAuthority"][0]["values"][0]["value"]["id"];

if ( slotId==='HANKYU' ) {
// 阪急のサイトで運行情報を取得する
} else if ( slotId==='HANSHIN' ) {
// 阪神のサイトで運行情報を取得する
}
}
}

console.log(speechOutput);
this.emit(':tell', speechOutput);
},
// 省略

Skill BuilderでSynonymsを設定した場合は上記のように resolutions 配下をチェックすることで同義語の id を取得することができます。詳細は別記事にまとめました。

IntentRequest内でCustom Slot Typeの同義語の情報を取得する

また、運行情報を取得する時に外部アクセスすると応答までに少し時間がかかるためタイムアウトの設定をデフォルトより少し長くしておくほうが良いでしょう。


まとめ

Alexa Skill KitとLambdaを設定することでSkillのテストが可能になりますが、上記別記事にも書きましたがSynonymの設定はサービスシミュレーターではテストできないのでご注意ください。構成はGoogle Assinstant対応アプリよりシンプルでわかりやすいように思いますがBeta機能で開発途上なところは若干わかりにくいかもしれません。Test SimulatorというBeta機能もありますが今回はまともに使いこなせなかったので説明は省きます。これらBeta機能が正式に使えるようになるともっと開発しやすくなるかもしれません。ただ、基本的な仕組みを理解しておけば開発の手順はそれほど難易度は高くないと思います。

今回サンプルとして作ったLambdaのスクリプトは下記に置きました。

AlexaSkilll-TrainStatus