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は以下を指定する。

keyvalue
Content-Length0
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内容
scenariosulmかwebsearchと書いてあるが詳細が不明ulm
appidこのAPI固有のIDなので固定値を指定。D4D52672-91D7-4C74-8AD8-42B1D98141A5
versionAPIのバージョン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は以下を指定する。

keyvalue
Content-typeaudio/wav; samplerate=16000
AuthorizationBearer [認証で返ってきた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は完璧です。


Notice: Trying to access array offset on value of type null in /home/users/0/mods.jp-qua/web/denik/wp-content/plugins/amazonjs/amazonjs.php on line 637