はじめに
こんにちは!廣田です。
今回は、Amazon Connect にデータテーブル機能が追加されたので、さっそく試してみました!
データテーブル
データテーブルは、Amazon Connect 内の構成に影響を与えるデータを保存および管理できる機能です。
フローやビューなどの他のリソースからデータテーブルを参照できます。
データテーブルに変更や追加が行われた時、再公開をする必要がなく、パブリック APIおよびコンソール上で即座に利用することが可能です。
前提
- Amazon Connect インスタンスが構築済みであること
- 東京リージョン(ap-northeast-1)
初期設定
これで、データテーブルとレコードを作成することができます。
検証すること
今回は、コンタクトフロー内の「プロンプトの再生」で使う SSML をデータテーブルのレコードに格納し、参照して再生できるかを試してみたいと思います。
構築手順
データテーブルを作成
属性を設定
レコードを追加
追加する Text の内容
<speak>
<prosody rate="$.Attributes.speed" >
オペレーターにお繋ぎします。
</prosody>
</speak>
コンタクトフローを作成
以下のようなコンタクトフローを作成しました。
補足:データテーブル
- 手動で設定:
オン- データテーブル:
ssml-table - クエリ
- クエリ名:
GetSSMLText - プライマリ属性名:
Id - 属性キーを入力:
0 - クエリ属性:
Text
- クエリ名:
- データテーブル:
※注意点
- クエリ名とクエリ属性は「プロンプトの再生」にて使用しますので、覚えておいてください
- クエリ名はフロー内で一意になる必要があります
補足:プロンプトの再生
- テキスト読み上げまたはチャットテキスト:
オン- 動的に設定:
オン- 名前空間:
データテーブル - キー:
GetSSMLText.Text
- 名前空間:
- 次として解釈:
SSML
- 動的に設定:
検証用コンタクトフロー(.json)
{
"Version": "2019-10-30",
"StartAction": "65f38220-cc0c-4983-90f8-6440c2a6478c",
"Metadata": {
"entryPointPosition": {
"x": -218.4,
"y": -87.2
},
"ActionMetadata": {
"65f38220-cc0c-4983-90f8-6440c2a6478c": {
"position": {
"x": -120,
"y": -88
}
},
"b6c898b4-70ce-4a43-a8d1-9eb50566db49": {
"position": {
"x": 116.8,
"y": -82.4
},
"children": [
"985f9948-5a5d-434e-a7b1-e516b879a094"
],
"parameters": {
"TextToSpeechVoice": {
"languageCode": "ja-JP"
}
},
"overrideConsoleVoice": true,
"fragments": {
"SetContactData": "985f9948-5a5d-434e-a7b1-e516b879a094"
},
"overrideLanguageAttribute": true
},
"985f9948-5a5d-434e-a7b1-e516b879a094": {
"position": {
"x": 116.8,
"y": -82.4
},
"dynamicParams": []
},
"c2765a63-23a8-4b1b-a117-c3b4f6eecb92": {
"position": {
"x": 366.4,
"y": 194.4
}
},
"6e0890d3-c3f4-47b7-829e-045524cca301": {
"position": {
"x": 617.6,
"y": 239.2
}
},
"23a6707a-b58b-44a1-99b5-a74f0414211c": {
"position": {
"x": 347.2,
"y": -70.4
},
"dynamicParams": []
},
"8bffaf56-7d9a-441b-be00-0a8ccaa2dc3f": {
"position": {
"x": 124.8,
"y": 177.6
},
"parameters": {
"QueueId": {
"displayName": "BasicQueue"
}
},
"queue": {
"text": "BasicQueue"
}
},
"f2d96326-7eb0-43d5-bf6f-2eb971e64a0a": {
"position": {
"x": 576.8,
"y": -46.4
},
"parameters": {
"DataTableId": {
"displayName": "ssml-table"
}
}
},
"7cb1ab3c-3259-4aed-971e-359bdfa78f71": {
"position": {
"x": -123.2,
"y": 144
},
"parameters": {
"SSML": {
"useDynamic": true
}
},
"useDynamic": true
}
},
"Annotations": [],
"name": "検証用コンタクトフロー",
"description": "",
"type": "contactFlow",
"status": "published",
"hash": {}
},
"Actions": [
{
"Parameters": {
"FlowLoggingBehavior": "Enabled"
},
"Identifier": "65f38220-cc0c-4983-90f8-6440c2a6478c",
"Type": "UpdateFlowLoggingBehavior",
"Transitions": {
"NextAction": "b6c898b4-70ce-4a43-a8d1-9eb50566db49"
}
},
{
"Parameters": {
"TextToSpeechEngine": "Neural",
"TextToSpeechStyle": "None",
"TextToSpeechVoice": "Kazuha"
},
"Identifier": "b6c898b4-70ce-4a43-a8d1-9eb50566db49",
"Type": "UpdateContactTextToSpeechVoice",
"Transitions": {
"NextAction": "985f9948-5a5d-434e-a7b1-e516b879a094",
"Errors": [
{
"NextAction": "23a6707a-b58b-44a1-99b5-a74f0414211c",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {
"LanguageCode": "ja-JP"
},
"Identifier": "985f9948-5a5d-434e-a7b1-e516b879a094",
"Type": "UpdateContactData",
"Transitions": {
"NextAction": "23a6707a-b58b-44a1-99b5-a74f0414211c",
"Errors": [
{
"NextAction": "23a6707a-b58b-44a1-99b5-a74f0414211c",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {},
"Identifier": "c2765a63-23a8-4b1b-a117-c3b4f6eecb92",
"Type": "TransferContactToQueue",
"Transitions": {
"NextAction": "6e0890d3-c3f4-47b7-829e-045524cca301",
"Errors": [
{
"NextAction": "6e0890d3-c3f4-47b7-829e-045524cca301",
"ErrorType": "QueueAtCapacity"
},
{
"NextAction": "6e0890d3-c3f4-47b7-829e-045524cca301",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {},
"Identifier": "6e0890d3-c3f4-47b7-829e-045524cca301",
"Type": "DisconnectParticipant",
"Transitions": {}
},
{
"Parameters": {
"Attributes": {
"speed": "80%"
},
"TargetContact": "Current"
},
"Identifier": "23a6707a-b58b-44a1-99b5-a74f0414211c",
"Type": "UpdateContactAttributes",
"Transitions": {
"NextAction": "f2d96326-7eb0-43d5-bf6f-2eb971e64a0a",
"Errors": [
{
"NextAction": "f2d96326-7eb0-43d5-bf6f-2eb971e64a0a",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {
"QueueId": "arn:aws:connect:ap-northeast-1:738910090858:instance/7922efd0-d5d9-4445-b9ea-a077e39f2f5e/queue/6d2e7520-0faf-455b-b5d6-0d19b984c8f4"
},
"Identifier": "8bffaf56-7d9a-441b-be00-0a8ccaa2dc3f",
"Type": "UpdateContactTargetQueue",
"Transitions": {
"NextAction": "c2765a63-23a8-4b1b-a117-c3b4f6eecb92",
"Errors": [
{
"NextAction": "6e0890d3-c3f4-47b7-829e-045524cca301",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {
"DataTableId": "c9644cee-777d-4ae5-85f6-1c4a7c4dc653",
"Queries": [
{
"QueryName": "GetSSMLText",
"Attributes": [
"Text"
],
"PrimaryValues": [
{
"AttributeName": "Id",
"Value": "0"
}
]
}
]
},
"Identifier": "f2d96326-7eb0-43d5-bf6f-2eb971e64a0a",
"Type": "EvaluateDataTableValues",
"Transitions": {
"NextAction": "7cb1ab3c-3259-4aed-971e-359bdfa78f71",
"Errors": [
{
"NextAction": "7cb1ab3c-3259-4aed-971e-359bdfa78f71",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {
"SSML": "$.DataTables.GetSSMLText.Text"
},
"Identifier": "7cb1ab3c-3259-4aed-971e-359bdfa78f71",
"Type": "MessageParticipant",
"Transitions": {
"NextAction": "8bffaf56-7d9a-441b-be00-0a8ccaa2dc3f",
"Errors": [
{
"NextAction": "8bffaf56-7d9a-441b-be00-0a8ccaa2dc3f",
"ErrorType": "NoMatchingError"
}
]
}
}
]
}
検証結果
実際に電話をかけ、プロンプトが再生されることを確認しました。
以下はCloudWatch ログの抜粋です。
{
"ContactFlowModuleType": "EvaluateDataTableValues",
"ResultData": {
"ResultData": {
"GetSSMLText": {
"AttributeCount": 1
}
},
"Result": "EXECUTION_RESULT"
},
"Parameter": {
"Queries": [
{
"QueryName": "GetSSMLText",
"Attributes": [
"Text"
],
"PrimaryValues": [
{
"AttributeName": "Id",
"Value": "0"
}
]
}
]
}
}
{
"ContactFlowModuleType": "PlayPrompt",
"Parameters": {
"TextToSpeechType": "ssml",
"Text": "<speak> <prosody rate=\"$.Attributes.speed\" > オペレーターにお繋ぎします。 </prosody> </speak>"
}
}
想定どおりの音声が聞こえました!
CloudWatch ログを確認しても、データテーブルに設定したSSMLが出力されていることが分かります。
想定されるユースケース例
- 窓口ごとのメッセージやキューを設定して、分岐させる(1つの電話番号で複数窓口を運営している場合)
- 内線番号とエージェントまたはキューのマッピング
まとめ
今回は、Amazon Connect のデータテーブル機能を使ってみました!
これまで外部テーブルを使う場合は Amazon DynamoDB などを用意する必要があり、コンタクトフロー外でリソースの設定を管理するのが少し大変でした。
今回のアップデートにより、リソースの設定をデータテーブルに集約し、変更もデータテーブル側で完結できるようになりました。
また、コンタクトフロー上でさまざまな条件分岐を構築している場合、分岐ロジックを表として表現することが可能だと思います。
今後も「こんな使い方できるよ!」というネタを見つけたら、また発信します!
参考記事









