音声によるタイマーの権限付与を設定する



音声によるタイマーの権限付与を設定する

音声によるタイマーの権限付与をスキルに設定すると、ユーザーは音声操作を通じてスキルにタイマーの権限を付与できます。ユーザーは「はい」と言うのみで、Alexaアプリを開く必要がなくなり、スキルはユーザーにとってより便利になります。

しくみ

  1. スキルがアクセス権限リクエストを開始します。
  2. Alexaは、特定のタイマーを作成する権限を付与するかどうかをユーザーに尋ねます。
  3. ユーザーが応答します。
    • ユーザーがアクセス権限を付与すると、スキルはタイマーを作成できます。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が制御) クッキングタイムスキルのタイマー作成と編集を許可しますか?

標準のプロンプト

スキルは音声によるタイマー権限付与ワークフローを開始し、ユーザーへの最初のプロンプトを制御します。Alexaは音声による権限付与ワークフローの次のプロンプトを制御します。このプロンプトにより、全スキルで一貫したエクスペリエンスを提供できます。わかりやすいよう、各プロンプトにタグを付けています。スキルは続けてAcceptConsentTimersプロンプトを出し、タイマーの内容、日時、目的を復唱します。応答のこの部分はスキルが制御します。

AskForConsentTimersAlexa(Alexaが制御) クッキングタイムスキルからタイマーを設定することができます。タイマーが時間切れになったら、スキルを再開したいかどうか尋ねる場合があります。スキル内でタイマーを設定できるようにしますか?

AskForConsentRetryTimersAlexa(Alexaが制御) <スキル名>スキルのタイマー作成と編集を許可しますか?

DeclineConsentTimersAlexa(Alexaが制御) わかりました

AcceptConsentTimersAlexa(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構文です。この場合、nameRequestです。

{
  "directives": [
    {
      "type": "Connections.SendRequest",
      "name": "Request",
      "payload": {
        "@type": "RequestSkillPermissionRequest",
        "@version": "1",
        "permissionScope": "alexa::alerts:timers:skill:readwrite"
      },
      "token": "<string>"
    }
  ]
}

タイマーのユーザーエクスペリエンスのベストプラクティス

Alexaタイマーのベストプラクティスを参照してください。