話者ダイアライゼーション
概要
話者ダイアライゼーションとは
話者ダイアライゼーション(Speaker Diarization)は、複数人が話している音声において『どの部分を誰が話しているのか』を推定する機能のことです。 たとえば、複数人が参加している会議を1台のマイクで録音したとき、発言毎に話者を区別するのに役立ちます。
以下の図は、田中さんと山田さんが会議で話している様子を1つのマイクで録音した例です。この音声には、2人の発言がひとつのトラックに記録されています。
AmiVoice APIの話者ダイアライゼーション機能を使うと、以下の図のように「この区間は『speaker0』の発言」、「この区間は別の話者である『speaker1』の発言」といった具合に、各発言を話者ごとに区別できます。
この機能は個人を特定するものではありません。そのため『speaker0』が山田さんに、『speaker1』が田中さんに相当するということはアプリケーション側で取り扱う必要があります。
APIについて
話者ダイアライゼーションを使うには、音声認識のリクエスト時にオプションパラメータを指定します。話者ダイアライゼーションの結果は単語単位で得られます。音声認識レスポンスの中の単語単位の結果にlabelが追加され、『speaker0』や『speaker1』のような話者を区別するためのラベルが設定されます。
話者ダイアライゼーションの結果の例:
"tokens": [
{
"written": "アドバンスト・メディア",
"confidence": 1,
"starttime": 522,
"endtime": 1578,
"spoken": "あどばんすとめでぃあ",
"label": "speaker0"
},
{
"written": "は",
"confidence": 1,
"starttime": 1578,
"endtime": 1834,
"spoken": "は",
"label": "speaker0"
},
{
"written": "、",
"confidence": 0.95,
"starttime": 1834,
"endtime": 2010,
"spoken": "_",
"label": "speaker0"
},
/* 以下、省略 */
利用方法
話者ダイアライゼーションを使うには、音声認識のリクエスト時に以下の表にあるリクエストパラメータを設定します。
表. 話者ダイアライゼーションのリクエストパラメータ
| インタフェース | 有効にするためのパラメータ | 調整のためのパラメータ |
|---|---|---|
| 同期 HTTP / WebSocket | segmenterPropertiesにuseDiarizer=1を設定 | segmenterPropertiesのdiarizerTransitionBias、diarizerAlpha |
| 非同期 HTTP | speakerDiarization=Trueを設定 | diarizationMinSpeaker、diarizationMaxSpeaker |
リクエスト時に指定するオプションパラメータは、インタフェースによって異なりますので注意してください。得られる結果はインタフェースによらず同じフォーマットです。
リクエストパラメータが異なっているのは、同期 HTTP や WebSocket インタフェースと、非同期 HTTP インタフェースとでは話者ダイアライゼーションの手法が異なっているからです。同期 HTTP や WebSocket インタフェースでは、音声ストリームに対して発話区間を検出する際に話者ダイアライゼーションを行います。そのため、発話区間検出のパラメータであるsegmenterPropertiesに対する設定を行います。
一方、非同期 HTTP インタフェースの場合は、音声ファイル全体が手元にある状態で話者ダイアライゼーションを行います。設定は、非同期 HTTP 固有のパラメータで行います。
このセクションでは、まずは話者ダイアライゼーションを有効にする方法をインタフェースごとに説明し、その後に精度を改善するためのパラメータについて説明します。
リクエスト
話者ダイアライゼーションを有効にして、リクエストする方法をインタフェースごとに説明します。
同期 HTTP インタフェース
話者ダイアライゼー ションを有効にするには、segmenterPropertiesにuseDiarizer=1を設定します。 同期 HTTP では、segmenterPropertiesは、リクエストパラメータのdパラメータに設定します。
例を使って説明します。話者ダイアライゼーションを利用しない場合、AmiVoice API のサンプルプログラムに同梱している音声を curl コマンドを使って汎用エンジンで音声認識する場合は以下のようにコマンドを実行します。
curl https://acp-api.amivoice.com/v1/recognize \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general" \
-F a=@test.wav
話者ダ イアライゼーションを有効にするには、以下のようにします。
curl https://acp-api.amivoice.com/v1/recognize \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general segmenterProperties=useDiarizer=1" \
-F a=@test.wav
このとき、パラメータの順序は重要ではありません。また、他のパラメータも合わせて設定できます。同期 HTTP インタフェースのリクエスト方法の詳細は、音声認識のリクエストの送信を参照してください。
WebSocket インタフェース
話者ダイアライゼーションを有効にするには、segmenterPropertiesにuseDiarizer=1を設定します。WebSocket インタフェースでは、segmenterPropertiesは、WebSocketで接続した後、はじめに送信するsコマンドに設定します。
例を使って説明します。話者ダイアライゼーションを利用しない場合、汎用エンジンで音声認識するには以下のようにリクエストを行います。
s 16K -a-general authorization={APPKEY}
話者ダイアライゼーションを有効にするには、以下のようにパラメータを追加します。
s 16K -a-general authorization={APPKEY} segmenterProperties=useDiarizer=1
sコマンドは、音声フォーマット、エンジン名を必ず設定する必要がありますが、それに続くパラメータの順番は変更しても構いません。また、他のパラメータも合わせて設定できます。WebSocket インターフェースを使ったリクエストの方法については、認識要求の開始を参照してください。
非同期 HTTP インタフェース
話者ダイアライゼーションを有効にするには、リクエストパラメータのdパラメータにspeakerDiarization=Trueを追加します。
例を使って説明します。話者ダイアライゼーショ ンを利用しない場合、AmiVoice API のサンプルプログラムに同梱している音声を curl コマンドを使って汎用エンジンで音声認識する場合は以下のようにコマンドを実行します。
curl https://acp-api-async.amivoice.com/v2/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general" \
-F a=@test.wav
話者ダイアライゼーションを有効にするには、以下のようにします。
curl https://acp-api-async.amivoice.com/v2/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general speakerDiarization=True" \
-F a=@test.wav
このとき、パラメータの順序は重要ではありません。また、他のパラメータも合わせて設定できます。非同期 HTTP インタフェースのリクエスト方法については、1. 音声認識ジョブを作成するを参照してください。
レスポンス
話者ダイアライゼーションを有効にしたときのレスポンスについて説明します。
話者ダイアライゼーションの結果は、単語単位 の結果であるtokenにlabelとして得られます。labelは、speaker0、speaker1、speaker2 ... speakerN のようにspeakerに続けた番号で話者を区別する文字列です。
話者ラベルの番号は欠番することもあります。例えば、3話者のラベルとして、speaker0, speaker1, speaker3のように出力されることがあります。番号が0から順に現れることを前提とはしないでください。
話者ダイアライゼーションの結果の例:
"tokens": [
{
"written": "アドバンスト・メディア",
"confidence": 1,
"starttime": 522,
"endtime": 1578,
"spoken": "あどばんすとめでぃあ",
"label": "speaker0"
},
{
"written": "は",
"confidence": 1,
"starttime": 1578,
"endtime": 1834,
"spoken": "は",
"label": "speaker0"
},
{
"written": "、",
"confidence": 0.95,
"starttime": 1834,
"endtime": 2010,
"spoken": "_",
"label": "speaker0"
},
/* 以下、省略 */
音声認識の結果のフォーマットについては、音声認識の結果を参照してください。
話者ダイアライゼーションを有効にするとレスポンスに時間がかかる場合があります。話者ラベルを利用しない場合は、無効にしておいてください。
精度を向上させるための調整パラメータ
話者ダイアライゼーションの結果を調整するためのパラメータを説明します。前述の「表.話者ダイアライゼーションのリクエストパラメータ」にまとめたように、インタフェースによって調整できるパラメータが異なっています。
話者検出のされやすさの調整
同期 HTTP と WebSocket インタフェースを利用している場合は、segmenterPropertiesプロパティの2つのパラメータを使って話者検出のされやすさを調整できます。
| パラメータ | 指定可能な値 | 目安となる範囲 | デフォルト値 | 説明 |
|---|---|---|---|---|
diarizerAlpha | 0以上 | 1e-100~1e50 | 1e-30 8kの場合は、1e-10 | 新規話者の出現しやすさ |
diarizerTransitionBias | 0以上1未満 | 1e-150~1e-10 | 1e-20 | 話者の切り替わりやすさ |
1eは10のべき乗を表します。例えば、1e-100はを表します。diarizerAlpha=1e-100のように設定してください。下記のリクエストサンプルも参考にしてください。
diarizerAlpha
新規話者の出現しやすさを制御するパラメータです。 大きな値を指定するほど新規話者が出現しやすくなり、小さな値を指定するほど新規話者が出現しづらくなります。
diarizerAlpha=0は特別で、1e-30 が指定されたものとして扱われます。ただし、8kHz 音声に対応しているエンジン、例えば、汎用エンジン(-a-general)を利用しサンプリングレートが 8k の音声を送信した場合は、1e-10 が指定されたものとして扱われます。何も設定しないとdiarizerAlpha=0が指定されたことになります。
- 結果の話者の数が実際よりも多すぎる場合は、
diarizerAlphaをデフォルトから、1e-40、1e-50 のように減らしてみて改善するかどうかを確認してください。 - 結果の話者の数が実際よりも少なすぎる場合は、
diarizerAlphaをデフォルトから、1e10、1e20 のように増やしてみて改善するかどうかを確認してください。
diarizerTransitionBias
話者の切り替わりやすさを制御するパラメータです。 大きな値を指定するほど話者が切り替わりやすくなり、小さな値を指定するほど話者が切り替わりづらくなります。
diarizerTransitionBias=0は特別で、1e-20 が指定されたものとして扱われます。何も設定しないとdiarizerTransitionBias=0が指定されたことになります。
- 実際には同じ人が話し続けているにも関わらず、複数の話者として検出されがちな場合は、
diarizerTransitionBiasをデフォルトから、1e-30、1e-40 のように減らしてみて改善するかどうかを確認してください。 - 複数人が話しているにも関わらず、1名の話者が続く場合は、
diarizerTransitionBiasをデフォルトから、1e-10 のように増やしてみて改善するかどうかを確認してください。
設定例
話者ダイアライゼーションを有効にし、diarizerAlphaに1e-20、diarizerTransitionBiasに1e-10を設定したときの例です。segmenterPropertiesに複数のパラメータを設定することになるので、それぞれのパラメータは半角スペースで区切ります。
curl コマンドを使用した同期 HTTP インタフェースの設定例
curl https://acp-api.amivoice.com/v1/recognize \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general segmenterProperties=useDiarizer=1%20diarizerAlpha=1e-20%20diarizerTransitionBias=1e-10" \
-F a=@test.wav
segmenterPropertiesに設定したパラメータの半角スペースを%20にURLエンコードします。
WebSocket インタフェースの設定例
s 16K -a-general authorization={APPKEY} segmenterProperties="useDiarizer=1 diarizerAlpha=1e-20 diarizerTransitionBias=1e-10"
segmenterPropertiesに設定したパラメータ全体を"..."のようにダブルクォートでは囲みます。
話者数の指定
非同期 HTTP インタフェースを利用している場合は、音声に含まれる話者の数の範囲を絞ることで、話者ダイアライゼーションの精度を改善できます。
| パラメータ | 指定可能な値 | デフォルト値 | 説明 |
|---|---|---|---|
diarizationMinSpeaker | 1~20 | 1 | 想定される最小の話者数 |
diarizationMaxSpeaker | 1~20 | 10 | 想定される最大の話者数 |
diarizationMinSpeaker
音声に含まれると想定される最小の人数です。
diarizationMaxSpeaker
音声に含まれると想定される最大の人数です。
もし、音声に含まれる話者の数が事前に分かる場合、正確に設定しておくことで推定の精度をかなり向上させることができます。例えば、これから開始する会議に参加する人数が5名だと分かっているのであれば、リクエスト時のdパラメータにdiarizationMinSpeaker=5とdiarizationMaxSpeaker=5を追加します。
設定例
話者ダイアライゼーションを有効にし、diarizationMinSpeakerとdiarizationMaxSpeakerを5に設定したときの例です。
curl コマンドを使用した非同期 HTTP インタフェースの設定例
curl https://acp-api-async.amivoice.com/v2/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general speakerDiarization=True diarizationMinSpeaker=5 diarizationMaxSpeaker=5" \
-F a=@test.wav
精度向上のヒント
話者ダイアライゼーションの精度を改善するためのヒントです。
話者数の設定
非同期HTTPインタフェースの場合は話者数の指定ができます。可能であれば、音声に含まれる話者の数を事前に設定しておくことで精度を向上させることができます。