音声によるタイマーの権限付与を設定する
音声によるタイマーの権限付与をスキルに設定すると、ユーザーは音声操作を通じてスキルにタイマーの権限を付与できます。ユーザーは「はい」と言うのみで、Alexaアプリを開く必要がなくなり、スキルはユーザーにとってより便利になります。
しくみ
- スキルがアクセス権限リクエストを開始します。
- Alexaは、特定のタイマーを作成する権限を付与するかどうかをユーザーに尋ねます。
- ユーザーが応答します。
- ユーザーがアクセス権限を付与すると、スキルはタイマーを作成できます。Alexaアプリに権限リクエストのカードを送信する必要はありません。
- ユーザーがアクセス権限を付与しない場合、スキルはタイマーを作成できません。ユーザーがタイマー作成権限を付与しない場合、スキルはフォールバックワークフローを提供する必要があります。
- 音声による権限付与の標準ワークフロー
- 標準のプロンプト
Connections.SendRequest
ディレクティブを送信する- 音声による権限付与リクエストのコードサンプル
- タイマーのユーザーエクスペリエンスのベストプラクティス
音声による権限付与の標準ワークフロー
タイマーをセットするかどうかの最初のプロンプトは、スキルが出します。このタイミングは、スキル側で決めることができます。
ユーザーが音声でタイマーの権限を付与する
この例では、仮想のスキル「クッキングタイム」はサードパーティの料理アプリにリンクされています。スキルが出力する応答の一部はスキル、一部はAlexaによって制御されています。
Alexa (スキルの応答): クッキングタイムへようこそ。料理のお手伝いをするために、このスキルはAlexaのタイマー機能を使用する必要があります。
Alexa(Alexaが制御): クッキングタイムスキルからタイマーを設定することができます。タイマーが時間切れになったら、スキルを再開したいかどうか尋ねる場合があります。スキル内でタイマーを設定できるようにしますか?
ユーザー: はい
Alexa(Alexaが制御): はい、この許可を変更するには、Alexaアプリの「有効なスキル」セクションでクッキングタイムを選択してください。
備考
- (Alexaが制御)となっているリクエストの文言を変更することはできません。
- ユーザーが権限を付与すると、スキルは権限が付与されたことを示すリクエストを受け取り、Alexaがタイマーを設定します。スキルはタイマーがセットされたことをユーザーに知らせ、セッションを継続します。
ユーザーが最初に同意したタイマーの権限付与を拒否する
ユーザーが最初にタイマーの権限付与に同意しても、後で拒否する場合があります。
スキルでは、最初のプロンプトを出す以外、Alexaが出す権限付与に関する対話を制御できません。以下のように、Alexaは拒否された後「わかりました」と簡潔に答え、スキルはそこからセッションを継続しています。
Alexa (スキルの応答): クッキングタイムへようこそ。料理のお手伝いをするために、このスキルはAlexaのタイマー機能を使用する必要があります。
Alexa(Alexaが制御): クッキングタイムスキルからタイマーを設定することができます。タイマーが時間切れになったら、スキルを再開したいかどうか尋ねる場合があります。スキル内でタイマーを設定できるようにしますか?
ユーザー: いいえ
Alexa(Alexaが制御): わかりました
ユーザーの応答が不明瞭
Alexaのタイマー権限付与リクエストに対してユーザーの応答が不明瞭だった場合、Alexaは質問を言い換えて再プロンプトします。再プロンプトの後、ユーザーが権限付与に同意したか拒否したかに応じて、その時点から対応するワークフローを継続します。
Alexa (スキルの応答): クッキングタイムへようこそ。料理のお手伝いをするために、このスキルはAlexaのタイマー機能を使用する必要があります。
Alexa(Alexaが制御): クッキングタイムスキルからタイマーを設定することができます。タイマーが時間切れになったら、スキルを再開したいかどうか尋ねる場合があります。スキル内でタイマーを設定できるようにしますか?
ユーザー:<不明瞭な応答>
Alexa(Alexaが制御): クッキングタイムスキルのタイマー作成と編集を許可しますか?
標準のプロンプト
スキルは音声によるタイマー権限付与ワークフローを開始し、ユーザーへの最初のプロンプトを制御します。Alexaは音声による権限付与ワークフローの次のプロンプトを制御します。このプロンプトにより、全スキルで一貫したエクスペリエンスを提供できます。わかりやすいよう、各プロンプトにタグを付けています。スキルは続けてAcceptConsentTimers
プロンプトを出し、タイマーの内容、日時、目的を復唱します。応答のこの部分はスキルが制御します。
AskForConsentTimers: Alexa(Alexaが制御): クッキングタイムスキルからタイマーを設定することができます。タイマーが時間切れになったら、スキルを再開したいかどうか尋ねる場合があります。スキル内でタイマーを設定できるようにしますか?
AskForConsentRetryTimers: Alexa(Alexaが制御): <スキル名>
スキルのタイマー作成と編集を許可しますか?
DeclineConsentTimers: Alexa(Alexaが制御): わかりました
AcceptConsentTimers: Alexa(Alexaが制御): はい、この許可を変更するには、Alexaアプリの「有効なスキル」セクションで<スキル名>
を選択してください。
Connections.SendRequest
ディレクティブを送信する
スキルからのタイマー設定の要求にユーザーが肯定的に応答すると、次に示すように、スキルコードからConnections.SendRequest
ディレクティブを送信できます。permissionScopeの値は、タイマーのスコープ、alexa::alerts:timers:skill:readwrite
になります。
このディレクティブのtoken
フィールドはAlexaでは使用されませんが、 token
値は処理結果のConnections.Response
リクエストに含まれます。このトークンは、スキルにとって意味のある形式で指定できます。不要な場合は空の文字列を使用できます。
{
"type": "Connections.SendRequest",
"name": "AskFor",
"payload": {
"@type": "AskForPermissionsConsentRequest",
"@version": "1",
"permissionScope": "alexa::alerts:timers:skill:readwrite"
},
"token": ""
}
このディレクティブを受け取ると、Alexaは、タイマーに必要なスコープのアクセス権限を付与するようユーザーに求めます。この処理結果はConnections.Response
リクエストでスキルに送信されます。body.status
の値は次のいずれかになります。
ACCEPTED
– ユーザーが最後または前回のリクエストに応じて権限を付与しました。DENIED
– ユーザーが権限付与を拒否しました。NOT_ANSWERED
– ユーザーが権限付与のリクエストに応答しなかったか、応答が理解されませんでした。この場合、Alexaはユーザーに再プロンプトを出します。
{
"type": "Connections.Response",
"requestId": "string",
"timestamp": "string",
"locale": "string",
"name": "AskFor",
"status": {
"code": "string",
"message": "string"
}
"token": "string"
"payload": {
"permissionScope" : "alexa::alerts:timers:skill:readwrite"
"status" : <permission status enum>
}
}
この例からわかるように、スキル開発時に変更できないAlexaの標準プロンプトが含まれます。これらのプロンプトは音声による権限付与の標準ワークフローに含まれているため、コーディングする必要はありません。
音声による権限付与リクエストのコードサンプル
以下は、AWS Lambda関数にコードを追加して音声による権限付与リクエストのConnections.SendRequest
ディレクティブを送信する方法の例です。token
フィールドを使用して、状態を追跡できます。token
フィールドに指定した値は、Alexaへのユーザーのリクエストに表示されます。たとえば、token
フィールドを使用してuserId
値を格納できます。tokenを空の文字列に設定することもできます。
このサンプルコードはAlexa Skills Kit SDK for Node.js(v2)を使用しています。
return handlerInput.responseBuilder
.addDirective({
type: "Connections.SendRequest",
name: "Request",
payload: {
"@type": "RequestSkillPermissionRequest",
"@version": "1",
"permissionScope": "alexa::alerts:timers:skill:readwrite"
},
token: "<string>"
})
.getResponse();
このサンプルコードはAlexa Skills Kit SDK for Node.js(v1)を使用しています。
this.handler.response = {
'version': '1.0',
'response': {
'directives': [{
'type': 'Connections.SendRequest',
'name': 'Request',
'payload': {
'@type': 'RequestSkillPermissionRequest',
'@version': '1',
'permissionScope': 'alexa::alerts:timers:skill:readwrite'
},
'token': '<string>'
}],
'shouldEndSession': true
}
};
this.emit(':responseReady');
音声による権限付与リクエストのConnections.SendRequest
ディレクティブのJSON構文です。この場合、name
はRequest
です。
{
"directives": [
{
"type": "Connections.SendRequest",
"name": "Request",
"payload": {
"@type": "RequestSkillPermissionRequest",
"@version": "1",
"permissionScope": "alexa::alerts:timers:skill:readwrite"
},
"token": "<string>"
}
]
}
タイマーのユーザーエクスペリエンスのベストプラクティス
Alexaタイマーのベストプラクティスを参照してください。