[Amazon Connect 拡張] 通話記録( Audioファイル)をリアルタイムにAmazon Transcribeでテキスト化する仕組みを作ってみました

2019.11.29

1 はじめに

CX事業本部の平内(SIN)です。

Amazon Connect(以下、Connect)では、顧客とエージェントの通話を記録することが出来ます。 この記録は、録音データという形でS3上にwavファイルとして保存されます。

今回は、S3上にwavファイルが置かれたタイミングで、Amazon Transcribeにjobを設定して、文字起こしされた通話記録を同時に生成する仕組みを作成してみました。

参考:Amazon Transcribe とは?

参考:Amazon Connect Document - 通話録音の設定

2 構成

構成は、以下のとおりです。

顧客とエージェントとの通話記録は、wavファイルとしてS3に保存されます(①)。S3上に保存されたタイミングでLambdaが起動されます(②)。

Lambdaは、Transcribeを使用して、wavファイルをテキスト化し(④)、別バケットに保存します(⑤)。

3 設置方法

設置の要領は以下のとおりです。

(1) GitHub

必要なファイルは、GitHubに置きました。

$ git clone https://github.com/furuya02/AmazonConnectExtension004.git

ファイル構成は、概ね以下のとおりになっています。

.
└── cdk
    ├── cdk.json
    ├── bin
    │   └── cdk.ts <= CDKコード
    ├── lib
    │   └── cdk-stack.ts  <= CDKコード
    ├── src
    │   ├── setNotificationFunction <= CDKで使用されるカスタムリソース(既存のS3バケットにトリガーを設定するため)
    │   └── transcribeFunction <= TranscribeのJob生成
    ├── cdk.json
    └── tsconfig.json

(2) 通話記録のバケット指定

Connectのコンソールで、データストレージ > 通話記録 から、録音記録が保存されるS3のバケット名を取得します。

cdk/cdk-stack.tsを編集して、下記の部分に、上記のバケット名を設定して下さい。

// Amazon Connectの設定を転記して下さい。
const wavBucketName = 'connect-ea747ad00a36';

(3) CDKのデプロイ

CDKでビルド・デプロイします。

$ cd AmazonConnectExtension004
$ cd cdk
$ npm install
$ npm run build
$ cdk synth
$ cdk bootstrap --profile MyProfile <= 当該アカウント(リージョン)で初めて利用する場合
$ cdk deploy --profile MyProfile
$ cd ..

デプロイが成功すると、最後に出力されるデータが保存されるS3のバケット名が表示されますのでコピーしておきます。

Outputs:
AmazonConnectExtension004Stack.TranscribeBucket = connect-ex-transcribe-004-bucket-xxxxxxxxxxxx

(4) 通話記録ブロックの設置

コンタクトフローでは、通話記録動作の設定ブロックを配置します。

ブロックのプロパティでは、録音対象を設定します。

以上で、設置は完了です。

4 使用状況

実際に動作している様子です。

  • Connectによって通話が記録されるとwavファイルが生成されます。

  • wavファイルの生成をイベントとして、Transcribeのjobが生成されます。しばらく、Statusは、in progress となります。

  • 少し時間が経過すると、Status がComplateとなることが確認できます。

  • 出力バケットを確認すると、変換されたJSONファイルが生成されていることを確認できます。

5 Lambda

TranscribeでJobを生成しているLambdaを紹介させて下さい。

TranscribeのJob名は、wavオブジェクト名をもとに生成されています。実は、この名前が、そのまま出力されるファイル名になりますので、ニーズに併せて編集することをお勧めします。

Connectの録音は、「顧客」と「エージェント」で別のチャンネルに保存されるので、ChannelIdentificationフラグをtrueとしています。

Connectの録音ファイルのサンプルレートは、8Kbpsなのですが、これは、指定しなくてもTranscribeでそのまま変換できています。

import AWS = require("aws-sdk");

const transcribeservice = new AWS.TranscribeService();
const outputBucket = process.env.OUTPUT_BUCKET!;
 
exports.handler = async (event: any) => {
  console.log(JSON.stringify(event));

  await Promise.all(event.Records.map( async (record:any) => {
    
    // Job名は、オブジェクト名をもとに生成
    const tmp = record.s3.object.key.split('-');
    const jobName = tmp[tmp.length-1];
    console.log(`jobName: ${jobName}`);

    var params = {
      LanguageCode: 'ja-JP',
      Media: {
        MediaFileUri: `s3://${record.s3.bucket.name}/${record.s3.object.key}`
      },
      TranscriptionJobName: jobName,
      MediaFormat: 'wav',
      OutputBucketName: outputBucket,
      Settings: {
        ChannelIdentification: true, // チャンネル情報有効
      }
    };
    await transcribeservice.startTranscriptionJob(params).promise();
  }))
}

6 最後に

今回は、Connectの通話記録(wav)が、保存されるのと並行して、Transcribeで文字起こししたデータを生成する仕組みを作ってみました。

出力ファイルは、JSON形式の特有のものですが、これを目的に合せて編集する機能を追加することで、業務に利用できるシステムが作れそうな気がします。