6. 話者識別

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

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

Step1 : 事前準備

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

  • 参考:話者識別サービスの URI
    • https://apis.mimi.fd.ai/auth/srs/http-api-service
    • https://apis.mimi.fd.ai/auth/srs/websocket-api-service
    • https://apis.mimi.fd.ai/auth/srs/speaker_groups.r
    • https://apis.mimi.fd.ai/auth/srs/speaker_groups.w
    • https://apis.mimi.fd.ai/auth/srs/speakers.r
    • https://apis.mimi.fd.ai/auth/srs/speakers.w
    • https://apis.mimi.fd.ai/auth/srs/speeches.r
    • https://apis.mimi.fd.ai/auth/srs/speeches.w
    • https://apis.mimi.fd.ai/auth/srs/trainers.r
    • https://apis.mimi.fd.ai/auth/srs/trainers.w

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

になります( のような部分には実際の値が入っていることに留意して下さい)、このリソースは常に 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を指定し、その話者に、発話データを登録します。発話音声データは 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分以上の音声を登録することが推奨されます。累計した登録音声長が短い場合、識別精度が悪化します。
登録が完了したら、学習を行います。学習は非同期で実行されるので、学習の開始をリクエス トします。

実行例 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 することで、学習結果情報を得ることができます。

話者識別サービスでは話者グループを識別単位としています。尚、対象話者グループに所属する全ての話者の学習が完了している必要があります。
話者グループに属する話者リストを取得するAPI GET /srs/speaker_groups//speakers を実行し、応答に含まれる全ての話者データで”enabled”:1 となっていることを確認してください。

実行例 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名の話者のうちについては学習が完了していませんので、発話データの登録を行い、学習を実行します。これで、話者識別のための準備は完了です。

[
  {
    "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 : 話者識別の実行

ここで、APIからは離れて、サービス系を利用します。サービス系 URL は別途提供されない限り、service.mimi.fd.ai となります。ここに WebSocket プロトコルで接続します。libmimiio を用いることも出来ます。
実行時には話者グループIDを指定する必要があります。このためには、WebSocket プロトコルでの接続時の HTTPリクエストヘッダーに以下の項目を加えます。

x-mimi-srs-speaker-group-id: <話者グループID>

このリクエストヘッダは、mimi srs を利用する際には必須です。libmimiio を利用している場合、 以下のようにしてヘッダを指定できます。

MIMIIO_HTTP_REQUEST_HEADER h[2]; 
strcpy(h[0].key,"x-mimi-srs-speaker-group-id"); strcpy(h[0].value,"<speakerGroupId>"); size_t header_size = 1;

リクエスト結果は、以下のようになります。

{
  "status": "recog-finished",
  "type": "srs#identification#<speakerGroupId>",
  "response": 
  {
    "speaker": 
    [
      {
        "confidence": 0.98419,
        "speaker_id": "<speakerId1>"
      },
      {
        "confidence": 0.01581, 
        "speaker_id": ""
      }
    ]
  },
  "session_id": "92859ace-aa64-11e6-ae99-42010a8c000 2"
}
					
{ 
  "response" :
  [ 
    { 
      "pronunciation" : "ヨロコビ", 
      "result" : "喜び", "time" : [ 180, 670 ]
    }, 
    { 
      "pronunciation" : "バカリ",
      "result" : "ばかり",
      "time" : [ 670, 1010 ]
    },
    {
      "pronunciation" : "ガ", 
      "result" : "が", 
      "time" : [ 1010, 1180 ] 
    },
    {
      "pronunciation" : "ツズク",
      "result" : "続く", 
      "time" : [ 1180, 1610 ] 
    }, 
    { 
      " pronunciation" : "ト", 
      "result" : "と", 
      "time" : [ 1610, 1720 ]
    },
    {
      "pronunciation" : "ワ", 
      "result" : "は ", 
      "time" : [ 1720, 1860 ]
    },
    {
      "pronunciation" : "カギラ", 
      "result" : "限ら", 
      "time" : [ 1860, 2250 ] 
    },
    {
      "pronunciation" : "ナイ", 
      "result" : "ない", 
      "time" : [ 2250, 2480 ] 
    },
    {
      "pronunciation" : "ノ", 
      "resul t" : "の", 
      "time" : [ 2480, 2600 ]
    }, 
    { 
      "pronunciation" : "ダ", 
      "result" : "だ", 
      "time" : [ 2600, 2860 ] 
    } 
  ], 
  "session_id" : "92859a38-aa64-11e6-a481-42010a8c0007", 
  "status" : "recog-finished",
  "type" : "asr# mimilvcsr"
}

この結果は、type:"srs#identification#" の結果と、type:asr#mimilvcsr の結果が同時に返ってきていることに注意して下さい。前者が話者識別、後者が音声認識の結果となります。話者識別結果の response キーの内容は

"response": {
  "speaker": [
    {"confidence": 0.98419, "speaker_id": ""},
    {"confidence": 0.01581, "speaker_id": ""}
  ]
}

となっており、speaker_id に値が入っている方が、識別された話者IDを示します。confidence はその信頼度を表す [0,1] の値で、1に近いほうが、より信頼度が高いことを示します。
speaker_id に値が入っていない方は、この話者グループに登録されていない話者(非登録話者)であることを示し、常に表示されます。この例では、confidence の値から登録話者であると判断できます。

話者識別サービスではHTTP(S)プロトコルも利用できます。その際は、接続時の HTTPリクエストヘッダーに話者グループIDを追加します。curlでの利用例は以下です。

実行例 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.2

{
  "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 を参照ください。