[Amazon Connect]Contact Lens for Amazon ConnectでオペレーターがNGワードを発言した時に検知する仕組みを構築する

Contact Lens for Amazon Connectで翻訳した内容からNGワードを検出してみる
2022.07.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Contact Lens for Amazon Connectを利用してNGワードを検知する仕組みを構築する機会がありましたので紹介します。

Contact Lens for Amazon Connectとは

Contact Lens for Amazon Connectとは、Amazon Connectで通話した内容を書き起こししたり、感情分析ができるサービスになります。
2021/9に日本語対応しました。

今回はContact Lens for Amazon Connectの【ルール】機能を利用して、オペレーターがNGワードを発言した時の検知する仕組みを実装します。

実装のシナリオ

実装内容は下記です。

  • オペレーター(以下OP)がお客さんにNGワード(今回は「ダメ」,「エヌジー」といった単語)を言った場合にスーパーバイザー(以下SV)がリアルタイムレポートで検知する
  • リアルタイムレポートで対象のコールをクリックすると会話の要約がでてくる
  • コールが終わりSVがCCPにログインしたら「タスク」として電話がなり、取ると対象のコールを見るURLが表示される
  • NGワードを検知したルールをAmazon EventBridgeで検知してAmazon SNS経由でルール名をEmailに通知する

今回はリアルタイムで検証します。(リアルタイムだけでなく、通話後も設定可能です)

実装

Amazon Connectの設定

AWSマネジメントコンソールからAmazon Connectのページに飛んで、分析ツール→Contact Lensを有効にする、をクリックします。

Amazon Connectコンソールに飛んで、セキュリティプロファイルを確認します。 利用するユーザーのセキュリティプロファイルの分析から、Contact Lens - 音声分析ルールで表示、編集、作成および削除が有効になっていることを確認します。
(Contact Lens - カスタム語彙は今回使わないため、チェックが入っていなくとも問題ございません)

NGワードのコールが終わった後にSVがタスクで内容を確認するため、キューを一つ作成します。
名前をSupervisorQueue、説明でQueue for the supervisors to receive tasks、オペレーション時間はBasic Hoursにして保存をクリックします。

SV用のルーティングプロファイルも作成しておきます。
名前はSupervisor Routing Profile、説明はUsed for supervisors、音声とタスクにチェックを入れて、キューは先ほど作成したSupervisorQueueを設定します。

SVのユーザーを作成します。
セキュリティプロファイル、ルーティングプロファイルともに設定したプロファイルを選択します。

SVがタスクで受け取るコンタクトフローを構築します。
下記jsonをメモ帳等にコピーしてテキストファイルで保存します。

QueueFlow.txt

{
  "modules": [
    {
      "id": "b36dfa3d-e42e-4fcb-b2d0-fb84cab0cef1",
      "type": "Disconnect",
      "branches": [],
      "parameters": [],
      "metadata": {
        "position": {
          "x": 1113,
          "y": 91
        }
      }
    },
    {
      "id": "646452c8-483e-4a9f-86ee-962fd06fcfcc",
      "type": "SetLoggingBehavior",
      "branches": [
        {
          "condition": "Success",
          "transition": "1a3c54b5-31e7-4d23-8a85-a1f6770817d9"
        }
      ],
      "parameters": [
        {
          "name": "LoggingBehavior",
          "value": "Enable"
        }
      ],
      "metadata": {
        "position": {
          "x": 80,
          "y": 220
        }
      }
    },
    {
      "id": "6aa614d2-cfa1-4389-be30-5d26b17f2663",
      "type": "Transfer",
      "branches": [
        {
          "condition": "AtCapacity",
          "transition": "b36dfa3d-e42e-4fcb-b2d0-fb84cab0cef1"
        },
        {
          "condition": "Error",
          "transition": "696c76a6-6717-4933-bcba-df04f60ba341"
        }
      ],
      "parameters": [],
      "metadata": {
        "position": {
          "x": 759,
          "y": 12
        },
        "useDynamic": false,
        "queue": null
      },
      "target": "Queue"
    },
    {
      "id": "696c76a6-6717-4933-bcba-df04f60ba341",
      "type": "PlayPrompt",
      "branches": [
        {
          "condition": "Success",
          "transition": "b36dfa3d-e42e-4fcb-b2d0-fb84cab0cef1"
        }
      ],
      "parameters": [
        {
          "name": "Text",
          "value": "Sorry we are facing technical difficulties",
          "namespace": null
        },
        {
          "name": "TextToSpeechType",
          "value": "text"
        }
      ],
      "metadata": {
        "position": {
          "x": 886,
          "y": 327
        },
        "useDynamic": false
      }
    },
    {
      "id": "1a3c54b5-31e7-4d23-8a85-a1f6770817d9",
      "type": "Wait",
      "branches": [
        {
          "condition": "Timeout",
          "transition": "11af20cb-4588-46a5-8dfb-328cb749be97"
        },
        {
          "condition": "Error",
          "transition": "696c76a6-6717-4933-bcba-df04f60ba341"
        }
      ],
      "parameters": [
        {
          "name": "TimeoutSeconds",
          "value": "30"
        }
      ],
      "metadata": {
        "position": {
          "x": 280,
          "y": 7
        },
        "useDynamic": false,
        "timeoutUnit": {
          "display": "Seconds",
          "value": "second"
        }
      }
    },
    {
      "id": "11af20cb-4588-46a5-8dfb-328cb749be97",
      "type": "SetQueue",
      "branches": [
        {
          "condition": "Success",
          "transition": "6aa614d2-cfa1-4389-be30-5d26b17f2663"
        },
        {
          "condition": "Error",
          "transition": "696c76a6-6717-4933-bcba-df04f60ba341"
        }
      ],
      "parameters": [
        {
          "name": "Queue",
          "value": "**** TEST_QUEUE ****",
          "namespace": null,
          "resourceName": "**** TEST_QUEUE ****"
        }
      ],
      "metadata": {
        "position": {
          "x": 522,
          "y": 14
        },
        "useDynamic": false,
        "queue": {
          "id": "**** TEST_QUEUE ****",
          "text": "**** TEST_QUEUE ****"
        }
      }
    }
  ],
  "version": "1",
  "type": "contactFlow",
  "start": "646452c8-483e-4a9f-86ee-962fd06fcfcc",
  "metadata": {
    "entryPointPosition": {
      "x": 20,
      "y": 20
    },
    "snapToGrid": false,
    "name": "Test_QueueFlow",
    "description": "Place the Task in the BasicQueue",
    "type": "contactFlow",
    "status": "published",
    "hash": "1df62264f4ea625a9c8495adaa72ba96959d315e91141eaddf4bab94698e7397"
  }
}

問い合わせフロー→コンタクトフローの作成、から右上のフローのインポート(ベータ)をクリックし、保存したテキストファイルを読み込みます。
作業キューの設定を作成したSupervisorQueueに設定して、保存・公開をクリックします。

これでAmazon Connectの準備は完了です。

Contact Lensの有効化

問い合わせ窓口で利用するフローを用意します。
もしない場合は既存であるSample recording behaviorフローを利用してください。
フローにある記録と分析の動作を設定ブロックの通話記録をエージェント及び顧客でチェックを入れます。
Contact Lens 音声分析の有効にチェックを入れます。
リアルタイムおよび通話後の分析にチェックを入れて、言語は日本語で設定します。

Amazon EventBridgeの設定

EventBridge経由でAmazon SNSに通知するため、Amazon SNSでトピックを作成します。
マネジメントコンソールでSNS画面を開き、トピックの作成をクリックします。
名前をEmailNotificationとし、その他はデフォルトで進めます。

サブスクリプションの作成でプロトコルをEメール、エンドポイントに普段利用しているメールアドレスを入力します。

メールが届くので承認します。

マネジメントコンソールでAmazon EventBridgeの画面に移動します。
ルール名を決めて、次へをクリックします。

下にあるイベントパターンのところでAWSのサービスをAmazon Connect、イベントタイプをContact Lens Realtime Rules Matchedで設定します。

ターゲットにSNSトピックの作成したEmailNotificationを選択します。

Contact Lens ルールの設定

いよいよContact Lensのルールの設定を行います。
Amazon Connectコンソールからルールをクリックします。

ルールを作成、Contact Lensをクリックします。
Contact Lens リアルタイム分析が利用可能にして、単語は完全一致、講演者はエージェントにします。
NGワードを登録します。

カテゴリ名に分かる名前を入力し、タスクを作成し、先ほど作成したキューを指定します。
EventBridgeイベントも分かりやすい名前を入力します。

これで設定は完了です。お疲れ様でした。

テスト

実際にNGワードを発言したら引っ掛かるかテストします。
電話をかけて、オペレーター側から一方的にNGワードを発言します。
裏でリアルタイムメトリクスを見ると、赤い点が出てきて、そこをクリックすると会話の要約をリアルタイムで見ることができました。

また、ほぼリアルタイムで、Amazon EventBridge→Amazon SNS経由で”ルールが検出された”旨のメールが届きました。
内容を見ると、どのルールを検知したのか、どのContact ARNなのか、どのAgent ARNか等を確認することができます。

{
  "version": "0",
  "id": "cb6b2643-6fe3-7040-0c4b-xxxxxxxxxxxx",
  "detail-type": "Contact Lens Realtime Rules Matched",
  "source": "aws.connect",
  "account": "xxxxxxxxxxxxx",
  "time": "2022-07-28T10:19:11Z",
  "region": "ap-northeast-1",
  "resources": [],
  "detail":
    {
      "ruleName": "waruguchi",
      "actionName": "waruguchi",
      "instanceArn": "arn:aws:connect:ap-northeast-1:xxxxxxxxxxx:instance/957ae315-6f56-4e06-b23b-xxxxxxxxxxxx",
      "contactArn": "arn:aws:connect:ap-northeast-1:xxxxxxxxxxxx:instance/957ae315-6f56-4e06-b23b-xxxxxxxxxxxx/contact/dff1bbe8-a430-47d0-810b-xxxxxxxxxxxx",
      "version": "1.0",
      "agentArn": "arn:aws:connect:ap-northeast-1:xxxxxxxxxxxx:instance/957ae315-6f56-4e06-b23b-xxxxxxxxxxxx/agent/1f5f58b7-4ac0-4f14-8922-xxxxxxxxxxxx",
      "queueArn": "arn:aws:connect:ap-northeast-1:xxxxxxxxxxxx:instance/957ae315-6f56-4e06-b23b-xxxxxxxxxxxx/queue/f510f749-c326-4d5c-a758-xxxxxxxxxxxx",
    },
}

一度ログアウトして、作成したSVユーザーでCCPにログインすると、タスクとして着信されます。

タスクを応答すると、対象のコールの詳細を見れるURLが表示されます。

URLをクリックすると、対象のコールの詳細を見ることができました!
SVが初めにCCPにログインすると問題のあったコールを"タスク”として確認できるのは便利だと感じました。

最後に

Contact Lens for Amazon Connectを利用して、オペレーターがNGワードを言った時の検出方法を検証してみました。
ルールの設定次第で、オペレーターだけでなく、お客様側で何か特定のワードを話した時に検出することも可能です。("解約"等ネガティブワード等を検知するのもいいと思います)
翻訳自体も今は日本語対応しているので、NGワード検出したい方がいましたら試してみたらいかがでしょうか。
Contact Lens for Amazon Connect自体の翻訳の精度を上げたい時は、カスタム語彙を登録してみてください。

ではまた!コンサルティング部の洲崎でした。

参考