AzureのBing Speech APIで日本語のSTTを試す
Speech To Textを試してみたかったので
Microsoft Azure のCognitive ServiceにあるBing Speech APIでSpeech Recognitionしてみる。
おおむねこちらのドキュメントを参考にすすめる。
https://www.microsoft.com/cognitive-services/en-us/Speech-api/documentation/API-Reference-REST/BingVoiceRecognition
事前の準備
Cognitive Services accountsでBing Speech API (preview)が使えるサービスを作成する。
認証を行いトークンを取得する
認証のheaderは以下を指定する。
key | value |
---|---|
Content-Length | 0 |
Ocp-Apim-Subscription-Key | さきほど作成したAPIが使えるサービスにある「RESOURCE MANAGEMENT」の「key」 |
検証なので、curlでリクエスト。
curl -v -X POST "https://api.cognitive.microsoft.com/sts/v1.0/issueToken" -H 'Ocp-Apim-Subscription-Key: [key]' -H 'Content-Length: 0'
お返事はこちら
< HTTP/1.1 200 OK
< Cache-Control: no-cache
< Pragma: no-cache
< Content-Length: 667
< Content-Type: application/jwt; charset=us-ascii
< Expires: -1
< X-AspNet-Version: 4.0.30319
< X-Powered-By: ASP.NET
< apim-request-id: xxxxxxxxxxxxx
< Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
< Date: Wed, 15 Feb 2017 09:15:52 GMT
<
* Connection #0 to host api.cognitive.microsoft.com left intact
[ここにbase64の文字列がバーっと出る]
いい感じのJWTが返ってきます。
Speech Recognition APIにwavファイルを投げかける
同僚に喋ってもらっているのをこっそり録音して、いい感じのwavファイルを作る
rec --encoding signed-integer --bits 16 --channels 1 --rate 16000 test.wav
これで準備は万端。
speech recognitionに必要なパラメーターは以下の通り。
key | 内容 | 例 |
---|---|---|
scenarios | ulmかwebsearchと書いてあるが詳細が不明 | ulm |
appid | このAPI固有のIDなので固定値を指定。 | D4D52672-91D7-4C74-8AD8-42B1D98141A5 |
version | APIのバージョン | 3.0 |
format | 返して欲しい形式を指定する | json |
locale | 変換してほしい言語を指定する。 | ja-JP |
device.os | デバイスの情報を記載。公式ドキュメントの例にはXBOXが載っていてすごいぞ。 | iPhone\_OS |
instanceid | インスタンスのUIDをつける | b2c95ede-97eb-4c88-81e4-80f32d6aee54 |
requestid | リクエストのUIDをつける | b2c95ede-97eb-4c88-81e4-80f32d6aee54 |
headerは以下を指定する。
key | value |
---|---|
Content-type | audio/wav; samplerate=16000 |
Authorization | Bearer \[認証で返ってきたjwt\] |
curl -v -X POST "https://speech.platform.bing.com/recognize?scenarios=ulm&appid=D4D52672-91D7-4C74-8AD8-42B1D98141A5&locale=ja-JP&device.os=iPhone_OS&version=3.0&format=json&instanceid=b2c95ede-97eb-4c88-81e4-80f32d6aee54&requestid=b2c95ede-97eb-4c88-81e4-80f32d6aee54" -H 'Host: speech.platform.bing.com' -H 'Authorization: Bearer [jwt]' -H 'Content-type: audio/wav; samplerate=16000' --data-binary @test.wav
このリクエストに対して、返ってきたのはこちら
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
< Content-Type: application/json
(略)
* Connection #0 to host speech.platform.bing.com left intact
{
"version": "3.0",
"header": {
"status": "success",
"scenario": "ulm",
"name": "大きな声でおしゃべりしては何が誘導されてるような希ガス何かこれは何か秘密",
"lexical": "大きな声でおしゃべりしては何が誘導されてるような希ガス何かこれは何か秘密",
"properties": {
"requestid": "89931b12-3b98-47ff-9569-0ee9adf37c53",
"HIGHCONF": "1"
}
},
"results": [
{
"scenario": "ulm",
"name": "大きな声でおしゃべりしては何が誘導されてるような希ガス何かこれは何か秘密",
"lexical": "大きな声でおしゃべりしては何が誘導されてるような希ガス何かこれは何か秘密",
"confidence": "0.7795909",
"properties": {
"HIGHCONF": "1"
}
}
]
}
元の音声は
私「大きな声でおしゃべりしてごらん?」
同僚「何か誘導されているような気がする…何か…これは…何か秘密(を録音されそうなんですけど…)」
なので、そこまで遠くはないですね。
話者を判別して分けたりはできるのかな?
もうひとり別の同僚にご協力いただいて検証したレスポンスは以下の通り。
{
"version": "3.0",
"header": {
"status": "success",
"scenario": "ulm",
"name": "樋口さんはあまり喋らないんですね",
"lexical": "樋口さんはあまり喋らないんですね",
"properties": {
"requestid": "627b5c87-5f26-449c-b600-e660aaa54d5d",
"HIGHCONF": "1"
}
},
"results": [
{
"scenario": "ulm",
"name": "樋口さんはあまり喋らないんですね",
"lexical": "樋口さんはあまり喋らないんですね",
"confidence": "0.7531658",
"properties": {
"HIGHCONF": "1"
}
}
]
}
元の音声データは
同僚「・・・」
私「…樋口さんはあんまりしゃべらないんですね」
という内容だったので完璧です。何かが失敗しましたがrecognitionは完璧です。