6. 話者識別

mimi SRS のスタートガイドです。 mimi の話者識別サービスを利用できるようになるまでの手順をまとめています。

話者識別は事前に話者の情報と発話データを登録&学習させる必要があります。Step 1 〜 4 では事前学習の手順を、Step 5 では話者識別の実行方法を説明しています。ここでは cURL を利用した話者識別の利用方法を記載していますが、mimi API Console を利用した場合でも話者識別を利用することができます。mimi API Console を利用して話者識別を体験する方法は こちら に記載しています。

Step1 : 事前準備

1. トークンの取得を実行して、アクセストークンを取得してください。この際、話者識別サービスが実行できるようスコープの指定を行い、アクセストークンを払い出すよう注意して下さい。

Step2 : 話者グループの作成

話者のグループを作成した上で、個別の話者を登録します。まずは「MyFamily」というグループを作成してみましょう。descriptionにはグループの説明を記載します。下記では 「最初の話者グループ」という文字列をURLエンコードし、description に引き渡しています。

実行例 2.1

curl -X POST https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speaker_groups \
-d name="MyFamily" \
-d description=%E6%9C%80%E5%88%9D%E3%81%AE%E8%A9%B1%E8%80%85%E3%82%AF%E3%82%99%E3%83%AB%E3%83%BC%E3%83%95%E3%82%9A \
-H "Authorization: Bearer <accessToken>"

応答例 2.1

{
  "operationId": "<operationId>",
  "startTimestamp": 1584937634,
  "selfLink": "https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/operations/<operationId>",
  "progress": 100,
  "code": 200,
  "kind": "srs#operation#speaker",
  "endTimestamp": 1584937634,
  "status": "success",
  "error": "",
  "targetLink": "https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speakers/<speechId>",
  "id": "<speakerGroupId>"
}

最初に話者グループを作成します。返り値はオペレーションリソースです。オペレーション リソースとは、この処理の結果を表現するリソースです。成功していれば HTTP レスポンス コード 200 が返ります。 オペレーションリソースの詳細な解説は省きますが、ここで必要なのは、targetLinkです。 targetLink とは、このオペレーションによって影響を受けたリソースを示す URI です。この例では


https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speaker_group s/d205e98546e8476a8052b5debda8d4a7


になります(<applicationId> のような部分には実際の値が入っていることに留意して下さい)、このリソースは常に GET 可能ですので、処理結果を確認してみます。

実行例 2.2

curl -X GET https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speaker_groups/<speakerGroupId> \
-H "Authorization: Bearer <accessToken>"

応答例 2.2

[
  {
    "id": "<speakerGroupId>",
    "applicationId": "<applicationId>",
    "creationTimestamp": 1584937659,
    "name": "MyFamily",
    "description": "\u6700\u521d\u306e\u8a71\u8005\u30b0\u30eb\u30fc\u30d7",
    "kind": "srs#speaker_group",
    "selfLink": "https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speaker_groups/<speakerGroupId>"
  }
]

このように新規作成された話者グループを確認することが出来ます。リソースの詳細は省略し
ます。

Step3 : 話者の登録と話者グループへの追加

作成した話者グループには話者を登録する必要があります。話者の登録、話者グループへの話者追加は順に行います。まずは、以下を参考にして話者を登録してみましょう。

実行例 3.1

curl -X POST https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speakers \
-F name="father" \
-F lang="ja_JP" \
-F sex="0" \
-F age="50" \
-H "Authorization: Bearer <accessToken>"

応答例 3.1

{
  "operationId": "<operationId>",
  "startTimestamp": 1584938226,
  "selfLink": "https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/operations/<operationId>",
  "progress": 100,
  "code": 200,
  "kind": "srs#operation#speaker",
  "endTimestamp": 1584938226,
  "status": "success",
  "error": "",
  "targetLink": "https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speakers/<speakerId>",
  "id": "<speakerId>"
}

ここでnamelangは必須項目となりますが、sex, ageはオプションです。これらが登録されていることで、話者識別エンジンに対してのヒントとして扱われ、識別精度が向上する場合が あります。 オペレーションリソースが返ることは、話者グループの作成と同様です。これを繰り返して、 何人かの話者を登録してください。 次に、話者を話者グループに所属させます。話者グループIDと話者IDを指定して、以下のように POST リクエストを送ります。話者グループIDは、話者グループリソースの id キーの値、 話者IDは、話者リソースの id キーの値です。もしくは、targetLinkの URI を解析しても得られますが、targetLinkは変わる可能性があるため非推奨です。

実行例 3.2

curl -X POST https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speaker_groups/<speakerGroupId>/speakers/<speakerId> \
-H "Authorization: Bearer <accessToken>" -H "Content-Length:0"

応答例 3.2

{
  "operationId": "<operationId>",
  "startTimestamp": 1584938415,
  "selfLink": "https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/operations/<operationId>",
  "progress": 100,
  "code": 200,
  "kind": "srs#operation#speaker",
  "endTimestamp": 1584938415,
  "status": "success",
  "error": "",
  "targetLink": ""
}

この操作を繰り返して、登録した話者を、最初に作成した話者グループに全員紐付けてください。特定の話者グループに所属している話者リストは、GET /srs/speaker_groups/<speakerGroupId>/speakers によって得られます。

Step4 : 話者への発話データの登録(学習用音声の登録)と学習の実行

話者IDを指定し、その話者に、発話データを登録します。
特定の話者(同一の ID の話者)について発話データの登録を繰り返して、複数の音声をひとりの話者に対して登録することができます(mimi SRS - 概要 - 概念の理解 の図を参照ください)。

発話音声データは raw/pcm, 16kHz,音声の形式は 符号付き整数(16bit リトルエンディアン), 1ch である必要があります。発話音声データは、HTTP リクエストボディに含めて下さい。以下の curl の例では、--data-binary 後に、ローカルファイルシステム上の音声ファイルを指定しています。詳細は curl コマンドについてご確認下さい。

実行例 4.1

curl -X POST https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speakers/<speakerId>/speeches \
--data-binary @/path/to/audio.raw  \
-H "Authorization: Bearer <accessToken>"

応答例 4.1

{
  "operationId": "<operationId>",
  "startTimestamp": 1584938765,
  "selfLink": "https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/operations/<operationId>",
  "progress": 100,
  "code": 200,
  "kind": "srs#operation#speech",
  "endTimestamp": 1584938766,
  "status": "success",
  "error": "",
  "targetLink": "https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speeches/<speechId>",
  "id": "<speechId>"
}

話者識別のためには、累計の音声長で2分以上の音声を登録することが推奨されます。累計した登録音声長が短い場合、識別精度が悪化します。

話者の発話データの登録が完了したら、学習を行います。下記は、学習の curl リクエスト例です。
学習は非同期で実行されるので、学習の開始をリクエストします。

実行例 4.2

curl -X POST https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speakers/<speakerId>/trainer/commit \
-H "Authorization: Bearer <accessToken>" \
-H "Content-Length:0"

応答例 4.2

{
  "operationId": "<operationId>",
  "startTimestamp": 1584938886,
  "selfLink": "https://apis.mimi.fd.ai/v1/applications/<applicatinoId>/clients/<clientId>/operations/<operationId>",
  "progress": 0,
  "code": 202,
  "kind": "srs#operation#trainer",
  "status": "accepted",
  "error": "",
  "targetLink": "https://apis.mimi.fd.ai/v1/applications/<applicatinoId>/clients/<clientId>/srs/speakers/<speakerId>/trainer"
}

ここでは、HTTP レスポンスコード 202(Accepted)が返されることに注意して下さい。targetLinkを GET することで、学習結果情報を得ることができます。

実行例 4.3

curl -X GET https://apis.mimi.fd.ai/v1/applications/<applicationId>/clients/<clientId>/srs/speaker_groups/<speakerGroupId>/speakers \
-H "Authorization: Bearer <accessToken>"

応答例 4.3

応答結果でenabled:1が得られれば、学習完了です。以下の場合、2名の話者のうち<speakerId1>については学習が完了していませんので、発話データの登録を行い、学習を実行します。これで、話者識別のための準備は完了です。

📘

ポイント

話者識別サービスでは話者グループを識別単位としています。
尚、識別を実行するには、対象話者グループに所属する全ての話者の学習が完了している必要があります。

話者グループに属する話者リストを取得する API
GET/srs/speaker_groups/<speakerGroupId>/speakers を実行し、応答に含まれる全ての話者データで"enabled": 1となっていることを確認してください。

[
  {
    "id": "<speakerId1>",
    "creationTimestamp": 1584938226,
    "enabled": 0,
    "name": "father",
    "lang": "ja_JP",
    "sex": 0,
    "age": 50,
    "description": ""
  }
]

[
  {
    "id": "<speakerId2>",
    "creationTimestamp": 1584938226,
    "enabled": 1,
    "name": "mother",
    "lang": "ja_JP",
    "sex": 1,
    "age": 50,
    "description": ""
  }
]

Step5 : 話者識別の実行

Step1 ~ Step4 で準備した内容を使用して、話者識別サービス API を実行します。
話者識別サービスは HTTP(S) プロトコルWebSocket プロトコルをサポートしています。 ここでは curl での HTTP リクエスト例を記載します。

話者識別サービスを利用する際は、HTTP リクエストヘッダーに話者グループ ID を追加します。

実行例 5.1

curl -X POST https://service.mimi.fd.ai \
-H "Content-Type: audio/x-pcm;bit=16;rate=16000;channels=1" \
-H "x-mimi-srs-speaker-group-id: <speakerGroupId>" \
-H "x-mimi-process:srs" \
-H "Authorization: Bearer <accessToken>" \
--data-binary @/path/to/audio.raw

応答例 5.1

response キーに speaker の配列情報があり、各 speaker_id の confidence は話者識別の信頼度を表します。信頼度は 0 から 1 の数値で、1 に近いほうが、より信頼度が高いことを示します。
speaker_id に値が入っていないものは、この話者グループに登録されていない話者(非登録話者)であることを示し、常に表示されます。 以下の応答例では、confidence の値から「登録話者(<speakerId> の指す登録済みの話者)による発話である」という識別結果だと判断できます。

{
  "status": "recog-finished",
  "type": "srs#identification#<speakerGroupId>",
  "response": {
    "speaker": [
      {
        "confidence": 0.9998,
        "speaker_id": "<speakerId>"
      },
      {
        "confidence": 0.0002,
        "speaker_id": ""
      }
    ]
  },
  "session_id": "<sessionId>"
}

話者識別の詳細な情報については mimi SRS のドキュメント および API Reference を参照ください。