Speech Analysis Framework を使用して音声データを可視化する

このソリューションでは、Google Cloud Platform(GCP)のコンポーネントとコードのコレクションである Speech Analysis Framework について説明します。Speech Analysis Framework を使用すれば、音声を文字変換し、データ パイプライン ワークフローを作成して文字変換した音声ファイルの分析結果を表示して、データを視覚的に表現できます。

このドキュメントには、Google Cloud API の使用方法を示す、Speech Analysis Framework のコード スニペットが含まれています。UI を構築するには、GCP パートナー(システム インテグレーターなど)を使用することをおすすめします。Speech Analysis Framework UI の構築方法やシステム インテグレーターの詳細についてご興味をお持ちの方は、この問い合わせフォームにご入力ください

このソリューションでは、コンタクト センターのユースケースを使ってフレームワークを説明します。コンタクト センターでは、運用上の質問に対する回答を得るうえで、録音した音声のキャプチャと分析が不可欠です。こうした質問には、戦術的な質問(「最も優秀な人間のエージェントは誰か」)と戦略的な質問(「なぜお客様は問い合わせをしているのか」)の両方が含まれます。

このソリューションのサンプルコードでは、フレームワークの使用方法に関するいくつかの要点が示されていますが、このソリューションはチュートリアルではありません。App Engine でホストされているアプリケーションを作成する方法と、ユースケースに合わせてフレームワークをカスタマイズする方法が示されます。このドキュメントで説明されているすべてのコンポーネントは、GCP サービスとして利用できます。あるいは、Contact Center AI ソリューションとしてパートナーを介して利用できます。

問題: 通話量の増加

ほとんどのコンタクト センターでは、お客様からの電話を録音し、後で人間のアナリストが内容を確認しています。しかし、録音する量の多さと手動アプローチに固有のリソース制約の問題から、実際に分析や収集を行えるのは一部のわずかな録音のみです。その結果、より良いカスタマー サービスの提供や顧客満足度の向上、コンタクト センターの対応量削減に役立つ膨大な量のデータが手付かずのままにされています。

これらのコンタクト センターでは、平均待ち時間、平均放棄率、フィードバック調査など、顧客満足度のための重要業績評価指標(KPI)を実装し、全体的なコンタクト センターのパフォーマンスの追跡と改善に取り組んでいます。通常、これらの KPI データはテレフォニー ソフトウェアによって直接提供されるため、音声の文字変換は不要です。

しかし、テレフォニー プロバイダが収集しない指標(通話中の感情など)も、顧客満足度目標の達成に大きな影響を及ぼします。現状では、通話の対応やスコア付けを行ったスタッフが以下のような質問に回答しています。

  • 開始時の通話の感情はどうだったか
  • 通話中には、感情にどのような変化があったか
  • 終了時の通話の感情はどうだったか

このアプローチは面倒で非効率的なうえ、人間のバイアスの影響を受けがちです。

さらに、お客様とやりとりする人間のエージェント用にスクリプトを用意する場合、コンタクト センターはコンプライアンスを徹底する必要があります。エージェントがスクリプトどおりに話していることを確認するため、録音した通話を手作業で確認したり、ライブ セッションに参加したりすることができます。

コンプライアンスは感情と同様にスコアカードの重要な指標ですが、通話量の多さと質の分析に費やせる時間の制限により、残念ながらほとんどの通話のコンプライアンスは分析されていません。

目標: 録音したすべての通話を分析する

コンタクト センターは、バイアスの影響を受けがちで非効率的である手動アプローチの代わりに GCP を使用することで、録音したすべての通話の文字変換と分析を行ってほぼリアルタイムに分析情報を得るという目標を達成できます。こうして得られる分析情報は次のとおりです。

  • 全体的な通話の感情
  • センテンスごとの感情
  • 追跡するエージェント品質指標(無音時間、通話時間、エージェント発話時間、ユーザー発話時間、感情ヒートマップなど)に関する分析情報
  • 文字変換した音声データのキーワードを分析してコールセンターの対応量を削減するための分析情報

このソリューションで示すフレームワークでは、Cloud Speech-to-Text や Cloud Natural Language などの GCP 機械学習(AI Platform)サービスを使用しています。また、データのストリーミングと変換のために Cloud Pub/Sub と Cloud Dataflow を使用しています。こうして完成するアプリケーションは、完全にサーバーレスです。このフレームワークの実装に機械学習の経験は必要ありません。また、ストレージ、スケーリング、セキュリティなどのデータ インフラストラクチャの必要機能はすべて GCP で管理されます。

可視化とレポート

単に文字変換した音声テキストを確認するよりも、録音した音声データを可視化して分析情報を得るほうが簡単です。このソリューションのフレームワークでは、データをユーザーのコンテキストに入れて可視化できます。

たとえば、録音を次のように文字変換することは意味がありますが、話者ごとに文字変換されたテキストを確認できたら便利です。そうすれば、会話を段落ごとに読むのではなく、話者ごとの発話内容を読むことができます。

Agent: Hello. Thank you for calling the Google merchandise store. How can I help you?
Client: Hi. I ordered a pair for Google crew socks last week.
Agent: Okay have they arrived?
Client: Yes, they have but I have two issues.

GCP の AI Platform サービスを使用すると、次のセクションで説明するように、録音データをさまざまな形に可視化できます。

通話録音スコアカード

このフレームワークで生成するトップレベルのスコアカードには、業界の一般的な指標と音声文字変換から得られた指標(通話感情など)が含まれます。無音時間などの指標(タイムスタンプ間の差で計算)では、顧客満足度に関するさらに細かい分析情報を得ることができます。たとえば、無音時間率が高い場合は注意する必要があります。

無音時間を示すスコアカード

ボリューム ベースの通話録音スコアカード

ボリューム ベースのスコアカードを使用すると、フレームワークによって処理された通話の日付フィルタ指標に基づいてビューを作成できます。平均エージェント発話率などの指標では、日付フィルタに基づいて全体的な顧客満足度に関する分析情報を得られます。たとえば、過去 24 時間、過去 1 週間、過去 30 日間の平均エージェント発話率を表示できます。

通話の推移を示すスコアカード

音声文字変換テキストの検索とタグクラウド

自由形式の検索とワードクラウドの組み合わせにより、特定のカテゴリ(「返品」など)またはキーワード(商品名など)を含む会話を簡単に見つけることができます。この機能により、アナリストは季節的な傾向やイベント主導の傾向などをより深く理解できます。

自由形式の検索とワードクラウドのタグの UI

エンティティの抽出

特定のエンティティ(会社、商品、店舗の場所、販売など)に関連する感情を理解すると、傾向を明らかにできます。たとえば、特定の店舗、季節、キャンペーンが多数の苦情に関連付けられているかどうかを知ることができます。

ロケーションを示すエンティティ抽出

ドリルダウン ヒートマップ

通話のタイムライン全体で感情がどのように変動しているか観察し、必要に応じて会話の特定部分をドリルダウンして再生できます。

通話のヒートマップ

フレームワーク: 通話の録音から得られた分析情報を可視化する

このソリューションで提供するフレームワークは、録音から分析情報を得るために、音声ファイルをほぼリアルタイムですばやくデプロイ、処理できるように設計されています。このセクションでは、フレームワークのコンポーネントがどのように連携するかについて説明します。

アーキテクチャの図

次の図は、ワークフローとそのコンポーネントを示しています。 ワークフローのアーキテクチャ

アーキテクチャには、次の GCP コンポーネントが含まれます。

ワークフローを理解する

以下のセクションでは、フレームワークを使用するために必要な手順を大まかに説明します。

録音した音声を保存する

このフレームワークでは、音声ファイルが Cloud Storage バケット内に配置されていることを前提としています。このフレームワーク設計では、音声ファイルをバケットにアップロードしたときに Cloud ファンクションがトリガーされるように構成します。Cloud ファンクションによって音声ファイルがさまざまな API に送信され、処理されます。

音声ファイルをバケットにアップロードするときに、カテゴリ(コンタクト センターから収集した発信者 ID、顧客 ID などの指標)を使用して録音を識別できるカスタム メタデータを追加できます。Cloud Storage オブジェクトにカスタム メタデータを追加するには、x-goog-meta コマンドを -h フラグを付けて実行します。以下はコマンドの例です。[FILENAME] を音声ファイル名に、[BUCKET] を Cloud Storage バケット名にそれぞれ置き換えてください。

gsutil -h x-goog-meta-agentid:55551234 -h cp [FILENAME].flac gs://[BUCKET]

録音した音声を処理する

前述したように、音声ファイルがアップロードされると Cloud ファンクションが呼び出されます(この Cloud ファンクションはすでに存在している必要があります)。たとえば、通知の構成を使用して、ファイルがアップロードされたときに Cloud Speech-to-Text API を使用して音声ファイルを文字変換し、Natural Language API から感情を取得し、Data Loss Prevention API を使用して機密データを秘匿化するプロセスを起動するファンクションをトリガーできます。

exports.helloGCSGeneric = (event, callback) => {
  const file = event.data;
  callback();
};

音声ファイルからデータを収集する

未加工の音声ファイルを Cloud Speech-to-Text API に送信する Cloud ファンクションはレスポンス オブジェクトを返してから、音声文字変換の出力を Natural Language API と Data Loss Prevention API に送信します。これらの API は追加のレスポンス オブジェクトを返します。

次に、3 つの API からのレスポンス オブジェクトが Cloud Pub/Sub に送信され、Cloud Dataflow によって処理されます。API からのレスポンス オブジェクトに加えて、Cloud ファンクションはカスタム メタデータを抽出し、次の JavaScript コードを使用してそのフィールドを Cloud Pub/Sub ペイロードに追加できます。

let strAgentID  = object.metadata.agentid === undefined ? 'undefined' : object.metadata.agentid;

これにより、2 つの異なるデータソースを集約できます。

録音した音声からテキストを抽出する

Cloud Speech-to-Text を使用すると、ニューラル ネットワーク モデルを API で適用して音声をテキストに変換できます。この API は、グローバルなユーザーベースをサポートするために 120 の言語と方言を認識します。音声コマンド コントロールの有効化や、コールセンター音声の文字変換などが可能です。Cloud Speech-to-Text は、リアルタイム ストリーミングまたは事前録音の音声を処理できます。

次のコード スニペットは、長い音声ファイルを処理する方法の例を示しています。ここでは、話者ダイアライゼーション(話者の変更を検出し、音声で検出された個々の声に番号でラベルを付ける機能)を採用しています。

const audioConfig = {
   encoding:"FLAC",
   sampleRateHertz: 44100,
   languageCode: `en-US`,
   enableSpeakerDiarization: true,
   diarizationSpeakerCount: 2,
   enableAutomaticPunctuation: true,
   enableWordTimeOffsets: false,
   useEnhanced: true,
   model: 'phone_call'
 };

 const audioPath = {
   uri: `gs://${object.bucket}/${object.name}`
 };

 const audioRequest = {
   audio: audioPath,
   config: audioConfig,
 };

 return spclient
   .longRunningRecognize(audioRequest)
   .then(data => {
     const operation = data[0];
     return operation.promise();
   })

音声文字変換テキストの機密情報を秘匿化する

Cloud DLP を使用すると、機密データについて理解を深めながら適切に管理できます。機密データの要素(クレジット カード番号、氏名、社会保障番号、米国および一部諸国の身分証明書番号、電話番号、GCP 認証情報など)を、高速かつスケーラブルに分類して秘匿化できます。

Cloud DLP は 90 種以上の定義済み検出項目を使ってこのデータを分類し、パターン、フォーマット、チェックサムを識別します。コンテキストも考慮します。マスキング、セキュア ハッシュ、バケット化、フォーマット保持暗号化などの手法でデータを秘匿化することもできます。

データを分析する

音声ファイルの文字変換、感情分析のキャプチャ、機密データの秘匿化が完了したら、結果を BigQuery に保存して、収集した分析情報を可視化してレポートします。

Cloud Pub/Sub-to-BigQuery テンプレートを使用する

Google 提供のテンプレートを使用すると、レスポンス オブジェクトを読み書きできます。Cloud Pub/Sub-to-BigQuery テンプレートでは、ストリーミング パイプラインが作成されます。Cloud Dataflow は Cloud Pub/Sub トピックから JSON 形式のメッセージを読み取り、BigQuery テーブルに書き込みます。

次のコード スニペットは、gcloud コマンドライン ツールを実行する Cloud Pub/Sub to BigQuery テンプレートの一部を示しています。

gcloud dataflow jobs run [JOB_NAME] \
    --gcs-location gs://dataflow-templates/latest/PubSub_to_BigQuery \
    --parameters \
        inputTopic=projects/[YOUR_PROJECT_ID]/topics/[YOUR_TOPIC_NAME],\
        outputTableSpec=[YOUR_PROJECT_ID]:[YOUR_DATASET].[YOUR_TABLE_NAME]

次の図は、Cloud Dataflow が Cloud Pub/Sub メッセージを読み取り、それらを JSON から tableRow 形式に変換し、最後に BigQuery にレコードを書き込む、完全な Speech Analysis Framework を示しています。

Speech Analysis Framework

話者、通話時間、無音時間を判定する

話者ダイアライゼーション機能と単語タイムスタンプ機能を使用すれば、話者、話者の通話時間、無音時間を判定できます。感情ヒートマップを作成してさらに詳しい情報を入手することも可能です。

コールセンターのリーダーは、通話の進行状況(通話がどのように開始し終了したかなど)を確認できます。視覚的な進行状況に加えて、各四角形でセンテンスごとの感情を確認することもできます。

センテンスごとの感情を細かく把握する

さらにクリックすると、そのセンテンスを読み上げて聴くことができます。

録音した通話の再生

単語タイムスタンプを使用する

Cloud Speech-to-Text では、recognize リクエストのレスポンス テキストにタイム オフセット(タイムスタンプ)値を含めることができます。タイム オフセット値は、提供された音声で認識される各単語の開始時点と終了時点を示します。時間オフセット値は、音声の開始時点からの経過時間を 100 ミリ秒単位で表します。

次のレスポンス オブジェクトのサンプルには、音声文字変換の各単語の startTimeendTime が含まれています。これらの値を使用してカスタム指標を作成し、無音時間や各話者の発言時間を確認できます。スクリプト内でキーワード検索を使用して発話を特定することもできます。

"words": [
          {
            "startTime": "1.300s",
            "endTime": "1.400s",
            "word": "Four"
          },
          {
            "startTime": "1.400s",
            "endTime": "1.600s",
            "word": "score"
          },
          ...
        ]

テキストの単語タイムスタンプを収集したら、次のようなスコアカードを作成できます。

通話のスコアカード

異なる話者の識別(話者ダイアライゼーション)

Cloud Speech-to-Text の話者ダイアライゼーションを使用すると、同じ音声クリップ内の複数の話者を認識できます。音声文字変換リクエストを Cloud Speech-to-Text に送信するときに、音声サンプル内の異なる話者を識別するように指示するパラメータを指定できます。

Cloud Speech-to-Text は話者の変更を検出し、音声で検出した個々の声に番号でラベルを付けます。音声文字変換の結果に含めることができる話者の最大数は、Cloud Speech-to-Text が音声サンプル内で一意に特定可能な話者の数です。

次のコード スニペットは、話者ダイアライゼーションを有効にする方法の例を示しています。

const config = {
  encoding: `LINEAR16`,
  sampleRateHertz: 8000,
  languageCode: `en-US`,
  enableSpeakerDiarization: true,
  diarizationSpeakerCount: 2,
  model: `phone_call`
};

次に、話者の音声文字変換テキストを作成します。

Agent: Hello. Thank you for calling the Google merchandise store. How can I help you?
Client: Hi. I ordered a pair for Google crew socks last week.
Agent: Okay have they arrived?
Client: Yes, they have but I have two issues.

会話から感情を抽出する

Natural Language を使用すると、ソーシャル メディア上の商品に関する感情を理解したり、コールセンターやメッセージング アプリでお客様の会話から意図を分析したりできます。

全体的な音声文字変換内の感情、センテンスごとの感情、エンティティを抽出できます。文字変換された音声ファイルでこれらのデータが利用可能であれば、ヒートマップと感情のタイムラインを作成できます。ワードクラウドを作成することもできます。

次の例は、センテンスごとの感情をキャプチャするためのコード スニペットを示しています。

client
     .analyzeSentiment({document: document})
     .then(results => {

       const sentences = results[0].sentences;
       sentences.forEach(sentence => {
         pubSubObj.sentences.push({
           'sentence': sentence.text.content,
           'score': sentence.sentiment.score,
           'magnitude': sentence.sentiment.magnitude
         })
      });

このソリューションで説明しているフレームワークでは、ユーザーは音声文字変換テキスト内のキーワードを検索できます。

以下の画像は、フレームワークで作成されたワードクラウドの可視化を示しています。ワードクラウドには、音声ファイルから抽出された一般的な単語が含まれます。データをテキスト マイニングするための効果的な方法として、これらの用語を検索できます。

ワードクラウド

感情ヒートマップを作成する

このフレームワーク コードでは、Google Cloud API からの豊富なレスポンス オブジェクトを利用できるため、ユーザーがクリックして利用できる可視化を生成できます。このコードには、Express.js で構築され、BigQuery Node.js SDK を使用して SQL ステートメントを実行してデータを取得する API が含まれています。ユーザーがこの可視化をクリックすると、それに応答して SQL コマンドが呼び出されます。

次のサンプルクエリは、ネストされている繰り返しフィールドとして現在格納されている音声文字変換テキスト内のすべての単語を検索します。このクエリ ステートメントは BigQuery SDK を使用して実行され、関連レコードからすべての単語を取得します。

const sqlQueryCallLogsWords = `SELECT
  ARRAY(SELECT AS STRUCT word, startSecs, endSecs FROM UNNEST(words)) words
  FROM \`` + bigqueryDatasetTable + `\`
  where fileid = \'` + queryFileId + `\'`

SQL ステートメントが実行された後、レスポンスが UI に送信されます。

res.status(200).send({words:wordsArray});

フレームワークは複数の SQL ステートメントを使用して、BigQuery からデータを取得します。たとえば、次の表に示すように、配列を含む 2 つのオブジェクトを使用してヒートマップを作成します。

オブジェクト名 内容
sentences

{sentence:sentenceString, sentiment: sentimentValue}
words

{words:wordsArray}

これら 2 つのオブジェクトを使用すると、音声を再生するセンテンスの開始時間のマッピングを作成し、センテンスの感情を視覚的に表現して、センテンスを表示できます。

ユーザーがヒートマップ上の四角形をクリックすると、onSeekChange 関数が次のコードを使用して呼び出されます。

this.onSeekChange(parseFloat(0))
onSeekChange = (value) => {
   this.player.seekTo(value);
   let currentPlayerTime = this.player.getCurrentTime()
 }

ユーザーがクリックしたセンテンスから startTime 値を取得します。次のようなマッピングで示されます。

{sentence:sentenceString, sentiment: sentimentValue, start: startTime}

センテンスを結合してからそれらを配列に分割することによって、センテンスの startTime を取得します。次に、センテンス内の最初の単語と分割した配列を照合して startTime 値を見つけます。これにより、再生する音声ファイルの開始時刻にユーザーを誘導できます。

2 つの API を組み合わせることで、次の感情タイムラインのような可視化を生成できます。

感情タイムラインの可視化

次のステップ