話者ダイアライゼーション
概要
話者ダイアライゼーションとは
話者ダイアライゼーション(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/v1/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general" \
-F a=@test.wav
話者ダイアライゼーションを有効にするには、以下のようにします。
curl https://acp-api-async.amivoice.com/v1/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 | 1 | 新規話者の出現しやすさ |
diarizerTransitionBias | 0以上1未満 | 1e-150~1e-10 | 1e-40 8kの場合は、1e-20 | 話者の切り替わりやすさ |
1eは10のべき乗を表します。例えば、1e-100はを表します。diarizerAlpha=1e-100
のように設定してください。下記のリクエストサンプルも参考にしてください。
diarizerAlpha
新規話者の出現しやすさを制御するパラメータです。 大きな値を指定するほど新規話者が出現しやすくなり、小さな値を指定するほど新規話者が出現しづらくなります。
diarizerAlpha=0
は特別で、1e0、つまり 1 が指定されたものとして扱われます。何も設定しないとdiarizerAlpha=0
が指定されたことになります。
- 結果の話者の数が実際よりも多すぎる場合は、
diarizerAlpha
をデフォルト(1e0)から、1e-10、1e-20のように減らしてみて改善するかどうかを確認してください。 - 結果の話者の数が実際よりも少なすぎる場合は、
diarizerAlpha
をデフォルト(1e0)から、1e10、1e20のように増やしてみて改善するかどうかを確認してください。
diarizerTransitionBias
話者の切り替わりやすさを制御するパラメータです。 大きな値を指定するほど話者が切り替わりやすくなり、小さな値を指定するほど話者が切り替わりづらくなります。
diarizerTransitionBias=0
は特別で、1e-40 が指定されたものとして扱われます。ただし、8Kz 音声に対応しているエンジン、例えば、汎用エンジン(-a-general
)を利用しサンプリングレートが8kの音声を送信した場合は、1e-20 が指定されたものとして扱われます。何も設定しないとdiarizerTransitionBias=0
が指定されたことになります。
- 実際には同じ人が話し続けているにも関わらず、複数の話者として検出されがちな場合は、
diarizerTransitionBias
をデフォルトから、1e-50、1e-60のように減らしてみて改善するかどうかを確認してください。 - 複数人が話しているにも関わらず、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/v1/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general speakerDiarization=True diarizationMinSpeaker=5 diarizationMaxSpeaker=5" \
-F a=@test.wav
精度向上のヒント
話者ダイアライゼーションの精度を改善するためのヒントです。
話者数の設定
非同期HTTPインタフェースの場合は話者数の指定ができます。可能であれば、音声に含まれる話者の数を事前に設定しておくことで精度を向上させることができます。
音質の改善
話者ダイアライゼーションも音質が悪くなるほど精度が下がる傾向にあります。ノイズやエコーが入らないようにするなど録音環境を改善することで精度を改善できる可能性があります。
複数話者の同時発話を避ける
複数話者が同時に発話すると話者を推定することが難しくなります。アプリケーションの用途によっては難しいですが、利用者が同時に話さないように工夫ができれば精度は改善します。
注意点
複数話者が同時に発話した場合
複数話者が同時に発話しているような区間に対しては、ある単一の話者を推定しないことが正解と考えられますが、いずれかの話者ラベル『speakerN』を返します。
ノイズ
音声ファイルに対して、まず発話かどうかを判断し、発話だと検出された区間に対して、音声認識や話者ダイアライゼーションが行われます。もし発話検出の際、ノイズなどを誤って発話区間だとみなされてしまった場合に対しては、いずれかの話者ラベル『speakerN』を返します。
話者ラベルはリクエストごとに独立
話者ラベルはリクエストごとに独立しています。例えば、ある会議で録音した音声を前半と後半にわけて2回のリクエストを行うと、2つのレスポンスが得られますが、それぞれのレスポンスに含まれる話者ラベルが同じ話者を指すとは限りません。アプリケーションは、異なるリクエストで得られたレスポンスごとに、話者ラベルと話者の対応づけを行ってください。もしくは、ひとつのリクエストになるように音声を送信してください。
制限事項
区別できる最大の人数
話者は、最大20人まで区別できます。
非同期 HTTP の場合
話者ダイアライゼーションを有効にすると、送信できる音声の長さが最大 3 時間となります。それよりも長い音声データを送信すると、リクエスト時にエラーを受け取ることになります。
話者ダイアライゼーションを利用しない場合は、非同期 HTTP インタフェース へ送信できる音声はサイズで制限されており、約 2.14GB の音声データまで送信できます。
サンプルプログラム
AmiVoice APIの非同期HTTPインタフェースにおける話者ダイアライゼーションを使用したWindowsアプリケーションを公開しています。
上記のサンプルアプリケーションの作成方法をAmiVoice Tech Blogで解説しています【HttpClient】C#でAmiVoiceの話者ダイアライゼーションを利用する方法を参照してください。