こんにちは、サイオステクノロジー技術部 武井です。今回は、前回に引き続き、Amazonが販売しているスマートスピーカーAmazon Echo(アマゾンエコー、以降Echo)を使って、指定したユーザーのGoogleカレンダーの今日の予定を教えてくれるスキルを開発します。
Amazon Echoとは?
音声だけで操作できるスマートスピーカーです。例えば「アレクサ、音楽かけて」とEchoに話しかけると、音楽を再生してくれたりします(Amazon Prime MusicもしくはAmazon Prime Music Unlimitedの契約が必要)。
また、「スキル」というものをアレクサにインストールすると、色々な機能を拡張できます。iPhoneでいうところのアプリみたいなイメージです。
例えば、インターネットラジオ「ラジコ」のスキルをインストールして、「ラジコ、何かラジオかけて」というとラジオを再生してくれます。
スキルは、独自開発も可能で、今回はこのスキルを自分で作っちゃおうという話です。
やりたいこと
Google社が提供している予定を管理するツール「Googleカレンダー」に登録されている予定を読み上げるスキルを開発します。「アレクサ、武井さんのGoogleカレンダーの今日の予定を教えて」と話すと、その日の予定を読み上げてくれる機能を提供します(^o^)
スキル開発の流れ
スキル開発の詳細については以下を参考に頂ければと思います。非常にわかりやすくまとまっています。
https://developer.amazon.com/ja/alexa-skills-kit/training/building-a-skill
が、せっかちな人のためにすごく簡単にスキル開発の流れをまとめてみました。
まずはじめに、Alexaの基本的な構成を図にしてみました。
上記の流れを順を追って、ご説明します。
(1)では、ユーザーがEchoに向かって話しかけます。Echoの音声解析エンジンがユーザーの発話を解析します。このエンジンが非常に優秀で、ちゃんと聞き取ってくれますし、結構離れていてもOKです。この発話内容は後ほど、Alexaエンジンに送られるわけですが、Alexaエンジンでは発話内容を以下のように分類します。
ウェイクワード
Echoに話しかける際の、最初の言葉です。どんなときでもこの言葉を最初に発する必要があります。人で言うところの名前みたいなものですね。
呼び出し名
スキルの名称です。これを発話することで、起動するスキルを決定します。例えば天気予報を教えてくれるスキルであれば、事前に呼び出し名を「天気予報」と定義しておけば、「アレクサ、天気予報で明日の降水確率を教えて」といえば、天気予報のスキルが起動します。
サンプル発話
Alexaに命令をする時の、基本的な発話内容です。ここでは、「明日の降水確率を教えて」と定義していますが、人によっては色々な言い方をするので、たくさん定義しておくと便利です。例えば、「明日の降水確率は何?」と聞く人もいれば、「明日の降水確率を知りたい」という人もいるかも知れません。その分だけ、サンプル発話を登録しておけば、それだけいろんな言い回しにも答えることが出来ます。
スロット
変数のようなものです。上記の図では「明日の降水確率を教えて」ですが、「明後日の降水確率を教えて」もあるかもしれませんし、「2018年3月14日の降水確率を教えて」もあるかもしれません。ユーザーの発話の中で、変動する部分で、しかもその内容によって、Alexaからの答えを変えたい場合は、スロットを使います。
(2)では、Echoが発話内容を認識して、クラウド上にあるAlexaに発話内容を送ります。
(3)では、先程(1)で紹介した「呼び出し名」「サンプル発話」「スロット」の定義内容に基づいて、発話内容を解析して、Lambdaにリクエストを送ります。
(4)では、(3)で送られてきたリクエストに基づいて答えを生成します。Lambdaでなくても可能ですが、Lambdaが一番手順が簡単です。
つまり、スキル開発とは以下の2点を行うことになります。
- (3)で説明した「呼び出し名」「サンプル発話」「スロット」の定義をAmazon Developer Console上で行う。
- (4)で説明した「答え」の生成をLambda(でなくてもよいのですが)で開発する。
今回のシステム構成
今回のキモは、Amazon Echoで指定されたユーザーのGoogleカレンダーの予定をどのようにして取得するかということになります。これを実現するために、Google Apps Scriptというものを使います。
Google Apps Script等は、G Suiteで提供しているサービス(メール、カレンダー、ドライブ等)の操作が可能なサーバーサイドプログラミング言語です。G Suiteアカウントを持っている人であれば、どなたでもご利用出来ます。しかも、サーバーサイドで動くので特別な環境がいりません。具体的には以下のようなことができます。
- 毎日決まった時間にGoogleカレンダーの今日一日の予定をメールで送信する
- スプレッドシートの特定のセルに変更があったら、Slackで通知する
- 簡単なRest APIを作成する
詳細はこちらをご覧ください。
Google Apps ScriptではRest APIも作成可能です。今回はこの機能を使い、指定したユーザーの予定をJSONで返すRest APIを作成して、それをLambdaに食わせようと思っております。Rest APIの仕様は以下になります。
■リクエスト
Method | GET |
URL Query String Parameter |
name=[予定を知りたい人の名前] |
■レスポンス
HTTP Status |
200 |
Content-Type |
application/json |
Response Body | [ { “start”: “[予定開始日時(YYYY-MM-DD HH:mm:SS)]”, “end”: “[予定終了日時(YYYY-MM-DD HH:mm:SS)]”, “title”: “[予定のタイトル]” }, ・・・ ] |
システム構成は以下のとおりです。
ポイントは(5)で、Google Apps ScriptがLambdaからのリクエストに対して、指定したユーザーの予定が記載されたJSONを返しています。
開発手順
ここからは、先のシステム構成でご説明したものを開発していきます。
まず、Google Apps Scriptの部分から開発していきます。
下記のURLにアクセスして下さい。
「新規スクリプト」をクリックして下さい。
プロジェクトの画面が表示されます。
先程の「コード.gs」のエリアに以下のソースコードを貼り付けて下さい。指定したアカウントのGoogleカレンダーの今日一日の予定をJSONで返すスクリプトです。
プロジェクト名を入力して「OK」をクリックして下さい。これで保存されました。
いよいよ公開してみます。「ファイル」→「公開」→「ウェブアプリケーションとして導入」の順にクリックして下さい。
公開範囲を選ぶことが出来ます。Lambdaからアクセスできる必要があるので、「全員(匿名ユーザーを含む)」を選択して、「導入』をクリックします。
注) 今回のスクリプトでは特に認証を設けておりませんが、実際にご利用になる際には、必ず何らかの認証処理を入れて下さい。
「現在のウェブアプリケーションのURL」をメモして「OK」をクリックして下さい。このURLは後で使うので、大事にメモしておいて下さい。φ(..)メモメモ
Google Apps Script(Googleカレンダーの予定をJSONで返す処理)の開発はこれで終わりです。次は、アレクサ、Lambdaの開発を行います。
下記のURLにアクセスして下さい。
「サインイン」をクリックします。
アカウント作成画面が表示されます。必要な項目を入力して、「Amazon Developerアカウントを作成」をクリックして下さい。
以下の画面が表示されます。必要な項目を入力して下さい。
最後に「保存して続行」をクリックして下さい。
ライセンス確認画面が表示されます。
ひとしきり確認して、最後に「承認して続行」をクリックして下さい。
支払いの確認画面が表示されます。とりあえず、今回はテスト的に作成するだけなので、すべて「いいえ」としておきます。最後に「保存して続行」をクリックして下さい。
Amazon Developer Consoleのダッシュボードが表示されます。「ALEXA」のタブをクリックして下さい。
「Alexa Skills Kit」をクリックして下さい。
「スキルの作成」をクリックします。
スキル名を入力します。ここでは「GoogleCalendar」とします。「次へ」をクリックして下さい。
「カスタム」を選択して、「スキルを作成」をクリックします。
日本語の名前のスロットを使うために、言語を日本語にする必要があります。「言語設定」をクリックします。
「新しい言語を追加」をクリックします。
「日本語」を選択します。
「英語(米国)」を削除して、「保存」をクリックします。
スキルの呼び出し名を設定します。「呼び出し名」をクリックして、「スキルの呼び出し名」の下のテキストボックスに「グーグルカレンダー」と入力します。
次に、サンプル発話の部分を作成します。「インテント」をクリックして下さい。すると、画面右部にテキストボックスと「カスタムインテントを作成」のボタンが表示されます。テキストボックスの部分にサンプル発話名を入れます。ここでは「TellMeYourCalendar」として、「カスタムインテントを作成」をクリックして下さい。
ちょっと下にスクロールして、スロットを定義します。「Googleカレンダーの〇〇さんの予定を教えて」の〇〇の部分に入るものを設定します。「name」と入力して「+」をクリックします。
「スロットタイプを選択」をクリックして「AMAZON.FirstName」を選択します。FirstNameとありますが、日本語の姓も結構正しく認識してくれるっぽいのでコレを使います。
ちょっと上に戻って、「サンプル発話」の部分のテキストボックスに「{name}さんの今日の予定を教えて」と入力して、「+」をクリックします。
とりあえず、ここでいったん保存します。「モデルを保存」をクリックします。
とりあえず、Amazon Developer Consoleでの基本的な設定は終わりました。次は、答えの内容を作るために、Lambdaの設定をしましょう。
以下のURLにアクセスして、AWSのマネジメントコンソールに行きます。
https://aws.amazon.com/jp/console/
「コンソールへログイン」をクリックして下さい。
下記の画面でログインIDを入力し、次の画面でパスワードを入力します。
下記のように、リージョンを「アジアパシフィック(東京)」にします。
「AWSサービス」の表示の下のテキストボックスに「lambda」と入力して、Enterを押して下さい。
「関数の作成」をクリックします。
「設計図」の方を選択して、下記のテキストボックス(フィルターの追加)と書いてあるところに「alexa」と入力してEnterをクリックして下さい。そして、その結果として表示されるものの中から「alexa-skill-kit-sdk-factskill」をクリックして下さい。
関数の基本情報を入力します。下記のように入力します。最後に「関数の作成」をクリックして下さい。
トリガーの追加の画面で「Alexa Skills Kit」をクリックして下さい。左部の画面に追加されます。
ちょっと下にスクロールすると「トリガーの設定」があります。「スキルID検証」を「無効」にして、「追加」をクリックして下さい。
ちょっと上に戻って、「GoogleCalendar」をクリックすると、下の方にindex.jsが表示さます。
index.jsのコードを以下のように書き換えて下さい。
画面上部のARNと記載されているところに書いてある値をメモします。後ほどAmazon Developer Consoleで使います。これは、LambdaのエンドポイントURLです。これをAmazon Developer Consoleで設定すると、この関数が呼び出されるようになります。そして、最後に「保存」をクリックします。
Amazon Developer Consoleに戻ります。画面左部メニューの「Endpoint」をクリックして、「AWS Lambda ARN」を選択して、先程メモした値をテキストボックスに入力します。最後に「Save Endpoints」をクリックします。
左部メニューの「Invocation」をクリックして、「モデルを保存」「モデルをビルド」の順番にクリックします。スキルの開発は終わりです。
次は、テストしてみましょう。Alexは実機がなくてもシミュレートできるインターフェースが用意してあります。画面上部の「テスト」をクリックして下さい。そして「このスキルでは、テストは無効になっています」の横にあるスライドバーをクリックして、テストモードを有効にします。
マイクのマークがあるテキストボックスに「グーグルカレンダーのたけいさんの今日の予定を教えて」と入力してEnterを押して下さい。事前にGoogleカレンダーに登録した予定が表示されれば大成功です━━━━(゚∀゚)━━━━!!
さて、次は実機で動かしてみましょう。スキルはAmazonの審査を受けて、公開しなくても、ベータテストと言って、特定のアカウントだけでテストできるモードがあります。Amazon Developer Consoleの画面上部の「公開」をクリックして下さい。そして「プライバシーとコンプライアンス」をクリックします。
何やらいろんなチェック項目が出てきました。この内容によってテストが出来なくなるのかどうかは確認してませんが、私はとりあえず全部「いいえ」としました。「テストの手順」も入力して下さい。コレを入力しないと、実機にテスト公開出来ません。最後に「保存して続行」をクリックして下さい。
「スキルのプレビュー」の「日本語(日本)」をクリックします。この画面ではスキルの情報を入力します。入力が必須のものは全て入力しないと、スキルのベータテストが実施できません。必須のものを全て入力したら、画面一番したの「保存して続行」をクリックします。
「このスキルにアクセスできるユーザー」を「公開」、「ベータテスト管理者用Eメールアドレス」に管理者用メールアドレス、「テスターのEメールアドレス」にテストをしたいAmazon Echoに紐付いているAmazonアカウントを入力して、「追加」をクリックします。
「ベータテストを有効化」をクリックします。
すると、先程登録したAmazonアカウントのメールアドレス宛に以下のようなメールが届きます。「Enable Alexa skill “GoogleCalendar”」をタップして下さい。
同意画面が表示されますので、「同意する」をタップして下さい。
するとAlexaのアプリの画面に遷移して、以下のようになります。「有効にする」をタップして、スキルを有効にして下さい。
さぁ、これで準備は整いました。Echoに向かって、「Googleカレンダーの〇〇さんの今日の予定を教えて」と叫んで見て下さい。Googleカレンダーに登録してある予定を読み上げてくれれば成功です(`・ω・´)シャキーン
最後に
いかがでしょうか?Echoって面白いですね。色々アイデアが広がりそうです。これからスキルの開発をする方にとって、本記事がお役に立てれば幸いです。
これができると仕事が捗るので、素人が再現しようとやってみました。他に情報がないので助かっていますが、テストでエラーが起きて困っています。
apps sprictのところで「現在のウェブアプリケーションのURL」をメモして「OK」をクリックして下さい。このURLは後で使うので、大事にメモしておいて下さい。
とあるのですが、これはどこで使いますか?
教えていただけると幸いです。
おじー様
サイオステクノロジー武井です。
> これができると仕事が捗るので、素人が再現しようとやってみました。他に情報がないので助かっていますが、
> テストでエラーが起きて困っています。
本記事をご覧頂きまして誠にありがとうございます。
> apps sprictのところで「現在のウェブアプリケーションのURL」をメモして「OK」をクリックして下さい。
> このURLは後で使うので、大事にメモしておいて下さい。
> とあるのですが、これはどこで使いますか?
> 教えていただけると幸いです。
こちらですが、わかりにくくて申し訳ございません。Lambdaのindex.jsのコード内の
[Google Apps Scriptで導入した後に表示されるURL]
と記載されている部分に入れて下さい。
もし、他に何かご不明な点があれば、またご連絡頂ければと思います。
今後とも本ブログを宜しくお願い申し上げます。