Amazon Connect のIVR録音データが扱いやすくなりました

記事タイトルとURLをコピーする

こんにちは、アプリケーションサービス部 ディベロップメントサービス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 に出力される音声ストリーミングから自分でファイルを生成する必要がありました。

従来のIVR録音

自動インタラクション通話録音を使用した実装イメージ

今回のアップデートにより、以下のように 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"
    }
],

RecordingRecordings ともに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月現在の挙動では、RecordingRecordings から取得できる情報はそれぞれ以下のようになりました。

  • Recording
    • メディアストリーミングの情報は含まれない(S3のファイルパスのみ)
    • 自動インタラクション通話録音とオペレーターとの会話録音をどちらも有効にした場合、オペレーターとの会話録音が連携される
  • Recordings
    • メディアストリーミングの情報が含まれる
    • オペレーターとの会話録音が配列の先頭になり、IVR中の録音情報はその後に含まれる

ちなみに

余談ですが、単一のフロー内で自動インタラクション通話録音のON/OFFを繰り返した場合、録音ファイルは一つにまとめられます(無効化されている時間は無音状態となっていました)。

最初に自動インタラクション通話録音をONにした時点からのファイルが出来上がるので、IVRの途中で録音をONにした場合、通話時間と録音ファイルの長さ(時間)には差異が生じる仕様となっているようです。

最後に

Amazon Connect の自動インタラクション通話録音について、アップデート内容の技術検証結果をご紹介しました。

自分でファイル変換を実装する必要がなくなったので、留守番電話機能などもかなり実現しやすくなった印象です。

あまり馴染みのない方も多いサービスかと思いますが、この記事がどなたかのお役に立てば幸いです。