トランスフォーマー
トランスフォーマーは、Alexa Presentation Language(APL)データソースのデータを別の表現に変換します。オブジェクトデータソースのtransformers
プロパティにトランスフォーマーオブジェクトの配列を含めることができます。
利用可能なトランスフォーマー
APLは、以下のトランスフォーマーをサポートします。
aplAudioToSpeech
– APL for AudioドキュメントをAPLコンポーネントのspeech
プロパティにバインドできるオーディオに変換します。その後、SpeakItem
、SpeakList
のいずれかを使ってオーディオを再生するようAlexaに指示できます。lineBreakProcessor
– 改行すべきではない文字シーケンスの周囲に<nobr>
タグを追加してテキスト入力を更新します。ssmlToSpeech
– 音声合成マークアップ言語(SSML)の入力値を、APLコンポーネントのspeech
プロパティにバインドできる音声に変換します。その後、SpeakItem
、SpeakList
のいずれかを使ってスピーチ音声を再生するようAlexaに指示できます。- audioタグを
ssmlToSpeech
トランスフォーマーと一緒に使うことはできません。 - このトランスフォーマーに渡されるテキストは、
<speak>
タグで囲まれた有効なSSMLである必要があります。
- audioタグを
ssmlToText
– 入力したSSMLをプレーンテキストに変換します。textToHint
– 入力された値を、デバイスに応じた正しいウェイクワードとヒント(「アレクサ、ヒントです」と言ってみて)に変換します。デバイスに応じたウェイクワードが選択されるので、ヒントに「アレクサ」というワードをハードコーディングしないでください。textToSpeech
– 入力したプレーンテキストをAPLコンポーネントのspeech
プロパティにバインドできる音声に変換します。その後、SpeakItem
APLコマンドを使用して、コンポーネントに関連付けられた音声を読み上げることができます。このトランスフォーマーはSSMLタグのないプレーンテキストを受け取ります。
トランスフォーマーのプロパティと変換規則
トランスフォーマーは、データソース内の名前付きプロパティのデータ変換を実行して、元のデータソースのプロパティにデータを書き込みます。outputName
が指定されていない場合、トランスフォーマーはinput
プロパティを上書きします。トランスフォーマーには、次の表に示す基本プロパティがあります。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
transformer |
文字列 | ◯ | トランスフォーマーのタイプです。 |
inputPath |
文字列 | ◯ | オブジェクト内の、変換するコンテンツへのパスです。データソースのproperties オブジェクト内のプロパティを参照する必要があります。 |
outputName |
文字列 | ✕ | オブジェクトに追加されるプロパティの名前です。outputName が指定されていない場合、inputPath は変換された出力で上書きされます。 |
template |
文字列 | ✕ | RenderDocumentディレクティブのsourcesオブジェクトで指定されたAPL for Audioドキュメントを参照します。aplAudioToSpeech トランスフォーマーのみに適用されます。 |
inputPath
は、データソースオブジェクトの1つのエンティティを指すか、ワイルドカードのプロパティまたは未解決配列を使用している一連のエンティティを指します。inputPath
と一致するプロパティが変換されます。inputPath
パターンはシンボルで、一定数のノードまたはワイルドカード参照が後に続きます。
次のルールが適用されます。
-
シンボル名または配列インデックスは、プロパティブロック内の既存のオブジェクトプロパティまたは配列インデックスと一致する必要があります。一致しない場合、変換は破棄されます。
-
出力が保存されている場所は、ワイルドカード以外の最後のノードをoutputNameで置き換えることで見つけられます。ワイルドカード以外のノードがない場合は、シンボルはoutputNameで置き換えられます。
-
最後のワイルドカード以外のノードが数値インデックスになることはありません。最後のワイルドカード以外のノードが数値の場合は、変換は破棄されます。
これらの例は、参照のしくみを示しています。次のサンプルデータを考えてみましょう。
{
"myDocumentData": {
"type": "object",
"properties": {
"name": "山田太郎",
"address": {
"street": "中央通り301番地",
"city": "目黒区"
},
"family": [
{
"name": "花子",
"relation": "妻"
},
{
"name": "桜子",
"relation": "娘"
}
],
"contacts": [
"鈴木一郎",
"鈴木梅子"
]
},
"transformers": [
{
"inputPath": ["下の表を参照してください"],
"outputName": ["下の表を参照してください"],
"transformer": "textToSpeech"
}
]
}
}
次の表は、inputPath
とoutputName
のさまざまな値によって、上記のデータソースのデータがどのように変換されるかを示しています。
inputPath | 変換される項目 | 結果の保存場所 |
---|---|---|
name | "山田太郎" | outputName |
address.street | "中央通り301番地" | address.outputName |
contacts.* | ["鈴木一郎", "鈴木梅子"] | outputName[0], outputName[1] |
family[0].name | "花子" | family[0].outputName |
family[*].name | "花子", "桜子" | family[0].outputName, family[1].outputName |
address.* | "中央通り301番地", "目黒区" | outputName.street, outputName.city |
family[3].name | 無効:family 配列にはインデックス3の値が指定されていません。 |
|
family[1].names | 無効:family[1] の値にはnames プロパティが指定されていません。 |
|
family[0] | { "name": "花子", "relation": "妻" } | 無効:最後のワイルドカード以外のノードが数値インデックスになることはありません。 |
aplAudioToSpeechトランスフォーマー
APL for AudioドキュメントをAPLコンポーネントのspeech
プロパティにバインドできるオーディオに変換します。その後、SpeakItem
、SpeakList
のいずれかを使ってオーディオを再生するようAlexaに指示できます。
aplAudioToSpeech
トランスフォーマーには以下のプロパティがあります。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
transformer |
文字列 | ◯ | aplAudioToSpeech に設定します。 |
inputPath |
文字列 | ✕ | APL for Audioドキュメントで置き換えられるデータを含むデータソースのオブジェクトへのパスです。 |
outputName |
文字列 | ◯ | 変換の結果とともにデータソースに追加されるプロパティの名前です。 |
template |
文字列 | ◯ | RenderDocument ディレクティブのsourcesプロパティで指定されたAPL for Audioドキュメントを参照します。これは、オーディオに変換するドキュメントです。構文{identifierName}に従います。 |
このトランスフォーマーのinputPath
は、データソースオブジェクト内のエンティティまたはエンティティ配列を識別します。識別された各エンティティについて、トランスフォーマーはdataと呼ばれる新しいプロパティをデータソースに追加します。その後、トランスフォーマーは変更されたデータソースを使ってAPL for Audioドキュメントを評価します。これにより、ドキュメントでデータバインディングを使用できるようになります。例については、inputPathなしの変換の例を参照してください。
outputName
は、変換の結果に使用するデータソース内のプロパティを識別します。トランスフォーマーは、url
プロパティを使い、オブジェクトとしてoutputName
をデータソースに追加します。url
プロパティには再生するオーディオが含まれます。url
プロパティを、APLドキュメント内のコンポーネントのspeech
プロパティにバインドします。
template
を使用して、変換するAPL for Audioドキュメント全体を参照できます。このドキュメントを、RenderDocument
ディレクティブのsources
プロパティに指定します。sources
プロパティは、キー/オブジェクトのマップです。sources
のキーをtemplate
の名前として使用します。
この例では、RenderDocument
ディレクティブのsources
プロパティに1つのAPL for AudioドキュメントとキーcatFactAPLAudio
が含まれています。このドキュメントをトランスフォーマーとともに使用するには、template
にcatFactAPLAudio
を設定します。
{
"sources": {
"catFactAPLAudio": {
"type": "APLA",
"version": "0.91",
"mainTemplate": {
"items": [
{
"type": "Speech",
"contentType": "ssml",
"content": "<speak>すべての猫が<emphasis level='strong'>マタタビ</emphasis>を好むとは限りません。</speak>"
}
]
}
}
}
}
inputPathなしの変換の例
inputPath
プロパティは必須ではありません。以下は、inputPath
のないドキュメントの例です。
この例には、RenderDocument
ディレクティブのdocument
、sources
、datasources
のプロパティが含まれています。
{
"document": {
"type": "APL",
"version": "1.6",
"theme": "dark",
"mainTemplate": {
"parameters": [
"payload"
],
"items": {
"type": "Text",
"text": "${payload.catFactData.properties.catFact}",
"speech": "${payload.catFactData.properties.catFactAudio.url}"
}
}
},
"sources": {
"catFactAPLAudio": {
"type": "APLA",
"version": "0.91",
"mainTemplate": {
"items": [
{
"type": "Speech",
"contentType": "ssml",
"content": "<speak>すべての猫が<emphasis level='strong'>マタタビ</emphasis>を好むとは限りません。</speak>"
}
]
}
}
},
"datasources": {
"catFactData": {
"type": "object",
"properties": {
"backgroundImage": "https://.../catfacts.png",
"title": "猫の秘密 #9",
"logoUrl": "https://.../logo.png",
"image": "https://.../catfact9.png"
},
"transformers": [
{
"template": "catFactAPLAudio",
"outputName": "catFactAudio",
"transformer": "aplAudioToSpeech"
}
]
}
}
}
トランスフォーマーは、データソースのproperties
オブジェクトに新しいオブジェクトcatFactAudio
を追加します。この新しいオブジェクトには、再生するオーディオのURLを含むurl
プロパティが含まれています。この例では、Text
プロパティのspeech
コンポーネントがデータバインディング式${payload.catFactData.properties.catFactAudio.url}
を使用してそのオーディオを参照しています。
inputPathを使用した変換の例
以下の例は、変換中にinputPath
プロパティを使用してAPL for Audioドキュメントのデータを置き換えるデータソースのデータを指定しています。この例には、RenderDocument
ディレクティブのdocument
、sources
、datasources
のプロパティが含まれています。
APLドキュメントはshoppingItems.properties.itemList
のオブジェクト配列をSequence
のdata
プロパティにバインドして、配列内のすべての項目のリストを表示します。APLAドキュメントは、名前を言い、バックグラウンドサウンドを再生するテンプレートを定義します。また、このテンプレートはデータバインディングも使用し、name
とバックグラウンドサウンドのオーディオファイルを参照します。
トランスフォーマーはinputPath
にitemList.*
を設定し、properties.itemList
配列の項目を参照します。
{
"document": {
"type": "APL",
"version": "1.6",
"theme": "dark",
"mainTemplate": {
"parameters": [
"payload"
],
"item": {
"type": "Sequence",
"width": "100%",
"height": "100%",
"data": "${payload.shoppingItems.properties.itemList}",
"items": [
{
"type": "Container",
"direction": "row",
"items": [
{
"type": "Text",
"text": "${data.name}",
"color": "white"
},
{
"type": "Image",
"source": "${data.image}",
"align": "top",
"scale": "best-fit"
}
]
}
]
}
}
},
"sources": {
"TextWithBackgroundAudio": {
"type": "APLA",
"version": "0.91",
"mainTemplate": {
"parameters": [
"payload"
],
"item": {
"type": "Mixer",
"items": [
{
"type": "Speech",
"content": "${payload.data.name}"
},
{
"type": "Audio",
"source": "${payload.shoppingItems.properties.backgroundRoomAudio[payload.data.category]}"
}
]
}
}
}
},
"datasources": {
"shoppingItems": {
"type": "object",
"properties": {
"itemList": [
{
"name": "野球",
"image": "https://imgur.com/gallery/Szbir",
"category": "アウトドア"
},
{
"name": "フリスビー",
"image": "https://imgur.com/t/frisbee/6yWhK5k",
"category": "アウトドア"
},
{
"name": "コーヒーポット",
"image": "https://imgur.com/gallery/IJwSUPE",
"category": "キッチン"
}
],
"backgroundRoomAudio": {
"バスルーム": "https://bathroom_sounds.mp3",
"キッチン": "https://kitchen_sounds.mp3",
"アウトドア": "https://outdoor_sounds.mp3"
}
},
"transformers": [
{
"inputPath": "itemList.*",
"outputName": "speech",
"transformer": "aplAudioToSpeech",
"template": "TextWithBackgroundAudio"
}
]
}
}
}
トランスフォーマーはproperties.itemList
配列の各項目について以下を実施します。
speech
という新しいプロパティを追加します。「speech」という名前は、トランスフォーマーで定義されたoutputName
から取得しています。- APLAドキュメントをオーディオに変換します。
data
を参照するデータバインディング式をitemList
項目のデータで置き換えます。たとえば、トランスフォーマーが最初の項目を処理する際、${payload.data.name}
が"野球"に、payload.shoppingItems.properties.backgroundRoomAudio[payload.data.category]
がオーディオファイル"https://outdoor_sounds.mp3"に置き換わります。 - 変換されたオーディオを
speech
オブジェクトのurl
プロパティに保存します。
以下は、変換されたデータソースの例です。
{
"shoppingItems": {
"type": "object",
"properties": {
"itemList": [
{
"name": "野球",
"image": "https://imgur.com/gallery/Szbir",
"category": "アウトドア",
"speech": {
"url": "https://www.amazonalexa.com/examples/mp3/baseballaudio.mp3"
}
},
{
"name": "フリスビー",
"image": "https://imgur.com/t/frisbee/6yWhK5k",
"category": "アウトドア",
"speech": {
"url": "https://www.amazonalexa.com/examples/mp3/frisbeeaudio.mp3"
}
},
{
"name": "コーヒーポット",
"image": "https://imgur.com/gallery/IJwSUPE",
"category": "キッチン",
"speech": {
"url": "https://www.amazonalexa.com/examples/mp3/coffeepotaudio.mp3"
}
}
],
"backgroundRoomAudio": {
"バスルーム": "https: //bathroom_sounds.mp3",
"キッチン": "https: //kitchen_sounds.mp3",
"アウトドア": "https://outdoor_sounds.mp3"
}
}
}
}
変換されたAPLAドキュメントのレンダリング
変換されたドキュメントをレンダリングするには、SpeakItem
、SpeakList
のいずれかのコマンドを使用します。このコマンドは、ボタンを押すなど、APLドキュメント内で直接起動できます。Alexa.Presentation.APL.ExecuteCommands
ディレクティブを使用して、SpeakItem
コマンドをスキルから直接デバイスに送信することもできます。
以下は、ExecuteCommands
ディレクティブの例です。
{
"type": "Alexa.Presentation.APL.ExecuteCommands",
"token": "[SkillProvidedToken]",
"commands": [
{
"type": "SpeakItem",
"componentId": "catFactText",
"highlightMode": "line",
"align": "center"
}
]
}
ExecuteCommands
ディレクティブで渡しているトークンは必須です。このトークンは、APLドキュメントの表示に使用するRenderDocumentディレクティブでスキルによって渡されるトークンと一致する必要があります。
lineBreakProcessorトランスフォーマー
改行すべきではない文字シーケンスの周囲に<nobr>
タグを追加してテキスト入力を更新します。このトランスフォーマーは日本のロケールで使用できます。
トランスフォーマーには以下の表のプロパティがあります。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
文字列 |
◯ |
|
|
文字列 |
◯ |
変換するテキスト入力を含むデータソースのプロパティへのパスです。 |
|
文字列 |
✕ |
変換の結果とともに |
|
文字列 |
◯ |
|
以下は、日本語テキストを使ったデータソースでlineBreakProcessor
トランスフォーマーを使用する方法の例です。
{
"catFactData": {
"type": "object",
"properties": {
"myText": "EU、日本から渡航解禁へ 7月1日"
},
"transformers": [
{
"inputPath": "myText",
"outputName": "transformedText",
"transformer": "lineBreakProcessor",
"locale": "ja-JP"
}
]
}
}
変換後、変換されたデータソースは次のようになります。
{
"catFactData": {
"type": "object",
"properties": {
"myText": "EU、日本から渡航解禁へ 7月1日",
"transformedText": "<nobr>EU、</nobr><nobr>日本</nobr><nobr>から</nobr><nobr>渡航</nobr><nobr>解禁</nobr><nobr>へ</nobr><nobr>7月1日</nobr>"
}
}
}
ssmlToSpeechトランスフォーマー
ssmlToSpeech
トランスフォーマーは、SSML文字列を音声に適したエンティティに変換します。このトランスフォーマーに渡されるテキストは、<speak>
タグで囲まれた有効なSSMLである必要があります。プレーンテキストの場合は、代わりにtextToSpeech
トランスフォーマーを使用してください。
ドキュメントにおいて、ssmlToSpeech
トランスフォーマーの出力値をコンポーネントのspeech
プロパティにバインドします。下記のコードは、猫の秘密にバインドされたText
コンポーネントに音声を関連付けた「猫の秘密」スキルを示しています。
text
プロパティはcatFactData.properties.catFact
を指し、speech
コンポーネントはcatFactData.properties.catFactSpeech
を指します。
{
"type": "Container",
"item": {
"type": "Text",
"id": "catFactText",
"text": "${payload.catFactData.properties.catFact}",
"speech": "${payload.catFactData.properties.catFactSpeech}"
}
}
次の例は、対応するcatFactData
データソースを示しています。properties
オブジェクトには、コンポーネントで使用する実際のテキストを含むcatFactSsml
プロパティがあります。このプロパティは、ssmlToSpeech
およびssmlToText
トランスフォーマーの両方の入力値として使用されます。
ssmlToSpeech
トランスフォーマーは、catFactSsml
の値を音声に変換し、その出力値をcatFactSpeech
という新しいプロパティに格納します。catFactSpeech
プロパティは、前述のText
コンポーネントのspeech
プロパティにバインドされています。ssmlToText
トランスフォーマーは、catFactSsml
の値をプレーンテキストに変換し、出力値をcatFact
という新しいプロパティに配置します。catFact
プロパティは、前述のText
コンポーネントのtext
プロパティにバインドされています。
{
"catFactData": {
"type": "object",
"properties": {
"backgroundImage": "https://.../catfacts.png",
"title": "猫の秘密 #9",
"logoUrl": "https://.../logo.png",
"image": "https://.../catfact9.png",
"catFactSsml": "<speak>すべての猫が<emphasis level='strong'>マタタビ</emphasis>を好むとは限りません。</speak>"
},
"transformers": [
{
"inputPath": "catFactSsml",
"outputName": "catFactSpeech",
"transformer": "ssmlToSpeech"
},
{
"inputPath": "catFactSsml",
"outputName": "catFact",
"transformer": "ssmlToText"
}
]
}
}
最後に、猫の秘密を読み上げるには、SpeakItem
コマンドで使用して、AlexaにAlexa.Presentation.APL.ExecuteCommands
ディレクティブを送信します。下記のコードは、猫の秘密を読み上げるために使用できるAlexa.Presentation.APL.ExecuteCommands
ディレクティブを示します。ExecuteCommands
ディレクティブで渡しているトークンは必須です。このトークンは、APLドキュメントの表示に使用するRenderDocument
ディレクティブでスキルによって渡されるトークンと一致する必要があります。
{
"type": "Alexa.Presentation.APL.ExecuteCommands",
"token": "[SkillProvidedToken]",
"commands": [
{
"type": "SpeakItem",
"componentId": "catFactText",
"highlightMode": "line",
"align": "center"
}
]
}
ssmlToSpeech
トランスフォーマーで処理されたすべてのテキストは、Alexaアプリの音声履歴ページに表示されます。アプリのこのセクションには、Alexaのユーザーへの応答が表示されます。ssmlToSpeech
テキストは、音声応答の一部とみなされます。テキストは、SpeakItem
を使って処理したテキストを読み上げたことがなくてもアプリに表示されます。
ssmlToTextトランスフォーマー
SSMLからテキストに変換するトランスフォーマーは、SSMLマークアップを削除することで、すべてのSSMLテキスト文字列を人が読みやすいテキストに変換します。
textToHintトランスフォーマー
textToHint
トランスフォーマーは入力された値を、デバイスに応じた正しいウェイクワードとヒント(「アレクサ、ヒントです」と言ってみて)に変換します。デバイスに応じたウェイクワードが選択されるので、ヒントに「アレクサ」という語をハードコーディングしないでください。通常、このトランスフォーマーはAlexaFooter
レスポンシブ対応コンポーネントと共に使用します。
ヒントの表示例については、textToHintトランスフォーマーを使用するを参照してください。
textToSpeechトランスフォーマー
textToSpeech
トランスフォーマーは、プレーンテキストを音声に適したエンティティに変換します。このトランスフォーマーに渡されるテキストは、プレーンテキストでなければなりません。SSMLテキストの場合は、代わりにssmlToSpeech
トランスフォーマーを使用してください。
このトランスフォーマーは、ssmlToSpeech
トランスフォーマーと同じように機能します。textToSpeech
トランスフォーマーの出力値をコンポーネントのspeech
プロパティにバインドして、SpeakItem
コマンドを使用してテキストを読み上げます。
このデータソースの例では、前述のcatFactData
データソースを示していますが、catFactText
プロパティにはプレーンテキストを使用しています。この場合、catFactText
プロパティは既にプレーンテキストであるため、ssmlToText
トランスフォーマーは不要です。
{
"catFactData": {
"type": "object",
"properties": {
"backgroundImage": "https://.../catfacts.png",
"title": "猫の秘密 #9",
"logoUrl": "https://.../logo.png",
"image": "https://.../catfact9.png",
"catFactText": "すべての猫がマタタビを好むとは限りません。"
},
"transformers": [
{
"inputPath": "catFactText",
"outputName": "catFactSpeech",
"transformer": "textToSpeech"
}
]
}
}
Text
コンポーネントでは、このデータソースを次のように参照できます。
{
"type": "Container",
"item": {
"type": "Text",
"id": "catFactText",
"text": "${payload.catFactData.properties.catFactText}",
"speech": "${payload.catFactData.properties.catFactSpeech}"
}
}
text
プロパティは、変換されていないプレーンテキストのcatFactText
プロパティにバインドします。speech
プロパティはトランスフォーマーの出力値にバインドします。
textToSpeech
トランスフォーマーで処理されたすべてのテキストは、Alexaアプリの音声履歴ページに表示されます。アプリのこのセクションには、Alexaのユーザーへの応答が表示されます。textToSpeech
テキストは、音声応答の一部とみなされます。テキストは、SpeakItem
を使って処理したテキストを読み上げたことがなくてもアプリに表示されます。
関連トピック
最終更新日: 2021 年 06 月 04 日