もし、すでにログイン機能付きのサービスをWebやスマホアプリで提供している開発者であれば、音声アプリケーション(スキル / アクション)でも既存サービスと連携して、ユーザー登録情報を利用した機能を提供したくなると思います。今回はそれを実現するための「アカウントリンク」についてお伝えします。
1. アカウントリンクとは
アカウントリンクとは、Amazon Alexaスキル / Googleアクションを既存のWebサービスと連携することができる機能です。パーソナルな情報を取得するために、IDログイン情報を取得できるアカウントリンクを使用できます。
ヤフーのスキルの中ではAlexaスキル / Googleアクションで提供している「Yahoo!路線」においてアカウントリンクを利用し、ユーザーがWebやアプリからYahoo! JAPAN IDでログインして登録した路線情報を取得しています。アカウントリンクをすることで路線名を指定せずに「(ウェイクアップワード)、Yahoo!路線を開いて」の一言で、普段使う路線の運行情報を知ることができるようになります。
アカウントリンクなしの場合 ユーザー: (ウェイクアップワード)、Yahoo!路線を開いて。 Yahoo!路線: 「山手線」のように話すと運行情報を調べます。どの路線を調べますか? ユーザー: 半蔵門線 Yahoo!路線: 東京メトロ半蔵門線は列車遅延中。信号トラブルの影響です。
アカウントリンクありの場合 ユーザー: (ウェイクアップワード)、Yahoo!路線を開いて。 Yahoo!路線: Yahoo!路線で登録されている、東京メトロ半蔵門線は列車遅延中。信号トラブルの影響です。
このように、アカウントリンクを用いて既存のWebサービスとAlexaスキル/ Googleアクションを連携することでスキルの実用性を高めることができます。
2. アカウントリンクの仕組み
アカウントリンクをして、APIからレスポンスを取得するまでの流れは次の図の通りです。
1. アカウントリンクでユーザーとWebサービスを連携
Alexaスキル/ Googleアクションのアカウントリンクの仕組みは多くのWebサービスで採用されているOAuth2.0の仕様に準拠しています。実際に既存のWebサービスとアカウントリンクする手順は以下の通りです。Google アクションもAlexaもほぼ同じであるため、Alexaを例に説明します。
(1)Alexaアプリでスキルを有効化
(2)外部の連携させたいWebサービスのログイン画面が表示
(3)ログイン後同意画面が表示
(4)同意すると完了画面が表示
2.Alexa / Google アシスタントからアクセストークンをLambdaに渡す
1の手順をすべて完了すると、外部サービスの認証・認可サーバからAlexa / Google アシスタントがアクセストークンを取得します。アカウントリンクをした状態で発話すると、Alexa / Google アシスタントからAWS Lambdaへのリクエストの中にアクセストークンが含まれるようになります(下図赤枠)。アクセストークンの有効期限や更新についてはAlexa / Google アシスタントが自動的に行うため、開発者がアクセストークンの管理をする必要はありません。
3.外部のサービスの APIを呼び出す
Alexa / Google アシスタントから送られてきたアクセストークンを用いて、既存のWebサービスからAPIを通してパーソナルな情報を取得できます。例えば、Yahoo! JAPANが提供しているYahoo! JAPAN IDに紐づく名前や、生年月日を取得することができる、属性情報APIを呼び出す場合は以下のように記述します。
GET /yconnect/v1/attribute?schema=openid HTTP/1.1
Host: userinfo.yahooapis.jp
Authorization: Bearer
すると、レスポンスとして以下のようなYahoo! JAPAN IDに紐づく情報が返却されます。
HTTP/1.1 200 OK
Content-Type: application/json
{
"user_id": "43M63NAGMHBAYMXRMY3WODOWS4",
"name": "矢風太郎",
"given_name": "太郎",
"given_name#ja-Kana-JP": "タロウ",
"given_name#ja-Hani-JP": "太郎",
"family_name": "矢風",
"family_name#ja-Kana-JP": "ヤフウ",
"family_name#ja-Hani-JP": "矢風",
"gender": "male",
"birthday": "2000",
"locale": "ja-JP",
"email": "your_email@example.com",
"email_verified": true,
"address": {
"locality": "港区",
"region": "東京都",
"postal_code": "1076211",
"country": "jp"
}
}
3.アカウントリンクを利用したスキル
アカウントリンクを使用して既存のWebサービスと連携しているスキルをいくつかご紹介します。
ジャパンネット銀行
ジャパンネット銀行とアカウントリンクすることで「アレクサ、ジャパンネット銀行の残高を教えて」と聞くと口座の残高を教えてくれます。また、セキュリティ上、他の人が残高確認できないように、アカウントリンクの際にPINコードを設定しておき、それをAlexaが確認してから残高を答えるようになっています。ホットペッパービューティー
リクルートIDとアカウントリンクすることで「アレクサ、ホットペッパービューティーで予約」と話しかけると、前回予約した美容室に、日時を指定するだけで簡単にもう一度予約ができます。クックパッド
「アレクサ 、クックパッドに大根で作れる料理を聞いて」と話しかけると、料理レシピを提案してくれます。クックパッドのアカウントとリンクしておくと、提案してくれたレシピから選んだレシピがクックパッドアカウント上のフォルダに登録されます。
4.Voice User Interfaceならではのアカウントリンクの難しさ
Voice User Interface (VUI)ならではのアカウントリンクの難しさは「いかにアカウントリンクをしていないユーザーをアカウントリンクへ導くか」ということです。画面付きのWebサービスであれば、アカウントリンクを訴求したい場合、ある位置に「アカウントリンクはこちら」のように表示することで誘導できますが、VUIの場合は画面がないため導線が複雑になります。
「Yahoo!路線」の場合、アカウントリンクをしていなくても「山手線の運行情報」のように話しかければ、山手線の運行情報を答えます。しかし、より便利に使っていただくためにアカウントリンクを訴求しています。
Yahoo!路線のリリース当初はアカウントリンクをしていない場合、運行情報を答えた後に毎回「アカウントリンクしてYahoo!路線で路線を登録いただくと、路線名を指定しなくてもお答えできるようになります」と訴求していましたが、「毎回言われると鬱陶しい」というご意見をいただき、改善を重ねた結果、現在はアカウントリンクをしていないユーザーがスキルを終了した時に、次のような流れである一定の確率でアカウントリンクを訴求するようにしています。
ユーザー: (ウェイクアップワード)、ヤフー路線で千代田線の運行情報を教えて。
Yahoo!路線: 千代田線は平常通り運行しています。他の路線を調べますか?
ユーザー: いいえ。
Yahoo!路線: ご利用ありがとうございました。また、アカウントリンクしてYahoo!路線で路線を登録いただくと、路線名を指定しなくてもお答えできるようになります。 Alexaアプリにご案内を送りました(破線部はある一定の確率で読まれる)。
このとき、ユーザーはAlexaスキル / Googleアクションともにスマートスピーカーからは音声操作によってアカウントリンクすることはできないため、ユーザーはスマートフォンのアプリに送信されたアカウントリンクカードからアカウントリンクします。このカードの存在をわかりやすくユーザーに伝えることも重要です。
まとめ
今回はAlexaスキル/ Googleアクションを既存のWebサービスと連携させる仕組みであるアカウントリンクについて紹介しました。次回は「Alexaの通知機能」について、その仕組みと実装方法などを説明する予定です。
著者紹介
Yahoo! JAPAN スキルプロジェクトチーム
データ&サイエンスソリューション統括本部のスマートデバイス本部に所属するプロジェクトチーム。スマートデバイス本部は、IoTや今回のテーマである音声アプリケーション開発など、ちょっとだけ未来の技術に挑戦する部署。
今回の執筆者:大島翼(おおしま つばさ)/エンジニア
スキルプロジェクト エンジニア。ヤフーでは、スマートスピーカー向け音声アプリケーションVUI設計、フロントエンド、バックエンド開発等を担当。