こんにちは、アプリケーションサービス部 ディベロップメントサービス2課の松尾です。
アドベントカレンダー16日目のお題は Amazon Connect の録音データについてご紹介します。
先日の re:Invent 2024にて、Amazon Connect の自動インタラクションの通話録音機能が発表されました。
Amazon Connect で IVR およびその他の自動対話中の音声が録音可能に https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-connect-record-audio-ivr-automated-interactions/
【参考】弊社ブログ: 【Amazon Connect】自動インタラクションの通話録音機能
IVR録音データの外部連携
Amazon Connect の録音データは管理画面上から簡単に確認できるのですが、CRMなどの外部サービスと連携する場合はCTR(問い合わせレコードデータモデル)を使用します。
CTR情報は Amazon Kinesis Data Streams または Amazon Data Firehose に出力することができ、この情報をもとに外部サービスにデータ連携を行います。
【参考】AWSドキュメント: Amazon Connect 問い合わせレコードのデータモデル
これまでのIVR録音実装イメージ
これまでもオペレーターと会話中の通話録音ファイルはS3に自動生成され、CTR情報から簡単にファイルパスを取得できたのですが、IVR中の音声ファイルは自動生成されませんでした。
このため、IVRの録音には Kinesis Video Streams に出力される音声ストリーミングから自分でファイルを生成する必要がありました。
自動インタラクション通話録音を使用した実装イメージ
今回のアップデートにより、以下のように Kinesis Video Streams を使用せずに録音データを作成することが可能になり、よりシンプルに実装できるようになりました。
技術検証
ここからは細部のお話になってくるので、技術的にご興味があればご覧ください。
CTRから取得できる情報について
公式ドキュメント上ではCTRには録音に関する情報が2つ(Recording、Recordings)ありますが、どちらも同じ説明文になっています。
記録が有効になっている場合、これは記録に関する情報です。
ただし、Recordingは RecordingInfo の単一項目、Recordingsは配列型式のようです。
今回発表された自動インタラクションの通話録音機能について、CTR(問い合わせレコードデータモデル)でどのように出力されるのか検証してみました。
1. メディアストリーミング(Kinesis Video Streams)を使用する方法(従来の方法)
以下のようなフローを作成してみます
実際のCTRは、以下のように連携されました。(抜粋)
"Recording": null, "Recordings": [ { "DeletionReason": null, "FragmentStartNumber": "{開始フラグメント番号}", "FragmentStopNumber": "{終了フラグメント番号}", "Location": "arn:aws:kinesisvideo:{region}:{省略}", "MediaStreamType": "VIDEO", "ParticipantType": "CUSTOMER", "StartTimestamp": "{開始タイムスタンプ}", "Status": null, "StopTimestamp": "{終了タイムスタンプ}", "StorageType": "KINESIS_VIDEO_STREAM" } ],
Recording
はnull、Recordings
にはストリーミングされた音声ファイルの情報が出力されます。
2. 自動インタラクションの通話録音機能を使用する方法(今回のアップデート)
今回のアップデートを反映して、以下のようなフローにしてみました。
CTRは以下のように連携されました。
"Recording": { "DeletionReason": null, "Location": "{出力先バケット名}/connect/{インスタンス名}/CallRecordings/ivr/{年}/{月}/{日}/{コンタクトID}_{タイムスタンプ}.wav", "Status": "AVAILABLE", "Type": "AUDIO" }, "Recordings": [ { "DeletionReason": null, "FragmentStartNumber": null, "FragmentStopNumber": null, "Location": "{出力先バケット名}/connect/{インスタンス名}/CallRecordings/ivr/{年}/{月}/{日}/{コンタクトID}_{タイムスタンプ(UTC)}.wav", "MediaStreamType": "AUDIO", "ParticipantType": "IVR", "StartTimestamp": "{開始タイムスタンプ}", "Status": "AVAILABLE", "StopTimestamp": "{終了タイムスタンプ}", "StorageType": "S3" } ],
Recording
、Recordings
ともにs3のファイルパスが出力されています。
音声ストリームからの変換の手間もなく、Recordingsから取得できる情報だけで簡単にファイル連携が可能になります。
自動インタラクション通話録音と会話録音を併用した場合の検証
留守番電話のような使い方ではなく、IVRとオペレーター通話どちらも録音したいケースもあるかと思います。
自動インタラクション通話録音とオペレーターとの会話録音をどちらも有効にした場合、CTR情報は以下のようになりました。
1. 自動インタラクション通話録音、オペレーターとの会話録音をどちらも有効化
"Recording": { "DeletionReason": null, "Location": "{出力先バケット名}/connect/{インスタンス名}/CallRecordings/{年}/{月}/{日}/{コンタクトID}_{タイムスタンプ(UTC)}.wav", "Status": "AVAILABLE", "Type": "AUDIO" }, "Recordings": [ { "DeletionReason": null, "FragmentStartNumber": null, "FragmentStopNumber": null, "Location": "{出力先バケット名}/connect/{インスタンス名}/CallRecordings/{年}/{月}/{日}/{コンタクトID}_{タイムスタンプ(UTC)}.wav", "MediaStreamType": "AUDIO", "ParticipantType": null, "StartTimestamp": null, "Status": "AVAILABLE", "StopTimestamp": null, "StorageType": "S3" }, { "DeletionReason": null, "FragmentStartNumber": null, "FragmentStopNumber": null, "Location": "{出力先バケット名}/connect/{インスタンス名}/CallRecordings/ivr/{年}/{月}/{日}/{コンタクトID}_{タイムスタンプ(UTC)}.wav", "MediaStreamType": "AUDIO", "ParticipantType": "IVR", "StartTimestamp": "{開始タイムスタンプ}", "Status": "AVAILABLE", "StopTimestamp": "{終了タイムスタンプ}", "StorageType": "S3" } ],
Recording
にはオペレーターとの会話録音のファイルパス、Recordings
にはオペレーターとの会話録音 → 自動インタラクション通話録音の順番でS3のファイルパスが出力されています。
2. IVRはメディアストリーミングを使用、オペレーターとの会話録音のみ有効化
"Recording": { "DeletionReason": null, "Location": "{出力先バケット名}/connect/{インスタンス名}/CallRecordings/{年}/{月}/{日}/{コンタクトID}_{タイムスタンプ(UTC)}.wav", "Status": "AVAILABLE", "Type": "AUDIO" }, "Recordings": [ { "DeletionReason": null, "FragmentStartNumber": null, "FragmentStopNumber": null, "Location": "{出力先バケット名}/connect/{インスタンス名}/CallRecordings/{年}/{月}/{日}/{コンタクトID}_{タイムスタンプ(UTC)}.wav", "MediaStreamType": "AUDIO", "ParticipantType": null, "StartTimestamp": null, "Status": "AVAILABLE", "StopTimestamp": null, "StorageType": "S3" }, { "DeletionReason": null, "FragmentStartNumber": "{開始フラグメント番号}", "FragmentStopNumber": "{終了フラグメント番号}", "Location": "arn:aws:kinesisvideo:{region}:{省略}", "MediaStreamType": "VIDEO", "ParticipantType": "CUSTOMER", "StartTimestamp": "{開始タイムスタンプ}", "Status": null, "StopTimestamp": "{終了タイムスタンプ}", "StorageType": "KINESIS_VIDEO_STREAM" } ],
Recording
には1と同様にオペレーターとの会話録音のファイルパス、Recordings
にはオペレーターとの会話録音 → Kinesis Video Streams のストリーム情報の順番で出力されました。
まとめると、2024年12月現在の挙動では、Recording
、Recordings
から取得できる情報はそれぞれ以下のようになりました。
- Recording
- メディアストリーミングの情報は含まれない(S3のファイルパスのみ)
- 自動インタラクション通話録音とオペレーターとの会話録音をどちらも有効にした場合、オペレーターとの会話録音が連携される
- Recordings
- メディアストリーミングの情報が含まれる
- オペレーターとの会話録音が配列の先頭になり、IVR中の録音情報はその後に含まれる
ちなみに
余談ですが、単一のフロー内で自動インタラクション通話録音のON/OFFを繰り返した場合、録音ファイルは一つにまとめられます(無効化されている時間は無音状態となっていました)。
最初に自動インタラクション通話録音をONにした時点からのファイルが出来上がるので、IVRの途中で録音をONにした場合、通話時間と録音ファイルの長さ(時間)には差異が生じる仕様となっているようです。
最後に
Amazon Connect の自動インタラクション通話録音について、アップデート内容の技術検証結果をご紹介しました。
自分でファイル変換を実装する必要がなくなったので、留守番電話機能などもかなり実現しやすくなった印象です。
あまり馴染みのない方も多いサービスかと思いますが、この記事がどなたかのお役に立てば幸いです。