コンポーネントの条件付きインフレート(APL for Audio)
コンポーネントの条件付きインフレートは、APLドキュメントのどのコンポーネントをレンダリングするかを決定します。たとえば、APLドキュメントのmainTemplate
プロパティはitems
プロパティ内のコンポーネントの配列を受け取りますが、レンダリングするのは1つのコンポーネントだけです。コンポーネントの条件付きインフレートが、どのコンポーネントをレンダリングするかを決定します。コンポーネントの条件付きインフレートアルゴリズムでは、コンポーネントの配列、プリミティブコンポーネントのwhen
プロパティ、データバインディングを組み合わせて簡潔な条件式を作成できます。
Speech
コンポーネントを生成するために、Alexaはテキストを音声に変換し、ユーザーに再生するオーディオクリップを生成します。条件付きインフレートのシナリオ
条件付きインフレートの動作はシナリオによって異なります。
- 1つの子のみ:Alexaは、コンポーネント候補の配列から1つのコンポーネントのみをレンダリングします。
- 1つの配列:Alexaは、コンポーネントの配列からコンポーネントの一部をレンダリングします。
- データ配列:Alexaは、データ配列を使ってコンポーネントのセットをレンダリングします。
以降のセクションでは、これらの各シナリオについて詳しく説明します。
1つの子のみのインフレート
1つの子のみのインフレートでは、Alexaはコンポーネントの配列から最大1つの子コンポーネントをレンダリングします。たとえば、APLドキュメントのmainTemplate
のitems
配列に複数のコンポーネントがある場合でも、Alexaがレンダリングするのは配列の1つのコンポーネントのみとなります。
使用場所 |
コンポーネントの配列を持つ
|
アルゴリズム |
コンポーネントの配列を受け取ったら、各コンポーネントの |
データバインディング |
デフォルトでは、1つの子のみのインフレートにバインドされる追加のプロパティはありません。 |
以下は、Selector
コンポーネントの例です。Selector
がレンダリングするのは1つの子コンポーネントのみですが、items
プロパティではコンポーネントの配列を受け取ります。
{
"type": "Selector",
"items": [
{
"when": "${payload.myData.userDefinedList.length > 1}",
"type": "Speech",
"contentType": "PlainText",
"content": "userDefinedListに項目が複数ある場合はこう言ってください。"
},
{
"type": "Speech",
"contentType": "PlainText",
"content": "userDefinedListに項目が1つしかないか、まったくない場合はこう言ってください。"
}
]
}
Alexaは、payload.myData.userDefinedList
で定義される配列に複数の項目がある場合、最初のSpeech
コンポーネントをレンダリングします。Alexaは、配列に項目がない場合や1つの項目のみの場合、2番目のSpeech
コンポーネントをレンダリングします。when
プロパティが指定されていない場合はデフォルトのtrue
となるため、この例では、最初のコンポーネントがスキップされた場合は2番目のSpeech
が常にレンダリングされます。
たとえば、以下のデータソースでは、Selector
が「userDefinedListに項目が複数ある場合はこう言ってください」の音声を使ってオーディオクリップを作成します。
{
"myData": {
"userDefinedList": [
"項目1",
"項目2",
"項目3"
]
}
}
以下のもう1つのデータソースでは、「userDefinedListに項目が1つしかないか、まったくない場合はこう言ってください。」の音声を使ってオーディオクリップを作成します。
{
"myData": {
"userDefinedList": [
"項目1"
]
}
}
1つの配列のインフレート
1つの配列のインフレートでは、Alexaは、コンポーネントの配列からコンポーネントの一部をレンダリングします。たとえば、Sequencer
コンポーネントは、items
プロパティでコンポーネントの配列を受け取ります。Alexaは、配列のすべての項目か、項目の一部をレンダリングします。
種類の異なる項目をまとめてレンダリングする場合、項目の1つの配列を使います。
使用場所 |
|
アルゴリズム |
配列内の各コンポーネントの |
データバインディング |
|
以下は、複数コンポーネントを順番にレンダリングするSequencer
コンポーネントの例です。この例では、data
プロパティが省略されているため、コンポーネントは1つの配列アプローチを使ってitems
内のすべてのコンポーネントを評価し、レンダリングするサブセットを選択します。
{
"type": "Sequencer",
"items": [
{
"type": "Speech",
"content": "ハローワールド。"
},
{
"type": "Speech",
"when": "${environment.aplVersion}",
"content": "画面で今日のあいさつをチェックしましょう!"
}
]
}
environment.aplVersion
プロパティは、デバイスでサポートされているAPLのバージョンを返します。画面のないデバイスやAPLをサポートしていない画面付きデバイスの場合は、null
を返します。つまり、この例では次のようになります。
- デバイスに画面がある場合、
Sequencer
は両方のコンポーネントをレンダリングし、ユーザーには「ハローワールド。 画面で今日のあいさつをチェックしましょう!」と再生されます。 - 画面のないデバイスの場合、
Sequencer
は1つ目のコンポーネントのみをレンダリングして2つ目は無視するため、ユーザーには「ハローワールド。」のみが再生されます。
データ配列のインフレート
データ配列のインフレートでは、Alexaはデータの配列を使ってコンポーネントのセットをインフレートします。この方法は、複数の子コンポーネントでdata
プロパティが設定されている場合に使用できます。
連結したいデータの配列がある場合は、このデータ配列アプローチを使用します。レンダリングするコンポーネントのセットを定義すると、Alexaは、data
の各項目についてそのコンポーネントセットをレンダリングします。
使用場所 |
|
アルゴリズム |
|
データバインディング |
|
以下は、data
プロパティにレシピの手順を表す文字列の配列を設定したSequencer
コンポーネントの例です。コンポーネントではitem
に1つのコンポーネントがあり、data
変数を使ってdata
配列からのコンテンツをレンダリングします。
{
"type": "Sequencer",
"item": {
"type": "Speech",
"content": "${index+1}. ${data}"
},
"data": "${payload.recipeData.steps}"
}
この例では、次のデータソースを使ってデータの配列をdata
プロパティに提供します。
{
"recipeData": {
"steps": [
"オーブンを180℃に予熱します。",
"バターと砂糖をミキサーでなめらかになるまで混ぜ合わせます。",
"バターと砂糖を混ぜたものに卵を一度に1つずつ加えて、なめらかになるまでかき混ぜます。",
"別のボールに...."
]
}
}
Alexaは、data
内の各文字列について、1回に1つずつSpeech
コンポーネントを評価します。when
プロパティがtrue
に評価されると、Alexaはそのコンポーネントをレンダリングします。この例では、when
プロパティがデフォルトのtrue
に評価されるため、Alexaは、コンポーネントを4回(1回にdata
の文字列を1つずつ)レンダリングします。ユーザーには4つの文字列すべてが1つずつ順に読み上げられます。
以下は、when
文を使ってSequencer
コンポーネントをネストし、種類の異なるデータのセットをインフレートする複雑な例です。
{
"type": "Sequencer",
"items": [
{
"when": "${data.opening}",
"type": "Speech",
"content": "${data.opening}"
},
{
"type": "Sequencer",
"items": [
{
"type": "Speech",
"content": "${data.speech1}"
},
{
"type": "Speech",
"content": "${data.speech2}"
}
]
}
],
"data": "${payload.speechData}"
}
この例では、次のデータソースを使ってデータの配列をdata
プロパティに提供します。
{
"speechData": [
{
"opening": "スピーチを開始します。"
},
{
"speech1": "1つ目のスピーチです。",
"speech2": "2つ目のスピーチです。"
}
]
}
Alexaは、data
内の2つの項目のそれぞれについて、Sequencer
を1回ずつ評価します。
- 最初の項目は、
opening
プロパティを持つオブジェクトです。${data.opening}
がtrue
のため、Alexaは最初のSpeech
コンポーネントを選択します。data.speech1
とdata.speech2
の値がどちらも空のため、2つのSpeech
コンポーネントを持つネストされたSequencer
は、事実上無視されます。 - 2つ目の項目は、
speech1
、speech2
のプロパティを持つオブジェクトです。${data.opening}
がfalse
のため、Alexaは最初のSpeech
コンポーネントを無視します。ネストされたSequencer
は子コンポーネントの1つの配列を使ってインフレートされるため、Alexaは両方のSpeech
コンポーネントをレンダリングします。
最終結果は、「スピーチを開始します。1つ目のスピーチです。2つ目のスピーチです。」となります。
関連トピック
最終更新日: 2021 年 10 月 11 日