These docs are for v1.0.19. Click to read the latest docs for v1.0.28.

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


Did this page help you?