kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Voiceflow TIPS #1 Alexaの所在地情報を使う

これから、不定期にはなりますが、VoiceflowのTIPSとか、こういう風にやればこういうことができるよ、というのを紹介していきたいと思います。最初の第1回は、以下のエントリで紹介した、VoiceflowからAlexaの所在地情報の取得の仕方を手順で記載します。

細かい説明は以下をご覧ください。

細かい説明いらないから手順だけ見たい、という人は以下をご覧ください。

手順

1. 変数の準備

以下の変数を用意してください。

f:id:kun432:20190702005719p:plain

それぞれの変数の意味は以下です。住所の各項目については目安にしかならないのでご注意ください。

deviceIdバイスID。デバイスアドレスAPIへアクセスするために必要。デバイスからのリクエストに含まれている。
apiAccessTokenAPIアクセストークン。デバイスアドレスAPIへアクセスするために必要。デバイスからのリクエストに含まれている。
apiEndpointAPIエンドポイント。デバイスアドレスAPIへアクセスするために必要。デバイスからのリクエストに含まれている。
deviceAddressバイスアドレスAPIからのレスポンスを保持する変数
postalCode郵便番号
countryCode国コード
districtOrCounty郡(日本では未使用)
stateOrRegion州 or 都道府県
city
addressLine1住所1
addressLine1住所2
addressLine1住所3

2. ブロックの配置

全体像はこんな感じです。

f:id:kun432:20190702012130p:plain

各ブロックの中の設定は以下となります。

① デバイスからのリクエストに含まれている、デバイスアドレスAPIを利用するために必要な情報の取得

f:id:kun432:20190702012946p:plain

バイスアドレスAPIを実行するために必要な、デバイスID・APIアクセストークン・APIエンドポイントを取得します。Codeブロックに以下を記載します。

deviceId = _system.device.deviceId;
apiAccessToken = _system.apiAccessToken;
apiEndpoint = _system.apiEndpoint;

ポイントは "_system"というビルトイン変数です。これが handlerInput.requestEnvelope.context.System とほぼ同じものになっていますので、ここから上記を取得します。

② デバイスID・APIアクセストークン・APIエンドポイントを使ってデバイスアドレスAPIへアクセス

f:id:kun432:20190702013501p:plain

①で取得した情報を使って、Integrationブロックで、デバイスアドレスAPIへGETリクエストを送信します。

Integrationブロックを置いたら、以下の手順で設定してください。

Integrationの種類は"Custom"を選択

f:id:kun432:20190702013723p:plain

"Make a GET Request"を選択

f:id:kun432:20190702013759p:plain

With SettingsでAPIリクエスト先URLと認証に必要なリクエストヘッダーを設定します。

f:id:kun432:20190702014057p:plain

各パラメータは以下です。なお ”{ 〜 }” の部分はコピペでは動きません。必ず "{" を入力してリストから出てきたものを選択してください。きちんと選択できていれば色が変わっているはずです。

URL{apiEndpoint}/v1/devices/{deviceId}/settings/address

Headersのところは以下。

KeyAuthorization
ValueBearer {apiAccessToken}

そして、Mapping outputで、APIリクエストの結果を変数にどのようにマッピングするかを設定します。

f:id:kun432:20190702021849p:plain

Object pathresponse
VariabledeviceAddress

これでAPIリクエストの結果を以降の処理でdeviceAddress変数にアクセスすることで利用可能となります。ただしそのままでは使えませんので、それについては後述します。

なお、Integrationブロック内の一番下のテストはできないと思ってください。(APIアクセストークンは実機やテストシミュレータの場合にしか飛んでこないので)

③ カードで所在地情報へのアクセス許可を促す

f:id:kun432:20190702015140p:plain

ここで分岐します。②のデバイスアドレスAPIへのアクセスが失敗する=所在地情報へのアクセス許可がされていない、ということになりますので、ユーザに対して許可を求めるカードを表示し、案内を促します。

Permissionブロックを置いて以下の通りに設定して下さい。

Permissionタブが選択されている状態で、一番下のSettingsをクリック

f:id:kun432:20190702015558p:plain

Custom PermissionのトグルをONにする

f:id:kun432:20190702015616p:plain

アクセス許可を求める対象が出てくるので”Address”をON

f:id:kun432:20190702015641p:plain

これでスキル起動時にデバイスの住所へのアクセスが許可されていない場合に以下のカードが表示されるようになります。

f:id:kun432:20190702020815p:plain

④ 所在地情報へのアクセス許可を促すメッセージ

f:id:kun432:20190702021240p:plain

カードを表示すると同時に、SpeakブロックでAlexaにその旨を発話させます。メッセージは適当に入れてもらえればと思います。

⑤ デバイスアドレスAPIの結果を処理

f:id:kun432:20190702021614p:plain

②で実行したデバイスアドレスAPIへのGETの結果がdeviceAddress変数に入っていますが、オブジェクトになっているのでこれをCode Blockで処理して一つづつ変数に取り出していきます。

postalCode = deviceAddress.postalCode;
countryCode = deviceAddress.countryCode;
districtOrCounty = deviceAddress.districtOrCounty;
stateOrRegion = deviceAddress.stateOrRegion;
city = deviceAddress.city;
addressLine1 = deviceAddress.addressLine1;
addressLine2 = deviceAddress.addressLine2;
addressLine3 = deviceAddress.addressLine3;

変数たくさん増えるのでもうちょっとうまい書き方もあると思いますが、今回はわかりやすさ優先で書いてます。

⑥ 取り出した住所情報をカードで表示する

f:id:kun432:20190702022403p:plain

あとは取り出した住所情報をどう使うかだけです。試しにCardブロックを使って表示させてみます。なお、Voiceflowではこういった変数の中身を見たいみたいな場合のデバッグはVoiceflow側のテストツールを使うのですが、今回のように実機でないと動かないような場合もあるので、私の場合、少し面倒ですがCardブロックをデバッグ代わりに使うことが多いです。

Title所在地情報テスト ※何でも良いです
ValuepostalCode: {postalCode}
countryCode: {countryCode}
districtOrCounty: {districtOrCounty}
stateOrRegion: {stateOrRegion}
city: {city}
addressLine1: {addressLine1}
addressLine2: {addressLine2}
addressLine3: {addressLine3}

”{ 〜 }” の部分については上の方で述べたとおりコピペはできませんのでご注意ください。

実際のカードにはこんな感じで表示されます。

f:id:kun432:20190702023455p:plain

これで所在地の住所情報が変数に取れていることがわかりますね。

⑦ 所在地の住所情報をもとに喋らせる

ここは何でも良いので割愛します。取得した住所情報を喋らせるなりなんなりしてください。


こうやって見ると所在地情報取るだけならそんなに難しくないですね。_systemというビルトイン変数がドキュメントのどこにも載ってないのでわかりようがないというのはありますが、わかってしまうといろいろ応用が効くのではないかなと思います。ただ、

のLT資料でも書いてますが、所在地情報自体にちょっと使いにくさがあるので、実際に使う場合には工夫が必要かと思います。資料ご覧いただければと思います。

ぜひご活用ください。