追記:
2018/7/29 Echo Spot対応版作りました
はじめに
ついに待ちわびていたAmazon Echoが我が家にやってきました。
LINE WAVE, Google Homeに続いて3台目のスマートスピーカーです。
Amazon EchoもGoogle Homeみたいに自分で対話アプリを作れるそうなので、以前Google Home(& DialogFlow)で作っていたアプリを移植してみました。
つくるもの
三鷹市在住の我が家では最寄り駅までバスに乗らないといけないのですが、バスは電車と違って到着間隔が長いので、到着に合わせて家を出る必要があります。小田急バスはリアルタイム運行状況をWebサイト上で公開しているのでいつもスマホで確認していましたが、スマホを開くのも面倒なのでAmazon Echoが到着時刻を教えくれるようにしてみました。
まずはシンプルに「Alexa, "時刻表"を開いて」でバスの到着時刻を教えてくれるようにしてみました。
おおまかな流れ
Amazon Echo (Alexa)との対話をさせるためにはおおまかに以下の手順を踏みます。
- AWS LambdaでAlexaとの対話プログラムを書く
- Amazon 開発者コンソールでスキルの設定をする
- (一般公開するなら)審査を受ける
自分の環境で動くだけで良いならば3は不要です。
AWS Lambdaでプログラムを書く
今回はServerless + Pythonで組んでみました。
サンプルコードはgithubに上げました。
やっている事は、小田急バスのリアルタイム運行状況(参考:三鷹市役所→三鷹駅の運行状況)をスクレイピングしてAlexaのメッセージを組み立てているだけです。恐らく読んでいる人の99.9%は小田急バスユーザーではないと思いますが、他のバスでもダイヤや運行状況が公開されていたら簡単に出来ると思います。
スクレイピング部分を除いてAlexaにしゃべらせる箇所はこれだけです。
response = {
'version': '1.0',
'response': {
'outputSpeech': {
'type': 'PlainText',
'text': message, # しゃべらせたいメッセージ
}
}
}
return response
スロット(発話に含まれるキーワード)を使った例はServerlessのサンプルを参考にすると良いと思います。ユーザーとAlexaで対話させたいならば、LambdaのテンプレートにもPythonやJavaScriptのコード例があります。
Lambdaにデプロイした後は、AWSのコンソールで当該関数の設定画面を開いてARNをメモっておきます。(ところでserverlessのコマンドでARNを取得する方法ってあるのでしょうか?)
Alexaのスキルを作成する
プログラムの準備が出来たら次はAlexaからスクリプトを呼び出す部分(スキル)の設定をAmazon開発者コンソールでします。Amazon開発者コンソールはEchoと紐付いているAmazonアカウントでログインします。ログインしたら「スキル開発をはじめる」のボタンからスキルの作成を行います。
スキル情報
スキル名と呼び出し時の名前(今回は「時刻表」)を設定します。
「Alexa, "時刻表"を開いて」でこのスキルが起動します。呼び出し方はいくつかパターンがあるので、公式ドキュメントを参考に決めると良いです。本当は「バスの時刻を教えて」とかで起動出来ると良いんですが出来ないみたいです…。
対話モデル
対話させたい時に利用します。
今回は対話しないので特に編集せずにSaveとBuildするだけです。
設定
AWS Lambdaを選択し、先ほど作成した関数のARNを記入します。
テスト
上部のチェックを入れるとログインしているAmazonアカウントに紐付いているAmazon Echoから呼び出せるようになります。下部でテストも出来ます。
デモ
https://twitter.com/osa9/status/939861080192434182
(恥ずかしいので自分のしゃべっている部分は省略しています)
おわりに
今回はAlexaに呼びかけるとバスの時刻を教えて貰うだけの簡単なスキルを作成してみました。今回ぐらいの簡単なサンプルなら1時間ぐらいで出来るのでとてもお手軽です。ただスマートスピーカーを使うと便利というシチュエーションがなかなか思い浮かばないのでアイデアが重要な気がします。
Siri(iPhoneだけど)やGoogle Homeより色んなパターンで起動出来る(気がする)ので、個人的には一番使い勝手が良かったです。スキルが豊富なのも良いですね。あとは、置物と化しているLINE WAVEもいずれSDKが公開されるとの事なのでこちらにも期待です!