【新機能】Alexa Skill Kitの「Device Address API」でAmazon Echoの場所を利用する

Alexa Skills Kit

陽春の候, 春のけはいがようやくととのったようですが、お元気でいらっしゃいますか、せーのです。今日は先日アップデートされたAlexa Skill Kitの新しい機能のご紹介です。

場所がわかるととっても便利

今回追加された機能は「Device Address API」と言います。Address、ということは、そう、住所に関する機能のアップデートです。
Alexaデバイスはユーザのアカウントに登録する時に「Device location」という項目に住所を入力することが出来ます。

device_address_api11

これは例えばAlexaに天気を聞いたりする時にデフォルトで地域を指定するために使います。「Alexa, 今日の天気は?」と言うとAlexaはここの住所を元に天気APIに検索をかけるんですね。
今回はこの「Device location」の情報をCustom Skillにも開放しよう、という機能となります。呼びかけている場所がどこからなのかがわかると使えるサービスはうんと幅が広がりそうですね。

仕組み

[Device Address API]には「国とZip Code(郵便番号)を知る」機能と「フルの住所を知る」2つの機能があります。ユーザが呼びかけているざっくりとした場所さえ分かればいいのであれば前者、配達機能等、細かい住所が必要になる場合は後者の機能を使うと良いでしょう。

では実際にこの機能を実装するにはどうしたらいいでしょう。[Device Address API]はその名の通りAPIですので、属性を与えてエンドポイントを叩いてやると結果を返してくれます。ただし扱う情報は個人情報になりますので、事前のユーザによる許可が必要となります。

device_address_api10

Skillを許可する時に下にあるこの「Manage Settings」からユーザは住所情報を使うことをSkillの許可とは別に許可しないとDevice Address APIは使えません。

Device Address APIを使用するフローはこんな感じになります。

device_address_api12

ポイントとしては

  • Device Address APIのエンドポイントを叩くには"consent token"と"device id"が必要
  • ユーザが許可を出すと"consent token"にtokenが入る。許可がなければconsent tokenは空になる
  • Lambda内でconsent tokenの空チェックを行い、空であればAlexaが用意している許可を促すCARD(AskForPermissionsConsentCard、と言う)をユーザに返し、音声でも許可を促す
  • consent tokenにtokenが入っていればAPIを叩いて住所を取り出す

です。

consent token

consent tokenはユーザの住所情報に対する許可をトークンという形で受け渡しするものです。Access Token、とかの仲間です。実際にLambdaに渡るrequestの中ではこのように格納されています。

 {
  "user": {
    "userId": "amzn1.ask.account.<userId_value>",
    "permissions": {
      "consentToken": "Atza|MQEWY...6fnLok"
    }
  },
  "device": {
    "deviceId": <device_id>,
    "supportedInterfaces": {}
  }
}
 

Userごとのパーミッション(規制)、という形になるんですね。意味としては正しい(ユーザーのいる場所、なのだからUserに紐づく)と思います。実際のAlexaの画面ではデバイス毎に異なる住所を打ち込むことが可能なので、この位置にあるのは多少違和感がありますが。
ここにあるのでLambdaの中ではevent.context.System.user.permissions.consentTokenで取ってこれます。前回お知らせした「Device ID」同様、AlexaのdevelopersコンソールのTestから送っても"System"ごとカットされていますのでご注意下さい。

AskForPermissionsConsentCard

AskForPermissionsConsentCardはユーザーが住所の登録をしていない場合に登録を促すメッセージの雛形となります。Lambdaのresponseにこのような形で「card」カテゴリに入れておけばOKです。

 {
  "version": "1.0",
  "response": {
    "card": {
      "type": "AskForPermissionsConsent",
      "permissions": [
        "read::alexa:device:all:address"
      ]
    }
  }
}
 

read::alexa:device:all:addressというのはユーザーに許可させる住所情報の範囲を示します。

プロパティ 範囲
read::alexa:device:all:address 全ての住所情報
read::alexa:device:all:address:c 国とZipCode(郵便番号)

どちらか必要な範囲のpermissionを指定してcardを返します。ちなみにall:addressとall:address:cはAPI上のエンドポイントもpermissionも別のものと捉えられるので、「全ての住所情報」に許可されていたとしても「国とZipCode」を取得するAPIを叩いたら403が返ってきます。「国とZipCode」の情報が使いたい時はその許可が別途必要となります。

このCardはユーザーにはこのように見えます。

address_api20

ユーザはこのCardをクリックすると許可ページに流れる、というわけです。

では、早速組んでみましょう。

やってみた

今回はDevice Address APIのコードサンプルがあるのでそちらを使ってみましょう。まずはAlexaのDeveloperコンソールより新規でCustom Skillを作成します。細かいSkillの作り方はこちらを見て参考になさって下さい。Interaction ModelにはサンプルコードにあるIntent SchemaとSample Utteranceをそれぞれ貼り付けます。

device_address_api3

device_address_api4

[configuration]の設定画面で[permission]よりdevice address APIを使用するチェックを入れます。

deviceaddressapi30

あとは通常にSkillを作っていきます。

次にAWSのマネージメントコンソールより新規にLambdaを開きます。新規FunctionでAlexaのBlueprintを選択します。コードをzipアップロードするので、とりあえずFactSkillを選んでおきます。

device_address_api6

サンプルコードのnodeライブラリをインストールしてzip化します。

cd skill-sample-node-device-address-api
npm install
zip -r packagedSkill.zip *

出来上がった[packagedSkill.zip]をLambdaにアップロードします。これで準備は完了です。
※サンプルにはLambdaのIAM RoleでDynamoDBのFull Acceessが必要、とあるのですが、特に使っているようには見えないのでなくてもいいと思います。

テスト

それではテストしてみましょう。まず住所の許可を出さずにそのまま使ってみます。

Device Address API sample 1 from Tsuyoshi Seino on Vimeo.

せーの - Ask Policeman.
Alexa - Welcome to the Sample Device Address API Skill! What do you want to ask?

せーの - Where do I live?
Alexa - Please enable Location permissions in the Amazon Alexa app.

ということでPermissionが足りない、と言われます。alexaサイトから住所情報の許可をONにします。

device_address_api9

そして、同じやりとりをもう一回してみます。

Device Address API sample 2 from Tsuyoshi Seino on Vimeo.

せーの - Ask Policeman.
Alexa - Welcome to the Sample Device Address API Skill! What do you want to ask?

せーの - Where do I live?
Alexa - Here is your full address: 5541 NE 122nd Ave, Portland, 97230.

住所を読み上げてくれました。成功です(この住所はアメリカにある転送サービスの倉庫の住所です)。

まとめ

いかがでしたでしょうか。住所を使ったスキルもこれで作りやすくなりましたね。同時に開発者的にも自分のサーバで個人情報を管理しなくていいので安心です。是非使ってみて下さい。

参考リンク