視覚応答とオーディオ応答を統合する
Alexa Presentation Language(APL)では、画面付きデバイス向けの視覚応答を作成できます。APL for Audioでは、サウンドエフェクトなどのオーディオと音声を組み合わせて、リッチなオーディオ応答を作成できます。これらの視覚応答とオーディオ応答を統合すると、魅力的なユーザーエクスペリエンスを提供することができます。
視覚応答とオーディオ応答の統合の概要
視覚応答とオーディオ応答は、次の2つの方法で統合できます。
- 同じ応答で2つの
RenderDocument
ディレクティブを返す - スキルの同じ応答で、次の2つの異なるディレクティブを返します。Alexa.Presentation.APL.RenderDocument
(視覚応答用のAPLドキュメントを含む)Alexa.Presentation.APLA.RenderDocument
(オーディオ応答用のAPL for Audioドキュメントを含む)
- 視覚応答にオーディオを埋め込む - 視覚応答用のAPLドキュメントとオーディオ応答用のAPL for Audioドキュメントの両方を含む、単一の
Alexa.Presentation.APL.RenderDocument
をスキルから返します。その後、APLコマンドを使用して手動でオーディオを呼び出します。
詳細については、以下のセクションを参照してください。
同じ応答で2つのRenderDocumentディレクティブを返す
1つの応答で視覚応答用とオーディオ応答用の両方のRenderDocument
ディレクティブを指定すると、Alexaは画面にコンテンツを表示し、指定された出力音声を読み上げてから、APL for Audio応答を再生します。通常の音声出力とオーディオ応答が重なることはありません。
オーディオ応答と視覚応答の両方を含むRenderDocumentディレクティブを返すには
- 視覚応答用のAPLドキュメントと、オーディオ応答用のAPL for Audioドキュメントを作成します。
-
スキルコードで、
Alexa.Presentation.APL.RenderDocument
とAlexa.Presentation.APLA.RenderDocument
の両方をdirectives
配列に追加します。directives
配列内でのディレクティブの順序は問いません。
たとえば、以下のAPLドキュメントとデータソースでは、「ハローワールド」のようこそメッセージが設定されたAlexaHeadline
テンプレートが表示されます。
このコンテンツを表示し、同時に音声とバックグラウンドサウンドエフェクトを組み合わせたオーディオを再生するとします。以下のAPL for Audioドキュメントとデータソースでは、このオーディオが生成されます。
この両方のサンプルを同時に送信するには、APLインターフェースとAPLAインターフェースの2つのRenderDocument
をスキルの応答に含めます。
以下は、2つのRenderDocument
ディレクティブをdirectives
配列に追加する応答の例です。この応答では、outputSpeech
プロパティも設定されます。Alexaは画面にコンテンツを表示し、outputSpeech
を読み上げてから、APL for Audio応答を再生します。
helloWorldRenderExample
、APL for AudioドキュメントはhelloWorldRenderExampleAudio
という名前でそれぞれ保存されています。APLドキュメントへのリンクの詳細については、オーサリングツールに保存されたAPLドキュメントへのリンクを参照してください。APLAドキュメントへのリンクの詳細については、オーサリングツールに保存されたAPLAドキュメントへのリンクを参照してください。
視覚応答にオーディオを埋め込む
視覚応答用のAPLドキュメントにオーディオ応答を埋め込むことができます。スキルから単一のAlexa.Presentation.APL.RenderDocument
ディレクティブを返し、APLのSpeakItem
コマンドまたはSpeakList
コマンド使用して、手動でオーディオを呼び出します。
このオプションを使用すると、オーディオと視覚コンテンツをより正確に同期させることができます。たとえば、Alexaでリスト内の項目ごとにオーディオを再生し、リストを自動的にスクロールしてそれぞれの項目をハイライト表示することができます。また、このオーディオを埋め込む方法は、ユーザーが画面上のボタンをタップしたときなど、ユーザーイベントへの応答としてオーディオを再生する場合にも便利です。
オーディオはコマンドに応答して再生されるため、Alexaが通常の出力音声の読み上げを終える前にオーディオの再生が開始される可能性があります。これを回避するために、さまざまなアプローチを使用できます。たとえば、応答に関連するすべての音声をAPL for Audioドキュメントに含めて、outputSpeech
プロパティを含めないようにすることができます。
オーディオを埋め込むには、複数の手順が必要となります。まず、aplAudioToSpeech
トランスフォーマーを使用して、APL for Audioドキュメントをオーディオファイルに変換します。その後、そのオーディオファイルへの参照をAPLドキュメントのコンポーネントにバインドします。
視覚応答にオーディオを埋め込んでドキュメントから呼び出すには
- 視覚応答用のAPLドキュメントと、オーディオ応答用のAPL for Audioドキュメントを作成します。
-
APLドキュメントのデータソースで、
aplAudioToSpeech
トランスフォーマーを設定します。トランスフォーマーは、APL for Audioドキュメントをオーディオファイルに変換します。このオーディオファイルは、APLコマンドで呼び出すことができます。詳細については、aplAudioToSpeechトランスフォーマーを設定するを参照してください。
- トランスフォーマーの出力をAPLドキュメント内のコンポーネントの
speech
プロパティにバインドします。詳細については、トランスフォーマーの出力をコンポーネントにバインドするを参照してください。 -
SpeakItem
またはSpeakList
のいずれかのAPLコマンドを実行し、speech
プロパティが設定されたコンポーネントをターゲットにします。これらのコマンドは、ユーザーが画面をタップしたときや、ドキュメントが最初に表示されたときなど、さまざまな方法で開始できます。詳細についてはSpeakItemコマンドまたはSpeakListコマンドを実行してオーディオを呼び出すを参照してください。
-
スキルコードで
Alexa.Presentation.APL.RenderDocument
を返します。sources
プロパティで、同じディレクティブにAPL for Audioドキュメントを含めます。詳細については、RenderDocumentディレクティブの一部としてオーディオ応答を含めるを参照してください。
以降のセクションでは、これらの各手順について詳しく説明します。
APLドキュメントとAPL for Audioドキュメントを作成する
APLドキュメントとAPL for Audioドキュメントを作成します。オーサリングツールでドキュメントを保存して、RenderDocument
ディレクティブを送信する際にコードからそのドキュメントにリンクすることができます。または、スキルコードに各ドキュメントの完全なJSONを含めることもできます。
aplAudioToSpeechトランスフォーマーを設定する
aplAudioToSpeech
トランスフォーマーは、APL for Audioドキュメントをオーディオファイルに変換します。このオーディオファイルはAPLドキュメント内で参照できます。トランスフォーマーは、APLドキュメントのデータソースのtransformers
配列に含めます。
トランスフォーマーでは、データソースで指定されたデータを変換してから、同じデータソースのプロパティに出力を書き込みます。
aplAudioToSpeech
トランスフォーマーには、以下を指定します。
template
- 変換するAPL for Audioドキュメントの名前です。outputName
- 変換されたオーディオファイルのURLが格納されるプロパティの名前です。inputPath
-(オプション)APL for Audioドキュメントで使用するデータを含むデータソースのプロパティです。このプロパティは、配列内の各項目のオーディオを作成する場合に使用します。例については、リスト内の項目ごとにオーディオを再生するを参照してください。
{
"transformers": [
{
"template": "helloWorldEmbedAPLAudioExampleAudio",
"transformer": "aplAudioToSpeech",
"outputName": "welcomeSpeech"
}
]
}
トランスフォーマーを使用するには、type
プロパティをobject
に設定して、データソースをオブジェクトデータソースとして定義する必要があります。トランスフォーマーを使用して変換するプロパティは、properties
オブジェクト内で定義します。
以下は、前述の「ハローワールド」ドキュメントで使用できる有効なデータソースの例です。aplAudioToSpeech
トランスフォーマーは、helloWorldEmbedAPLAudioExampleAudio
というAPL for Audioドキュメントをオーディオファイルに変換し、このオーディオファイルのURLをhelloWorldData.properties.welcomeSpeech.url
プロパティに保存します。
{
"helloWorldData": {
"type": "object",
"objectId": "helloWorldSample",
"properties": {
"headerTitle": "サンプル: 視覚応答からオーディオ応答を呼び出す",
"primaryText": {
"type": "PlainText",
"text": "APLとオーディオ応答のサンプルです"
},
"secondaryText": {
"type": "PlainText",
"text": "このサンプルでは、APLドキュメントにAPL for Audio応答を埋め込みます。"
},
"welcomeText": {
"contentType": "SSML",
"textToSpeak": "<speak><amazon:emotion name='excited' intensity='medium'>APLへようこそ。</amazon:emotion>このサンプルでは、APL for Audio応答をAPLドキュメントに統合します。これには、まずAPLオーディオを音声に変換するトランスフォーマーを使用して、オーディオクリップを作成します。次に、トランスフォーマーの出力をAPLドキュメント内のコンポーネントのspeechプロパティにバインドします。最後に、SpeakItemコマンドを使用してオーディオを呼び出します。このサンプルでは、onMountハンドラーからコマンドを実行するため、ドキュメントが表示されたときにコマンドが実行されます。</speak>"
}
},
"transformers": [
{
"template": "helloWorldEmbedAPLAudioExampleAudio",
"transformer": "aplAudioToSpeech",
"outputName": "welcomeSpeech"
}
]
}
}
以下は、aplAudioToSpeech
トランスフォーマーが実行された後のデータソースの例です。properties
オブジェクトに、結果が格納されたwelcomeSpeech
プロパティが追加されています。
トランスフォーマーの出力をコンポーネントにバインドする
APLドキュメントでトランスフォーマーの出力を使用するには、APLのデータバインディング式を使用して、出力をコンポーネントのspeech
プロパティにバインドします。バインド先となるプロパティは、outputName.url
です。
{
"type": "AlexaHeadline",
"id": "helloWorldHeadline",
"headerTitle": "${payload.helloWorldData.properties.headerTitle}",
"primaryText": "${payload.helloWorldData.properties.primaryText.text}",
"secondaryText": "${payload.helloWorldData.properties.secondaryText.text}",
"speech": "${payload.helloWorldData.properties.welcomeSpeech.url}"
}
SpeakItemコマンドまたはSpeakListコマンドを実行してオーディオを呼び出す
オーディオを再生するには、SpeakItem
またはSpeakList
のいずれかのコマンドを実行し、speech
プロパティが設定されたコンポーネントをターゲットにします。
オーディオ再生のタイミング | 実行内容 |
---|---|
ドキュメントが表示されたとき |
ドキュメントまたはコンポーネントの このシナリオでは、Alexaが応答の |
ユーザーが画面上のコンポーネントを選択したとき |
ユーザーがタップできるコンポーネントのハンドラーから、
例については、ユーザーの操作への応答としてオーディオを再生するを参照してください。 ユーザーに優れたエクスペリエンスを提供するには、ユーザーがボタンなどのタッチ可能な項目を音声で選択できるようにする必要があります。 |
ユーザーが音声でリクエストを行ったとき |
対話モデルのインテントを作成してリクエストをキャプチャします。このインテントのハンドラーで、 詳細については、ユーザーの操作への応答としてオーディオを再生するを参照してください。 |
以下の例では、ドキュメントが表示されたときに、helloWorldHeadline
というIDを持つコンポーネントのspeech
プロパティにバインドされた音声が再生されます。
{
"onMount": [
{
"type": "SpeakItem",
"componentId": "helloWorldHeadline"
}
]
}
RenderDocumentディレクティブの一部としてオーディオ応答を含める
埋め込みのオーディオを使用するには、APLドキュメントとAPL for Audioドキュメントの両方を含むAlexa.Presentation.APL.RenderDocument
ディレクティブを、次のように返します。
document
プロパティにAPLドキュメントを設定します。document
には、オーサリングツールで保存されたドキュメントへのリンクか、ドキュメントの完全なJSONのいずれかを設定できます。sources
プロパティに文字列とオブジェクトのマップを設定します。このマップ内で、文字列にはAPL for Audioドキュメントの名前、オブジェクトにはドキュメントを設定します。- 名前は、
aplAudioToSpeech
トランスフォーマーのtemplate
プロパティに使用した文字列と一致している必要があります。 -
ドキュメントは、オーサリングツールで保存されたドキュメントへのリンクか、ドキュメントの完全なJSONのいずれかとして指定できます。
以下は、
helloWorldEmbedAPLAudioExampleAudio
という1つのソースを持つsources
のマップの例です。この例では、APL for Audioドキュメントはオーサリングツールで「helloWorldEmbedAPLAudioExampleAudio」という名前で保存されているものとします。{ "sources": { "helloWorldEmbedAPLAudioExampleAudio": { "src": "doc://alexa/apla/documents/helloWorldEmbedAPLAudioExampleAudio", "type": "Link" } } }
- 名前は、
datasources
プロパティに、APLドキュメントとAPL for Audioドキュメントの両方で使用するデータソースを含む、文字列とオブジェクトのマップを設定します。
以下は、APLドキュメントとAPL for Audioドキュメントの両方を含む単一のRenderDocument
ディレクティブを送信する応答の例です。APLドキュメントではonMount
ハンドラーを使用してオーディオの再生を開始するため、応答にoutputSpeech
は含まれていません。outputSpeech
を含めると、音声とオーディオが重なって再生されます。
リスト内の項目ごとにオーディオを再生する
APLのSpeakList
コマンドは、リスト内の各項目(Sequence
など)に関連付けられた音声を再生します。リストでは、自動的にスクロールして各項目を表示し、それぞれの項目の外観を変更してハイライト表示するカラオケ効果を利用できます。APL for AudioでSpeakList
を使用すると、リスト内の項目ごとにオーディオクリップを再生できます。
全体的な手順は、視覚応答にオーディオを埋め込むで説明した手順と同じです。aplAudioToSpeech
トランスフォーマーを設定し、トランスフォーマーの出力をリスト項目にバインドしてから、SpeakList
コマンドを呼び出します。トランスフォーマーを設定する際は、単一のクリップを生成するのではなく、項目の配列を処理し、項目ごとにクリップを作成するように設定します。
リスト内の項目ごとにオーディオを再生するには
Sequence
やGridSequence
などの複数子コンポーネントを使用してリストを表示するAPLドキュメントを作成します。コンポーネントにはid
プロパティを含めます。例については、リストを表示するAPLドキュメントとデータソースを作成するを参照してください。- 表示するリスト項目の配列を含むデータソースを作成します。
- オブジェクトデータソースを使用して、
properties
オブジェクト内にデータ配列を配置します。 - ドキュメントで、データ配列を
Sequence
またはGridSequence
のdata
プロパティにバインドします。
例については、リストを表示するAPLドキュメントとデータソースを作成するを参照してください。
- オブジェクトデータソースを使用して、
aplAudioToSpeech
トランスフォーマーのinputPath
プロパティを設定して、リスト項目を含むデータ配列へのパスを指定します。詳細については、aplAudioToSpeechトランスフォーマーを設定して項目の配列を処理するを参照してください。- 1つのリスト項目に対して任意のオーディオを再生するAPL for Audioドキュメントを作成します。データバインディングを使用して、リスト項目の配列のデータにアクセスします。詳細については、APL for Audioドキュメントを作成するを参照してください。
- トランスフォーマーの出力を
Sequence
またはGridSequence
の子コンポーネントにバインドします。詳細については、トランスフォーマーの出力をSequenceの子コンポーネントにバインドするを参照してください。 SpeakList
コマンドを実行し、Sequence
またはGridSequence
をターゲットにします。詳細については、SpeakListコマンドを実行してkaraokeスタイルを設定するを参照してください。- スキルコードで
Alexa.Presentation.APL.RenderDocument
を返します。sources
プロパティで、同じディレクティブにAPL for Audioドキュメントを含めます。
リストを表示するAPLドキュメントとデータソースを作成する
以下は、サウンド名のリストを表示するSequence
の例です。リストに表示するデータは、listOfSoundsData
データソースのlistOfSounds
配列から取得されます。このドキュメントが表示されると、Sequence
内のText
コンポーネントが、data
内の項目ごとに1回表示されます。
{
"type": "Sequence",
"height": "100%",
"width": "100%",
"id": "listOfSoundsSequence",
"numbered": true,
"padding": [
"@marginHorizontal",
"@spacingLarge"
],
"items": [
{
"type": "Text",
"text": "${ordinal}. ${data.name}",
"spacing": "@spacingLarge"
}
],
"data": "${payload.listOfSoundsData.properties.listOfSounds}"
}
オブジェクト型のデータソースを使用し、データソースのproperties
オブジェクト内に配列を配置して、トランスフォーマーが後で配列にアクセスできるようにします。以下はこのデータソースの例です。このデータソースには、最初の4つのリスト項目が含まれています。
{
"listOfSoundsData": {
"type": "object",
"objectId": "speakListAplForAudioExample",
"properties": {
"listOfSounds": [
{
"audioUrl": "soundbank://soundlibrary/animals/amzn_sfx_bird_chickadee_chirp_1x_01",
"duration": 0.63,
"name": "コガラのさえずり(1回)(1)"
},
{
"audioUrl": "soundbank://soundlibrary/animals/amzn_sfx_bird_forest_01",
"duration": 2.9,
"name": "鳥が鳴く森(1)"
},
{
"audioUrl": "soundbank://soundlibrary/animals/amzn_sfx_bird_robin_chirp_1x_01",
"duration": 0.67,
"name": "コマツグミのさえずり(1回)(1)"
},
{
"audioUrl": "soundbank://soundlibrary/animals/amzn_sfx_raven_caw_1x_01",
"duration": 0.63,
"name": "ワタリガラスの鳴き声(1回)(1)"
}
]
}
}
}
aplAudioToSpeechトランスフォーマーを設定して項目の配列を処理する
配列内の各項目のオーディオクリップを作成するには、aplAudioToSpeech
トランスフォーマーのinputPath
プロパティを使用します。inputPath
プロパティでは、APL for Audioドキュメントで使用するデータを含むデータソースのオブジェクトへのパスを指定します。
inputPath
には、Sequence
で表示している配列と同じものを設定します。template
にはAPL for Audioドキュメントの名前、outputName
にはトランスフォーマーの出力が格納されるプロパティを設定します。
以下の例では、Alexaは指定されたtemplate
(soundItemToPlay
)を使用して、listOfSounds
配列内の各項目のオーディオクリップを生成します。
{
"transformers": [
{
"transformer": "aplAudioToSpeech",
"template": "soundItemToPlay",
"outputName": "speech",
"inputPath": "listOfSounds.*"
}
]
}
APL for Audioドキュメントを作成する
作成するAPL for Audioドキュメントでは、リスト内の1つの項目のオーディオを再生する必要があります。トランスフォーマーで、APL for Audioドキュメントをテンプレートとして使用して、inputPath
配列内の項目ごとに個別のオーディオクリップを生成します。
APL for Audioドキュメントでは、データバインディングを使用して、配列項目のデータにアクセスできます。このデータにアクセスするには、${payload.data}
式を使用します。
以下は、サウンド名を読み上げた後でサウンドエフェクトのオーディオを再生するSequencer
コンポーネントを含むドキュメントの例です。${payload.data.name}
と${payload.data.audioUrl}
の値は、inputPath
プロパティで参照されている配列(この例では前述のlistOfSounds
プロパティ)から取得されます。
{
"type": "APLA",
"version": "0.91",
"mainTemplate": {
"parameters": [
"payload"
],
"item": {
"type": "Sequencer",
"items": [
{
"type": "Speech",
"contentType": "SSML",
"content": "${payload.data.name}"
},
{
"type": "Silence",
"duration": 500
},
{
"type": "Audio",
"source": "${payload.data.audioUrl}"
}
]
}
}
}
aplAudioToSpeech
トランスフォーマーが実行されると、listOfSounds
配列内の項目ごとに次の処理が行われます。
${payload.data.name}
と${payload.data.audioUrl}
の式が、listOfSounds
内の項目の値に置き換えられます。- APL for Audioドキュメントに基づいてオーディオクリップが作成されます。この例のクリップでは、サウンド名が読み上げられた後にサウンドのサンプルが再生されます。
-
outputName
プロパティの配列内の項目に新しいオブジェクトが追加されます。このオブジェクトには、生成されたサウンドクリップのURLが格納されたurl
プロパティが含まれています。以下は、リスト内の最初の項目に対するトランスフォーマーの出力例です。{ "duration": 0.63, "audioUrl": "soundbank://soundlibrary/animals/amzn_sfx_bird_chickadee_chirp_1x_01", "speech": { "url": "https://tinyaudio.amazon.com/ext/v1/apl/audio/AYADeIg.../resource.mp3" }, "name": "コガラのさえずり(1回)(1)" }
トランスフォーマーの出力をSequenceの子コンポーネントにバインドする
APLドキュメントで、Sequence
またはGridSequence
の子コンポーネントのspeech
プロパティを、トランスフォーマーの出力にバインドします。Sequence
自体ではなく、必ず子コンポーネントのspeech
コンポーネントをバインドするようにしてください。
以下は、前出のSequence
コンポーネントの例です。data
プロパティは、データソースのlistOfSounds
配列にバインドされています。Text
コンポーネントのspeech
プロパティは、aplAudioToSpeech
コンポーネントの出力にバインドされています。
{
"type": "Sequence",
"height": "100%",
"width": "100%",
"id": "listOfSoundsSequence",
"numbered": true,
"padding": [
"@marginHorizontal",
"@spacingLarge"
],
"items": [
{
"type": "Text",
"text": "${ordinal}. ${data.name}",
"spacing": "@spacingLarge",
"speech": "${data.speech.url}"
}
],
"data": "${payload.listOfSoundsData.properties.listOfSounds}"
}
SpeakListコマンドを実行してkaraokeスタイルを設定する
オーディオを再生するには、SpeakList
コマンドを実行し、Sequence
コンポーネントまたはGridSequence
コンポーネントをターゲットにします。SpeakItemコマンドまたはSpeakListコマンドを実行してオーディオを呼び出すで説明したように、SpeakList
コマンドはさまざまな方法で呼び出すことができます。ターゲットには必ずリストのコンポーネント(Sequence
またはGridSequence
)を指定してください。
以下の例では、Sequence
内の各項目のオーディオを再生するボタンを定義しています。
ユーザーは、リスト内の個々の項目を選択できることを期待しています。ユーザーが1つの項目を選択したときにそのリスト項目のオーディオを再生するには、Text
コンポーネントをTouchWrapper
でラップし、onPress
プロパティにSpeakItem
コマンドを設定します。speech
プロパティは、Sequence
の子コンポーネントのものである必要があります。プロパティは、Text
コンポーネントではなく、TouchWrapper
で設定します。この例では、SpeakItem
コマンドにcomponentId
プロパティは必要ありません。これは、コマンドが独自のコンポーネント、つまりTouchWrapper
自体をターゲットにしているためです。
{
"type": "TouchWrapper",
"spacing": "@spacingLarge",
"speech": "${data.speech.url}",
"items": [
{
"type": "Text",
"text": "${ordinal}. ${data.name}"
}
],
"onPress": [
{
"type": "SpeakItem"
}
]
}
SpeakList
コマンドでは、オーディオの再生中に各項目をハイライト表示することもできます。これを有効にするには、karaoke
状態に基づいてSequence
の子コンポーネントの外観を変更するスタイルを追加します。Alexaでspeech
が再生されている間、そのコンポーネントはkaraoke
状態に設定されます。スタイルは、コンポーネントのstyle
プロパティに割り当てます。
たとえば、以下のスタイルでは、Alexaでコンポーネントのspeech
が再生されているときに、コンポーネントの色が青に変更されます。
{
"styles": {
"textStyleListItem": {
"values": [
{
"when": "${state.karaoke}",
"color": "blue"
}
]
}
}
}
以下は、リスト項目のText
コンポーネントが含まれたTouchWrapper
の例です。この例では、テキストスタイルが設定されています。karaoke
状態は、speech
プロパティが含まれている項目(この例ではTouchWrapper
)に適用されます。この状態をText
コンポーネントに適用するには、inheritParentState
をtrue
に設定します。
{
"type": "TouchWrapper",
"spacing": "@spacingLarge",
"speech": "${data.speech.url}",
"items": [
{
"type": "Text",
"text": "${ordinal}. ${data.name}",
"style": "textStyleListItem",
"inheritParentState": true
}
],
"onPress": [
{
"type": "SpeakItem"
}
]
}
以下は、項目のリストを表示する完全なAPLドキュメントとデータソースの例です。ユーザーは、ボタンを選択してリストのすべての項目を再生するか、個々の項目を選択して1つずつ再生することができます。
RenderDocumentディレクティブを返す
埋め込みのオーディオを使用するには、RenderDocumentディレクティブの一部としてオーディオ応答を含めるで説明したように、APLドキュメントとAPL for Audioドキュメントの両方を含むAlexa.Presentation.APL.RenderDocument
ディレクティブを返します。
ユーザーの操作への応答としてオーディオを再生する
ユーザーが画面をタップしたときや、音声でリクエストを行ったときなど、ユーザーの操作への応答としてSpeakItem
コマンドまたはSpeakList
コマンドを実行できます。
全体的な手順は、視覚応答にオーディオを埋め込むで説明した手順と同じです。
aplAudioToSpeech
トランスフォーマーを設定し、トランスフォーマーの出力をコンポーネントのspeech
プロパティにバインドします。- ボタンのタップなどのタップイベントの場合は、ユーザーがタップできるコンポーネントのハンドラーから、
SpeakItem
コマンドまたはSpeakList
コマンドを実行します。 - 音声リクエストの場合は、対話モデルのインテントを作成してリクエストをキャプチャします。このインテントのハンドラーで、
SpeakItem
コマンドまたはSpeakList
コマンドと、speech
プロパティが設定されたコンポーネントのIDを含む、ExecuteCommands
ディレクティブを返します。
ユーザーに最良のエクスペリエンスを提供するには、スキルでタップイベントと音声リクエストの両方に応答できるようにしてください。これにより、ユーザーがスキルの操作方法を選択することが可能になります。
タップイベントにオーディオで応答する
以下は、サウンドのリストを表示するAPLドキュメントです。これはリスト内の項目ごとにオーディオを再生するの例と似ています。この例では、カスタムコンポーネントではなくレスポンシブ対応コンポーネントのAlexaTextListItem
を使用して、コンテンツの全体的な外観を改良しています。ユーザーがリスト項目をタップしたときに実行するコマンドは、AlexaTextListItem
のprimaryAction
プロパティで指定しています。
音声リクエストにオーディオで応答する
ユーザーは、画面でコンテンツを視聴している場合でも、音声でAlexaと対話できることを期待しています。たとえば、項目のリストを表示しているときに、「2番目を選んで」などの発話で特定の項目がリクエストされる場合があります。
APLコンテンツに関連する音声リクエストをキャプチャするインテントを作成します。ドキュメントに埋め込まれたオーディオを使用してインテントに応答するには、Alexa.Presentation.APL.ExecuteCommands
ディレクティブを使用して、SpeakItem
またはSpeakList
を呼び出します。スキルがExecuteCommands
ディレクティブを返すと、Alexaはまず応答のoutputSpeech
を読み上げてから、指定されたコマンドを呼び出します。
サウンドのリストを表示する先ほどの例であれば、次のように複数のインテントを追加して、視覚コンテンツを音声で完全に操作できるようにします。
- ビルトインインテントの
AMAZON.SelectIntent
を使用して、ユーザーがリストの特定の項目をリクエストできるようにします。ユーザーは、「4番目の項目を選んで」などのフレーズを使用できます。AMAZON.SelectIntent
は、選択した項目に関する情報を含むIntentRequest
をスキルに送信します。 - カスタムインテントを作成して、ユーザーがリスト全体の読み上げをリクエストできるようにします。たとえば、このインテントに「サンプルサウンドを全部聴かせて」や「このリストを読んで」などの発話を追加することができます。
- スロットを含むカスタムインテントを作成し、ユーザーが項目を名前でリクエストできるようにします。これにより、ユーザーは「鳥が鳴く森1のサウンドを再生して」などの発話を使用できます。 このインテントのスロットを使用して、再生するサウンドの名前を収集します。
これらのインテントごとに、スキルでExecuteCommands
ディレクティブと、SpeakList
またはSpeakItem
のいずれかのコマンドを使用して応答します。
例: 1つのリスト項目のオーディオを使用してAMAZON.SelectIntentに応答する
ビルトインのAMAZON.SelectIntent
インテントには、ListPosition
というスロットが含まれています。このスロットは、リスト項目の位置を示す序数をキャプチャして、それを数値に変換します。ユーザーが「3番目を選んで」と言った場合、ListPosition
スロットの値は3
になります。
また、以下の両方を満たす場合、ListPosition
スロットではリスト項目のコンポーネントIDも取得できます。
- ユーザーがリクエストした項目が画面に表示されている。
- 項目のコンポーネントにIDが定義されている。
このインテントとスロットを使用して、ユーザーがリクエストした特定の項目をキャプチャし、ExecuteCommands
で応答して、その項目に関連付けられているspeech
を再生できます。
次のハンドラーは、以下の両方の条件が満たされた場合に実行されます。
- タップイベントにオーディオで応答するで示したドキュメントがデバイスに表示されている。
- ユーザーが
AMAZON.SelectIntent
を呼び出している。
ハンドラーは、ユーザーがリクエストした項目をListPostion
スロットから取得し、ExecuteCommands
で応答して、選択された項目に関連付けられているオーディオを再生します。
関連トピック
- Alexa.Presentation.APLインターフェースのリファレンス
- Alexa.Presentation.APLAインターフェースのリファレンス
- APL標準コマンド
- 複数子コンポーネントのプロパティ
- タッチ可能なコンポーネントのプロパティ
最終更新日: 2021 年 11 月 12 日