スマートフォンでアプリから通知を受け取れるように、スマートスピーカーでも音声アプリケーションから通知を受け取ることができます。2019年3月現在、通知機能があるのはAlexaのみのため、今回はAlexaの通知機能について解説します。

1. 通知機能とは?

Amazon EchoシリーズをはじめとしたAlexa搭載デバイスが通知を受け取ると通知音とLEDで知らせてくれます。ユーザーは「アレクサ、通知は何?」と話しかければ通知の内容を聞けます。ヤフーのスキルの中では「Yahoo!天気・災害」と「Yahoo!路線」が通知機能に対応しています。「Yahoo!天気・災害」では、朝7時ごろ、デバイスに登録してある住所の降水確率が高いときに次のような通知をお届けしています。

Alexa:(通知音)
ユーザー: アレクサ、通知はなに?
Alexa: 新しい通知が1件あります。Yahoo!天気からお知らせです。本日は午後から降水確率が高くなっています。雨具があるとよいかもしれません。

また、「Yahoo!路線」ではアカウントリンクをしていると、毎朝6時から8時の間にWebやアプリから登録した路線に運行情報が出ている場合に通知が届きます。忙しい朝にスマホを見る余裕がないときでも、AlexaのLEDが点灯していれば一目で気づけ、出かける支度をしながらでも声一つで通知を聞けるのでとても便利です。

2. 通知を受け取るには?

Alexaアプリからスキルを有効化する際に、「Alexaの通知」を有効にする必要があります。「Yahoo!路線」を例に説明します。Alexaアプリのスキルストアから「Yahoo!路線」を開き、「有効にして使用する」を選択します(画像1)。スキルのアクセス権の画面が開くので、「Alexaの通知」にチェックを入れて有効化し(画像2)、「アクセス権を保存」を選択します(画像3)。

  • 「Alexaの通知」有効フロー

    「Alexaの通知」有効フロー

また、特定の時間に通知を受け取りたくない場合は「おやすみモード」に設定することで、特定の時間帯に通知を無効化することができます。設定の手順は次の画像の通りです。

  • 「おやすみモード」のフロー

    「おやすみモード」のフロー

3. 通知を送るには?

「Yahoo!路線」や「Yahoo!天気・災害」では以前にデベロッパー・プレビューで公開されていた通知機能を用いています。ここでは現在一般公開されている、ProactiveEvents APIを用いて任意のタイミングで各ユーザーに異なるメッセージを通知する方法について説明します。

  • 事前準備

ユーザーが通知権限を有効にし、PermissionAccepted イベントが発生したときに、データベースにAlexa User IDを保存しておきます。

  • 通知送信処理

次の図の流れで処理を行います。青色部分は開発者管理、赤色部分はAmazon管理となります。

  • 通知送信処理のフロー

    通知送信処理のフロー

    1.通知イベントが発生
    2.通知を送信するためのアクセストークンを取得

リクエストパラメーターとして、Alexa Developer Consoleのアクセス権限セクションで確認できるクライアントIDとクライアントシークレットを付与して、アクセストークン取得APIをPOSTリクエストします。

リクエスト

CID=''
CSC=''
API_URL=https://api.amazon.com/auth/O2/token

curl -X POST ¥
     -H 'Content-Type: application/x-www-form-urlencoded' ¥
     -d "grant_type=client_credentials&client_id=$CID&client_secret=$CSC&scope=alexa::proactive_events " ¥
     "$API_URL"

レスポンス

{
 "access_token":"",
 scope":"alexa::proactive_events",
 "token_type":"bearer",
 "expires_in":3600
}

アクセストークン取得についての詳細はこちらを参照してください。

    3.データベースから通知を送信するAlexa User IDリストを取得
    4.各Alexa User ID対してProactiveEvents APIをリクエスト

ヘッダーに手順2で取得したアクセストークンを付与し、以下のような形式でProactiveEvents APIをPOSTリクエストすることで通知を送信できます。

リクエスト

API_URL= https://api.fe.amazonalexa.com/v1/proactiveEvents/

curl -X POST ¥
   -H "Content-Type:application/json" ¥
   -H "Authorization:Bearer " ¥
   -d ¥
'{
    "timestamp": "2019-03-19T07:00:00.00Z",
    "referenceId": "",
    "expiryTime": "2019-03-19T08:00:00.00Z",
    "event":<event_payload,>
    "relevantAudience": {
        "type": "Unicast",
        "payload": {
            "user": "userId"
        }
    }
}
' ¥
 "$API_URL "

リクエストのJSON中に赤字で示したeventの詳細はこちらをご参照ください。

例えば、ごみ収集のリマインダーを送信したいときは、eventに次のようなJSONをセットすることで、「火曜日のゴミ収集は、布類、プラマークゴミです」と通知を送れます。

{
    "name": "AMAZON.TrashCollectionAlert.Activated",
    "payload": {
        "alert": {
            "garbageTypes": [
                "CLOTHING",
                "RECYCLABLE_PLASTICS"
            ],
            "collectionDayOfWeek": "TUESDAY"
        }
    }
}

garbageTypes のリストを変更することでゴミの種類を変えられるので、User IDごとにメッセージを出しわけることができます。また、以下のように、relevantAudienceオブジェクトのtypeを「Multicast」にすることで全てのユーザーに一斉に通知を送信することも可能です。

リクエスト

API_URL= https://api.fe.amazonalexa.com/v1/proactiveEvents/

curl -X POST ¥
   -H "Content-Type:application/json" ¥
   -H "Authorization:Bearer < アクセストークン >" ¥
   -d ¥
'{
    "timestamp": "2019-03-19T07:00:00.00Z",
    "referenceId": "",
    "expiryTime": "2019-03-19T08:00:00.00Z",
    "event":&ltevent_payload,>
    "relevantAudience": {
        "type": "Multicast"
    }
}
' ¥
 "$API_URL "

4. 通知機能への誘導

スキルにおいては、通知機能の存在をユーザーに伝えるタイミングが非常に難しいです。もし、スキルを有効化する際に通知権限を無効化した場合、そのユーザーが通知機能について知る機会は、対話フローに何かしらの工夫をしない限りありません。

そこで、「Yahoo!路線」ではアカウントリンクをしている、かつ登録路線があるが通知権限を有効化していないユーザーに対して、次のような流れで、ある一定の確率で通知権限の有効化を促すようにしています。通知権限の有効化を促した後はアプリに通知権限カードが送られます。

ユーザー:アレクサ、ヤフー路線で千代田線の運行情報を教えて。
Yahoo!路線: 千代田線は平常通り運行しています。他の路線を調べますか?
ユーザー: いいえ
Yahoo!路線: ご利用ありがとうございました。なお、通知権限を許可いただくと、毎朝6時から8時の間にYhoo!路線で登録されている路線に運行情報がある場合にお知らせいたします。Alexa アプリにご案内を送りました(破線部はある一定の確率で読まれる)。

また、「Yahoo!路線」「Yahoo!天気・災害」ともにヘルプインテントと通知ヘルプインテントの中でも通知機能について説明するようになっています。

  • 許可リクエストのイメージ

    許可リクエストのイメージ

まとめ

今回はAlexaスキルの通知機能ついて紹介しました。次回はGoogle アクションにおいて、ユーザーがアクション名を指定せずにアクションを呼び出せる「暗黙的な呼び出し(Implicit Invocation)」について説明する予定です。

著者紹介

Yahoo! JAPAN スキルプロジェクトチーム
データ&サイエンスソリューション統括本部のスマートデバイス本部に所属するプロジェクトチーム。スマートデバイス本部は、IoTや今回のテーマである音声アプリケーション開発など、ちょっとだけ未来の技術に挑戦する部署。

今回の執筆者:大島翼(おおしま つばさ)/エンジニア
スキルプロジェクト エンジニア。ヤフーでは、スマートスピーカー向け音声アプリケーションVUI設計、フロントエンド、バックエンド開発等を担当。