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>"
}
ここでname
とlang
は必須項目となりますが、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 を参照ください。
Updated over 2 years ago