Amazon Connectの通話をCOTOHAで音声認識させて通話テキストをSalesforceに自動登録する

# ◆ どんなものを作ったの？？
* Amazonの提供しているクラウド型コンタクトセンター「Amazon Connect」を使うとPBX等を新しく用意することなくコンタクトセンターシステムを構築できます。
    * SalesforceなどのCRMシステムとも簡単に連携ができます。
* 今回は Amazon ConnectとSalesforce、[COTOHA音声認識API](https://api.ce-cotoha.com/contents/)を組み合わせてみました！  

## ○ 仕組み
![amazonconnect_cotoha_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/1e7540f8-dd18-d255-3c61-7f9fd31c15ee.png)

1. ユーザーがコールセンターへ問い合わせを行い、通話データがAmazon S3に保存される  
2. Amazon S3へのデータ保存をトリガーにAWS Lambdaの関数が実行され、AWS Fargate上のコンテナが起動  
3. コンテナ上でプログラムが実行され、通話データが音声認識されてテキストが生成される
4. 認識結果テキストのケース登録処理が実行される  

## ○ 実際の動き
### 1. Salesforce上のCCPで着信する
* Salesforceのサービスコンソールを開いた状態で、カスタマーから着信を受けるとSalesforce上のCCPがポップアップされます。  
![amazonconnect_cotoha_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/c203f6bb-9a38-ba76-ec6a-eb668bd32096.png)

### 2. 通話をする
* カスタマ ⇔ オペレータで通話をします。オペレータはSalesforce画面のまま通話を行うことができます。

### 3. 通話終了後、ケースが自動で作成されている
* 通話終了後しばらくすると、過去の通話に紐づいたケースSalesforceに自動作成されています。  
![amazonconnect_cotoha_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/29cb3e86-3d27-e95e-86b5-8a529f4f3f78.png)

### 4. 通話音声と音声認識結果テキストが確認できる
* 見たいケースをクリックして詳細画面を開くと、通話データとCOTOHAによる音声認識結果をケース内で確認することができます。  
    * 通話データはオペレータとカスタマそれぞれの話した内容で分けて表示されます。  
![amazonconnect_cotoha_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/963112a9-3daa-7ffd-0e13-ee512f038f62.png)

# ◆ 0. 事前準備
## 1. Amazon Connectインスタンスの作成
* 今回はコンタクトセンター基盤としてAmazon Connectを利用するため、Amazon Connectインスタンスの作成が必要になります。（事前にAWSアカウントを登録する必要があります）

### ①Amazon Connectのページにアクセス
* AWSコンソールから「Amazon Connect」と検索し、Amazon Connectのページへアクセス後、「今すぐ始める」ボタンから開始します。
![amazonconnect_cotoha_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/b77093f2-9538-2d03-ab0d-1508dc5974b2.png)

### ②リソースの作成
* URL内に任意の文字列を設定します。
![amazonconnect_cotoha_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/2898fa18-4114-8c3a-c24f-042bd6612ac4.png)

### ③管理者の作成
* 名前・ユーザー名・パスワード等を設定します。
![amazonconnect_cotoha_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/f0094f1c-ba00-ac32-005f-a4373bdf69bb.png)

* しばらく時間が経つとリソース作成が完了します。

## 2. Salesforce Developer環境の準備
* [Salesforce developers](https://developer.salesforce.com/ja/)ページから「サインアップ」へ進みます
* 必要な項目を入力してアカウントを作成します。  
<img width="1183" alt="amazonconnect_cotoha_8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/2d8345ab-5abb-760d-9c65-7240700f73c4.png">

## 3. COTOHA APIの準備
* [COTOHA API ポータル](https://api.ce-cotoha.com/contents/)からアカウントを作成し、ログインします（音声認識APIはfor Enterpriseが必要）
<img width="1151" alt="amazonconnect_cotoha_9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/94e6e9a7-30ef-9a37-b366-1c46d7796c01.png">

    * ログイン後に表示される以下の情報をメモします。  **（不正利用を防ぐためにClient id・Client secret・Domain idは必ず第三者に知られないようにしましょう！！）** 
        * Enterprise API Base URL
        * Enterprise Client id
        * Enterprise Client secret
        * Enterprise ASR Domain id
        * Access Token Publish URL

# ◆ 1. Amazon Connectの設定

## 1. Amazon Connectにログイン
* 使用したいAmazon Connectインスタンスに管理者としてログインします。

## 2. 電話番号の取得
* 「ルーティング」メニューから「電話番号」の設定画面を開き、カスタマーが問い合わせる電話番号を取得します。
    * 「国/地域」はJapanを選択し、好きな電話番号を取得します。  
* 電話番号にかけた時のフローをここで設定できるので、問い合わせフロー作成後に必ず設定します。  
![amazonconnect_cotoha_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/446697ef-c764-1ba9-c97a-331f52c73db9.png)

## 3. オペレーション時間の設定
* 「ルーティング」メニューから「オペレーション時間」の設定画面を開き、問い合わせを受け付ける時間帯を設定します。  
<img width="1012" alt="amazonconnect_cotoha_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/db149ad0-7b8e-23e9-a865-37177e4dde23.png">

## 4. キューの作成
* 「ルーティング」メニューから「キュー」の設定画面を開き、問い合わせを適切なオペレータにルーティングするためにキューを設定します。  
    * 以下の指定箇所のみ指定します。
        * 名前
        * オペレーション時間  
<img width="350" alt="amazonconnect_cotoha_12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/f6c14e57-51e3-3885-1cc8-dc781fe6dc8a.png">

## 5. ルーティングプロファイルの作成
* 「ルーティングプロファイルの名前」「デフォルトのアウトバウンドキュー」に先ほど作成したdemo5のキューを指定します。  
<img width="1019" alt="amazonconnect_cotoha_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/0e38e82b-0dc3-8331-9a45-0886e4a27357.png">

## 6. 問い合わせフローの作成
* 「ルーティング」メニューの「問い合わせフロー」から、コンタクトセンターの業務フローに合わせて問い合わせフローを作成します。
    * 通話音声をCOTOHAで音声認識させるためにS3に通話録音データを保存する必要があるため、「通話記録動作の設定」をフロー始めに必ず挿入します。  
<img width="206" alt="amazonconnect_cotoha_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/197d975c-a4fe-9178-0db0-ef4871098014.png">

* 作成後、あらかじめ取得した電話番号に問い合わせフローを設定します。

## 7. ユーザ管理
* 「ユーザー」メニューの「ユーザー管理」から、名前やルーティングプロファイル、セキュリティプロファイルを作成します。
<img width="1024" alt="amazonconnect_cotoha_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/241d685c-0162-0d37-32fd-f0676f5e8f8e.png">

## 8. CCPにログイン
* 電話ボタン![amazonconnect_cotoha_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/8880f478-68d4-066e-b743-505276b7b147.png)を押してCCPにログインします。
* あらかじめ取得した電話番号に電話をかけることで、相手から電話を受けられるようになりました！

# ◆ 2. Amazon ConnectとSalesforce連携の設定

## 1. Amazon Connect CTI Adapterのインストール
* Salesforce上でAmazon Connectを利用するために、「[Amazon Connect CTI Adapter V2 for Salesforceのインストールと設定手順について](https://dev.classmethod.jp/cloud/aws/tried-to-amazon-connect-cti-adapter-v2-for-salesforce-install-and-setting/)」を参考にAmazon Connect CTI Adapterをインストールします

* Amazon Connect CTI AdapterをインストールするとサービスコンソールからAmazon ConnectのCCPを利用できるようになります  
<img width="400" alt="amazonconnect_cotoha_17_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/85a318ef-f58d-ebbd-1b6d-501928fa8a93.png">

## 2. Amazon Connect Salesforce Lambdaのインストール
* Lambda経由でSalesforceのAPIを使用してケース登録等を行うために「Amazon Connect Salesforce Lambda」を使用します。
    * 接続アプリケーションを作成し、連携に必要な情報（REST APIのコンシューマキーとシークレットキーなど）を取得
        * ※コンシューマキーとシークレットキーは連携アプリケーションを動かすのに必要な情報なので、必ずメモ＆第三者に知られないようにしてください！！
![amazonconnect_cotoha_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/f82a0eb1-0752-8d98-f2c5-2e1acda95d86.png)

    * Lambda用のAPI用ユーザ作成
        * Lambdaの関数がSalesforceのAPIを操作できるように、API用のユーザーを作成します。
![amazonconnect_cotoha_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/25167871-2297-2af7-8540-983f5f63d035.png)

    * [AWS Serverless Application Repository](https://aws.amazon.com/jp/serverless/serverlessrepo/)からSalesforceとLambdaの連携に必要な「Amazon Connect Salesforce Lambda」をインストールします。  
<img width="1018" alt="amazonconnect_cotoha_20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/9e104ac3-732d-205d-74cf-b0969a4c9693.png">

* ※Amazon Connect Salesforce Lambdaのインストールについては以下の記事を参考にさせていただきました
    * [Amazon Connect CTI Adapter: CTI | Contact Center | IVR | ACD | Call Recording](https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000EJH4yUAH)
        * ※AppExchange内の「Setup and Installation Guide」を参照
    * [Amazon Connect CTI Adapter V2 for SalesforceでAmazon Connect Salesforce Lambda packageをインストールして使ってみる](https://dev.classmethod.jp/cloud/aws/how-to-use-amazon-connect-salesforce-lambda-package-with-amazon-connect-cti-adapter-v2-for-salesforce/)

## 3. 音声認識結果格納用の項目をケースオブジェクトに追加
* 設定画面から「オブジェクトマネージャー」を選択します。
* 「ケース」⇒「項目とリレーション」で、音声認識結果のテキストデータを格納する項目を新規作成します。
![amazonconnect_cotoha_21_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/b45c6f31-c8cf-1e7b-c108-2fa03520d455.png)

## 4. Screen Popupのセットアップ
* 「[Amazon Connect CTI Adapter for SalesforceでScreen Popupを試してみる](https://dev.classmethod.jp/cloud/aws/try-screen-popup-with-awsconnect-cti-adapter-for-sfdc/)」を参考にScreenPopupを設定すると、着信時に該当ケースをポップアップ表示させることができます。

# ◆ 3. AWS Fargate上のコンテナに音声認識プログラムを実装

## 1. 通話データの保存先確認
* 通話データの保存先はAmazon Connectインスタンスの「データストレージ」に記載されています  
<img width="213" alt="amazonconnect_cotoha_22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372054/7e207397-5593-e1f0-27e3-8aa5a8d62aed.png">

## 2. Pythonで実装

* 音声認識部分はCOTOHA音声認識APIの[サンプルプログラム（Python）](https://github.com/cotoha-api-group/speech_recognition-python-sample)を参考に作成します。
* Salesforceとの連携部分は[Boto3](https://aws.amazon.com/jp/sdk-for-python/)を使いLambda経由でSalesforceのAPIを利用します。

## 3. Fargateのコンテナにデプロイ
* 作成したプログラムをAWS Fargate上のコンテナに乗せ、Amazon Connectのコールフロー上でS3への通話データの保存をトリガーに実行することで、通話終了後に音声認識結果をSalesforceのケース上に自動登録することができます。

# ◆参考ページ
* [Amazon Connect でコールセンターを作成する。](https://qiita.com/kooohei/items/fec4e677cdfc3d2b35aa)
* [Amazon Connect CTI Adapter V2 for Salesforceのインストールと設定手順について](https://dev.classmethod.jp/cloud/aws/tried-to-amazon-connect-cti-adapter-v2-for-salesforce-install-and-setting/)
* [Amazon Connect CTI Adapter: CTI | Contact Center | IVR | ACD | Call Recording](https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000EJH4yUAH)
    * ※AppExchange内の「Setup and Installation Guide」を参照
* [Amazon Connect CTI Adapter V2 for SalesforceでAmazon Connect Salesforce Lambda packageをインストールして使ってみる](https://dev.classmethod.jp/cloud/aws/how-to-use-amazon-connect-salesforce-lambda-package-with-amazon-connect-cti-adapter-v2-for-salesforce/)
* [Amazon Connect CTI Adapter for SalesforceでScreen Popupを試してみる](https://dev.classmethod.jp/cloud/aws/try-screen-popup-with-awsconnect-cti-adapter-for-sfdc/)
* [音声認識AIに言葉を覚えさせよう!!　(COTOHA音声認識)](https://qiita.com/cotocoto/items/f06ee98e055cb328c151)