APL Entity Sensing Extension
Entity Sensing機能を備えたデバイスでは、ユーザーの存在を検出できます。APL応答でEntity Sensing extensionを使用すると、検出されたユーザーに関する情報、たとえばデバイスを基準としたユーザーの位置を取得できます。スキルでは変化に対応することもできます。たとえば、エンゲージメントが最も高いユーザーが変化したときに対応できます。
Extensionの概要
サポートされるAPLの最小バージョン | APL 1.4 |
Extension URI | alexaext:entitysensing:10 |
設定 | |
環境プロパティ | |
ライブデータプロパティ | |
コマンド | なし |
イベントハンドラー | |
スキルマニフェストで必要か |
はい。このextensionを使用するには、requestedExtensions に追加します。スキルマニフェストでのEntity-sensing extensionを参照してください。
|
設定は自動的に初期化されるか | いいえ。 |
Entity Sensing extensionについて
Entity Sensing APL extensionは、ユーザーの存在を検出できるデバイスで動作します。次のことを行うことができます。
- デバイスがユーザーを検出したかどうかを判断するためのプロパティを取得し、デバイスを基準としたユーザーの位置を把握します。
- イベントハンドラーを使用して、デバイス状態が変化したときやユーザーが検出されたときに対応します。たとえば、エンゲージメントが最も高いユーザーが変化したとデバイスが判断したときに対応できます。
Entity Sensing extensionでは、プライマリユーザーに関する情報を得ることができます。プライマリユーザーとは、デバイスを使用する可能性が最も高いユーザーのことです。プライマリユーザーを確認するアルゴリズムはデバイスごとに異なり、さまざまな要因によって変化します。
プライマリユーザーに関する情報を取得するには、ライブデータプロパティを使用します。
Entity Sensing extensionを有効にする
Entity Sensing extensionのプロパティとイベントハンドラーを使用するには、以下を実行する必要があります。
- extensionをスキルマニフェストの
requestedExtensions
プロパティに追加します。 - extensionをAPLドキュメントの
extensions
プロパティに追加して、ドキュメントで明示的にリクエストします。 - ドキュメントの
settings
プロパティで、extension設定のドキュメントレベルのコンフィギュレーションを行います。
スキルマニフェストでのEntity Sensing extension
ALEXA_EXTENSION
インターフェースには、autoInitializedExtensions
とrequestedExtensions
という2つのプロパティがあります。Entity Sensing extensionをrequestedExtensions
プロパティに追加します。このextensionには、autoInitializedExtensions
でコンフィギュレーションを行う必要がある設定値はありません。
Entity Sensing extensionのURIは "alexaext:entitysensing:10"
です。
次の例は、Entity Sensing extensionのコンフィギュレーションが行われたスキルマニフェストを示しています。
{
"apis": {
"custom": {
"interfaces": [
{
"type": "ALEXA_EXTENSION",
"requestedExtensions": [
{
"uri": "alexaext:entitysensing:10"
}
]
}
]
}
}
}
スキルマニフェストのAPL extension設定の詳細については、スキルマニフェストでextensionをリクエストするを参照してください。
開発者コンソールでスキルマニフェストのコンフィギュレーションを行うこともできます。
Entity Sensing extensionのスキルのコンフィギュレーションを行うには
- 開発者コンソールを開き、設定するスキルの編集をクリックします。
- ビルド>インターフェースページに移動します。
- Alexa Presentation Languageインターフェースを有効にします。
-
ExtensionsリストからEntity Sensing v.10を選択します。
このオプションを選択すると、スキルマニフェストの
requestedExtensions
プロパティが更新されます。 - インターフェースを保存、モデルをビルドの順にクリックして、対話モデルを再ビルドします。
APLドキュメントのEntity Sensing extension
APLドキュメントでEntity Sensingイベントハンドラーおよびプロパティを使用するには、ドキュメントのextensions
プロパティでextensionをリクエストする必要があります。スキルマニフェストでrequestedExtensions
にextensionを追加した場合も、このリクエストが必要です。
Entity Sensing extensionのURIは "alexaext:entitysensing:10"
です。
次の例では、Entity Sensing extensionをリクエストし、その名前をEntitySensing
に設定します。次に、ドキュメントで"EntitySensing
"の名前を使用して、設定、プロパティ、イベントハンドラーを参照します。
{
"type": "APL",
"version": "1.4",
"extensions": [
{
"name": "EntitySensing",
"uri": "alexaext:entitysensing:10"
}
]
}
APLドキュメントでAPL extensionをリクエストする方法の詳細については、APLドキュメントでextensionをリクエストするを参照してください。
Entity Sensing extensionがデバイスでサポートされるかを確認する
Entity Sensing extensionは、すべてのデバイスでサポートされるわけではありません。ユーザーのデバイスでextensionがサポートされるかどうかは、ドキュメントおよびコードで確認します。
デバイスでEntity Sensing extensionがサポートされるかどうかを確認するには、ドキュメントでenvironment.extension
変数を使用します。たとえば、extensions
プロパティでname
にEntitySensing
を使用したとします。この場合、デバイスでEntity Sensingがサポートされていれば、次のデータバインディング式でtrue
が返されます。
${environment.extension.EntitySensing}
データバインディング式は、条件ステートメントとwhen
プロパティで使用できます。
コードでは、スキルに送信されるリクエストのcontext.Extensions.available
プロパティに、サポートされるextensionsが指定されています。このプロパティには、使用可能なextensionのURIが各項目のキーに指定されたマップが含まれます。
次の例は、Entity Sensing extensionをサポートするデバイスからのリクエストを示しています。
{
"version": "1.0",
"session": {},
"context": {
"Viewports": [],
"Viewport": {},
"Extensions": {
"available": {
"alexaext:entitysensing:10": {}
}
},
"System": {}
},
"request": {}
}
context.Extensions
プロパティには、次の条件の両方を満たすextensionsが含まれます。
- スキルマニフェストの
requestedExtensions
プロパティでリクエストされていること。 - デバイスでサポートされていること。
extensionの設定
Entity Sensing extensionには、次の設定があります。
名前 | 型 | デフォルト | 説明 |
---|---|---|---|
entitySensingStateName |
文字列 | "" | EntitySensingState データバインディングに使用する名前。 |
primaryUserName |
文字列 | "" | PrimaryUser データバインディングに使用する名前。 |
APLドキュメントでこれらのコンフィギュレーションを行うには、settings.AssignedName
を使用します。AssignedName
は、extensions
プロパティでEntity Sensing extensionに割り当てた名前です。設定はすべて必須です。
次の例では、extensionにEntitySensing
という名前を割り当てた後、settings.EntitySensing
でプロパティentitySensingStateName
およびprimaryUserName
を設定しています。
{
"type": "APL",
"version": "1.4",
"extensions": [
{
"name": "EntitySensing",
"uri": "alexaext:entitySensing:10"
}
],
"settings": {
"EntitySensing": {
"entitySensingStateName": "EntitySensingState",
"primaryUserName": "User"
}
},
"mainTemplate": {}
}
entitySensingStateName
entitySensingStateName
プロパティを、グローバルのデータバインディングコンテキストでEntitySensingState
にアクセスするために使用する名前に設定します。entitySensingStateName
がない場合、または空の文字列に設定されている場合は、EntitySensingState
プロパティにアクセスできません。
たとえば、次の例は、entitySensingStateName
をMyEntitySensingState
に設定してから、EntitySensingState
プロパティにアクセスする方法を示しています。
{
"type": "APL",
"version": "1.4",
"extensions": [
{
"name": "EntitySensing",
"uri": "alexaext:entitysensing:10"
}
],
"settings": {
"EntitySensing": {
"entitySensingStateName": "MyEntitySensingState",
"primaryUserName": "MyPrimaryUser"
}
},
"mainTemplate": {
"parameters": [
"payload"
],
"items": [
{
"type": "Container",
"items": [
{
"type": "Text",
"id": "MyTextBox",
"text": "Entity sensing is ${EntitySensingState.errorCode == 0 ? 'Active' : 'Faulted'}"
},
{
"type": "Text",
"id": "MyTextBox",
"text": "Error code: ${MyEntitySensingState.errorCode}"
},
{
"type": "Text",
"text": "Error: ${MyEntitySensingState.error}"
}
]
}
]
}
}
primaryUserName
primaryUserName
プロパティを、グローバルのデータバインディングコンテキストでPrimaryUser
プロパティにアクセスするために使用する名前に設定します。primaryUserName
がない場合、または空の文字列に設定されている場合は、PrimaryUser
プロパティにアクセスできません。
たとえば、次の例は、primaryUserName
をMyPrimaryUser
に設定してから、PrimaryUser
プロパティにアクセスする方法を示しています。
{
"type": "APL",
"version": "1.4",
"extensions": [
{
"name": "EntitySensing",
"uri": "alexaext:entitysensing:10"
}
],
"settings": {
"EntitySensing": {
"primaryUserName": "MyPrimaryUser",
"entitySensingStateName": "MyEntitySensingState"
}
},
"mainTemplate": {
"item": {
"type": "Container",
"items": [
{
"type": "Text",
"id": "MyTextBox",
"text": "${MyPrimaryUser.isSeen ? 'User located at ${MyPrimaryUser.poise.absoluteAngle} degrees.' : 'Nobody here'}"
},
{
"type": "Text",
"id": "textUserId",
"text": "id: ${MyPrimaryUser.id}"
},
{
"type": "Text",
"id": "textUserActive",
"text": "isActive: ${MyPrimaryUser.isActive}"
},
{
"type": "Text",
"id": "textUserSeen",
"text": "isSeen: ${MyPrimaryUser.isSeen}"
}
]
}
}
}
環境プロパティ(静的)
Entity Sensing extensionでは、次の静的環境プロパティが追加されます。
名前 | 型 | 説明 |
---|---|---|
horizontalFOV |
絶対数(度) | デバイスの水平方向の視界の範囲。 |
version |
文字列 | Entity Sensingサービスのバージョン。 |
verticalFOV |
絶対数(度) | デバイスの垂直方向の視界の範囲。 |
Entity Sensing環境オブジェクトの構造の例を次に示します。
{
"version": "1.0",
"horizontalFOV": 60,
"verticalFOV": 34
}
horizontalFOV
horizontalFOV
では、Entity Sensingの水平方向の視界の範囲を定義します。このプロパティは、デバイスごとに異なります。
version
version
環境プロパティは、Entity Sensingサービスのバージョンを表します。version
は、インストール済みのextensionのビルドとリリースの詳細を報告する場合に便利です。
verticalFOV
verticalFOV
は、Entity Sensingの垂直方向の視界の範囲を定義します。このプロパティは、デバイスごとに異なります。
ライブデータプロパティ
Entity Sensing extensionにより、データバインディングコンテキストにライブデータプロパティが追加されます。ライブデータプロパティは、APLドキュメントのライフサイクル中に変更できるデータオブジェクトです。
Entity Sensing extensionにより、データバインディングコンテキストに次のライブデータオブジェクトが追加されます。
名前 | 型 | 説明 |
EntitySensingState |
オブジェクト | デバイスの現在のEntity Sensing機能を表します。 |
PrimaryUser |
オブジェクト | 検出されたユーザーのうち、デバイスとのエンゲージメントが最も高いユーザーについて報告します。 |
ライブデータの詳細については、Extensionのライブデータを参照してください。
EntitySensingState
EntitySensingState
ライブデータオブジェクトは、デバイスの現在のEntity Sensingの機能を表します。
EntitySensingState
にアクセスするには、extension settingsでentitySensingStateName
プロパティを設定する必要があります。entitySensingStateName
がない場合、または空の文字列が含まれている場合、EntitySensingState
は使用できません。
EntitySensingState
には、次のプロパティがあります。
名前 | 型 | 説明 |
---|---|---|
error | 文字列 | 読み取り可能なエラーメッセージ。エラーがない場合は""。 |
errorCode | 数値 | エラーコード。エラーがない場合は0。 |
完全なEntitySensingState
データバインディングコンテキストの構造の例を次に示します。
{
"error": "",
"errorCode": 0
}
error、errorCode
EntitySensingState.error
プロパティとEntitySensingState.errorCodeプロパティは、Entity Sensingのデバイスエラーに関する情報を提供します。
エラーが発生すると、errorCode
は0以外のコード、error
はエラーに関する説明を報告します。デバイスの動作中にエラーが発生していない場合、errorCode
は0を返し、error
は空の文字列を返します。error
の説明は、デバイスごとに異なります。
エラーが発生するのは、さまざまな条件のためにデバイスが検出を行えない場合や、デバイスで機械的な障害が発生した場合です。エラーの一般的な原因は次のとおりです。
- 物理的な障害物がある
- 光が少ない
- デバイスが「おやすみモード」になっている
- ユーザーがデバイスのカメラのシャッターを閉じた
errorCode
が0でない場合は、デバイスの機能が制限されます。エラーを検出すると、デバイスは、errorCode
条件がクリアされたかどうかを定期的に確認します。errorCode
条件がクリアされると、Entity Sensingの通常の動作が再開されます。
errorCode
の値が変化すると、OnEntitySensingStateChangedイベントがトリガーされます。
Alexaデバイスでは、次のerrorCode
とそれに対応するerror
プロパティを使用できます。error
の説明とerrorCode
の値は、デバイスごとに異なります。このため、デバイスによっては、別の値が示される場合があります。
errorCode | 説明 | エラーテキストの例 |
---|---|---|
0 | カメラは正常に動作しています。 | - |
1 | カメラに問題があるため、デバイスがユーザーを見つけることができません。 | Camera is disabled Camera shutter is closed |
これらのエラー値は、デバッグ目的で使用してください。error
の文字列は、ローカライズされません。このため、error
やerrorCode
の値は、ユーザーに表示しないでください。
PrimaryUser
PrimaryUser
ライブデータオブジェクトは、デバイスとのエンゲージメントが最も高いユーザーを表します。エンゲージメントアルゴリズムは、デバイスごとに異なります。
PrimaryUser
にアクセスするには、extension settingsでprimaryUserName
プロパティを設定する必要があります。primaryUserName
がない、または空の文字列が含まれている場合は、PrimaryUser
オブジェクトを使用できません。
PrimaryUser
には、次のプロパティがあります。
名前 | 型 | 説明 |
---|---|---|
id |
文字列 | デバイス割り当てのエンティティID。ユーザーが検出されない場合、文字列は空です。 |
isActive |
ブール値 | ユーザーがウェイクワードを発話したことを示します。 |
isSeen |
ブール値 | デバイスがユーザーを検出したことを示します。 |
poise |
オブジェクト | ユーザーの位置。 |
active
ユーザーを表すPrimaryUser
データバインディングコンテキストの構造の例を次に示します。
{
"id": "Entity1",
"isActive": true,
"isSeen": true,
"poise": {
"absoluteAngle": 30,
"relativeAngle": 20
}
}
デバイスがユーザーを検出しなかった場合のPrimaryUser
データバインディングコンテキストの例を次に示します。
{
"id": "",
"isActive": false,
"isSeen": false,
"poise": {
"absoluteAngle": 0,
"relativeAngle": 0
}
}
id
PrimaryUser.id
プロパティは、デバイスにより割り当てられた、最後にウェイクワードを発話したユーザーのIDを返します。デバイスがユーザーを検出できない場合、プロパティは空の文字列を返します。
割り当てられたid
は、デバイスがユーザーを認識できなくなってから一定期間持続します。この期間は、デバイスによって異なります。ユーザーが視界から消えてから再度視界に入ると、デバイスはそのエンティティを既知のエンティティとして認識することを試み、同じid
値を割り当てます。デバイスがそのユーザーを認識できない場合は、新しいエンティティIDが割り当てられます。
isActive
ユーザーがウェイクワードを発話した場合はtrue
、それ以外の場合はfalse
を返します。
デバイスで検出されたユーザーがウェイクワードを発話しなかった場合、そのユーザーは、アクティブではなく、エンゲージされていると見なされます。
isSeen
デバイスがユーザーを検出し、そのユーザーがデバイスの観測可能範囲内にいる場合は、true
を返します。エンティティが検出されなくなった場合、またはエンティティid
が割り当てられていない場合は、false
を返します。
また、EntitySensingState.errorCode
が0でない場合、PrimaryUser.isSeen
プロパティはfalse
を返します。
ユーザーのisSeen
値が変化すると、onPrimaryUserChanged
イベントがトリガーされます。
poise
ユーザーの位置が記述されたオブジェクトを返します。poise
オブジェクトには、次のプロパティがあります。
名前 | 型 | 説明 |
---|---|---|
absoluteAngle |
数値(度) | 中心位置からの角度位置。 |
relativeAngle |
数値(度/秒) | 表示位置からの角度位置。 |
poise.absoluteAngle
は、デバイスの中心位置を基準にしたエンティティの角度位置を表します。poise.relativeAngle
は、画面を基準にした角度位置を表します。デバイスの画面が回転しない場合は、同じ角度と相対位置が返されます。
デバイスがユーザーを感知できない場合、isSeen
値はfalse
を返し、poise.absoluteAngle
値とpoise.relativeAngle
値は、最後に認識されたユーザーの位置を表します。エンティティが割り当てられていない場合、これらの値は未定義です。
PrimaryUser.poise
値が変更されると、onPrimaryUserChanged
イベントがトリガーされます。
コマンド
Entity Sensing extensionでは、新しいextensionコマンドは追加されません。
イベントハンドラー
Entity Sensing extensionでは、新しいextensionイベントハンドラーが追加されます。Entity Sensing extensionで生成されるイベントに対応するには、APLドキュメントの最上位のプロパティにハンドラーを追加します。ハンドラー名には、AssignedName:EventHandlerName
を使用します。AssignedName
は、extensions
プロパティでEntity Sensing extensionに割り当てた名前、EventHandlerName
はハンドラーの名前です。
たとえば、extensionの名前をEntitySensing
にした場合、OnEntitySensingStateChanged
ハンドラーからイベントに対応するには、EntitySensing:OnEntitySensingStateChanged
を使用します。
OnEntitySensingStateChanged
EntitySensingState
のプロパティが変更されたときに呼び出されます。EntitySensingState
プロパティが変更されると、OnEntitySensingStateChanged
イベントがトリガーされます。
OnEntitySensingStateChanged
ハンドラーでは、イベントコンテキストに次の2つのプロパティが追加されます。
名前 | 型 | 説明 |
---|---|---|
changed |
オブジェクト | 変更されたEntitySensingState プロパティのサブセット。 |
current |
オブジェクト | EntitySensingState プロパティの完全なコレクション。プロパティ値は、イベント時のEntity Sensingの状態を表します。これには、イベントの影響を受ける値も含まれます。 |
EntitySensingState
プロパティのリストについては、EntitySensingState
を参照してください。
生成されるイベントの形式は次のようになります。
{
"event": {
"changed": {
//変更されたすべての状態プロパティ
},
"current": {
//現在のすべての状態プロパティ
},
"source": {
"type": "Document",
"handler": "OnEntitySensingStateChanged",
"id": null,
"uid": null,
"value": null
}
}
}
このイベントハンドラーのコマンドは、常に高速モードで実行されます。
OnPrimaryUserChanged
次のようなPrimaryUser
の変更が発生すると、呼び出されます。
Poise
を除くすべてのPrimaryUser
プロパティが変更されたとき。- デバイスが新しい
PrimaryUser
を検出し割り当てたとき。 - デバイスが既存の
PrimaryUser
を検出しなくなったとき。
OnPrimaryUserChanged
ハンドラーでは、イベントコンテキストに次の2つのプロパティが追加されます。
名前 | 型 | 説明 |
---|---|---|
changed |
オブジェクト | 変更されたPrimaryUser プロパティのサブセット。 |
current |
オブジェクト | PrimaryUser プロパティの完全なコレクション。このプロパティ値は、イベント時のプライマリユーザーを表します。これには、イベントの影響を受ける値も含まれます。 |
OnPrimaryUserChanged
ハンドラーでは、イベントコンテキストに次の2つのプロパティが追加されます。
生成されるイベントの形式は次のようになります。
{
"event": {
"changed": {
//変更されたプロパティのみ
},
"current": {
//現在のすべてのプロパティ
},
"source": {
"type": "Document",
"handler": "OnPrimaryUserChanged",
"id": null,
"uid": null,
"value": null
}
}
}
関連トピック
最終更新日: 2020 年 10 月 26 日