Azureの音声認識をやってみた

# Azureの音声認識をやってみた
AzureのBing　Speech APIがあるので試したみたのでそれを記述する

## 事前準備
まずは事前準備として、Azureno契約が済んでいることとする。
Azure Portalにアクセスし、左側のメニューから「Cognitive Services」から追加で「Bing Speech API」を選択します。
適当に名前を入れて作成が完了するとキーを確認します。

* Keys
* 
xxxxxxxxx

## テストデータの接続
まずは接続できるか試してみる。

### アクセストークンの取得
まずはアクセス可能なトークンを生成する
先ほどのkeyを元に実行する。

```bash

ubuntu@test1:~/azure/stt$ curl -X POST "https://api.cognitive.microsoft.com/sts/v1.0/issueToken" -H "Content-type: application/x-www-form-urlencoded" -H "Content-Length: 0" -H
 "Ocp-Apim-Subscription-Key: {KEY}"  >token
```

すると戻り値が返ってくるので、その値をアクセストークンとして利用します。
使用するデータは[ここ](https://aacapps.com/lamp/voices)から落としてきました。

```bash
ubuntu@test1:~/azure/stt$ curl  -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&local=en-US" -H "Transfer-Encoding: chunked" -H "Authorization: `cat token`" -H 'Content-type: audio/wav;  samplerate=44100
' --data-binary @brian.wav
{"RecognitionStatus":"Success","DisplayText":"Hi I'm Brian one of the available high quality text to speech voices select download not to install my voice.","Offset":3600000,"Duration":89800000}ubuntu@test1:~/azure/stt$
```
OK。うまく繋がりました。

## 実際のデータの投入
次に実際のデータを投入するが、使用するデータはいつものデータを使う

### 音声データの変換
音声データを認識できる形式のwavに変換する。

```bash
ubuntu@test1:~$ ffmpeg  -i rd319.mp3  -vn -ac 2 -ar 44100 -acodec pcm_s16le -f wav output.wav
```
次にこの音声ファイルを日本語の認識に設定し投げる。

```bash
ubuntu@test1:~/azure/stt$ curl  -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=ja-JP&local=ja-JP" -H "Transfer-Encoding: chunked" -H "Authorization: `cat token`" -H 'Content-type: audio/wav; codec="audio/pcm";  samplerate=44100' --data-binary @output.wav
{"RecognitionStatus":"Success","DisplayText":"小川未明作海外太陽","Offset":29900000,"Duration":45500000}
```
あれ？切れています・・・。
調べてみると、どうやら仕様でMAX15秒までしか通常のRESTでは無理！？
[ここ](https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/bingvoicerecognition#REST_protocol)
* Utterances are limited to a maximum of 15 seconds
ということで、当初のデータを15秒ごとに分割して投げてみる。もし途中で切れてしまったときには仕方ないとあきらめる。

```bash
ffmpeg -i output.wav -t 15 -ss 60 cut5.wav
```
のように区切り、ファイルを分割して認識させると

```bash
ubuntu@test1:~/azure/stt$ curl -X POST "https://api.cognitive.microsoft.com/sts/v1.0/issueToken" -H "Content-type: application/x-www-form-urlencoded" -H "Content-Length: 0" -H  "Ocp-Apim-Subscription-Key: 91928c0892e44ebcb15b3d6e7c8def1c" >token
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   656  100   656    0     0   1035      0 --:--:-- --:--:-- --:--:--  1034
ubuntu@test1:~/azure/stt$ curl  -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=ja-JP&local=ja-JP" -H "Transfer-Encoding: chunked" -H "Authorization: `cat token`" -H 'Content-type: audio/wav;  samplerate=44100' --data-binary @cut1.wav  | jq '.DisplayText' -r
小川未明作海外太陽
ubuntu@test1:~/azure/stt$ curl  -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=ja-JP&local=ja-JP" -H "Transfer-Encoding: chunked" -H "Authorization: `cat token`" -H 'Content-type: audio/wav;  samplerate=44100' --data-binary @cut2.wav  | jq '.DisplayText' -r
五億をいびきをかいて寝る
ubuntu@test1:~/azure/stt$ curl  -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=ja-JP&local=ja-JP" -H "Transfer-Encoding: chunked" -H "Authorization: `cat token`" -H 'Content-type: audio/wav;  samplerate=44100' --data-binary @cut3.wav  | jq '.DisplayText' -r
口開けて笑ったときに
ubuntu@test1:~/azure/stt$ curl  -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=ja-JP&local=ja-JP" -H "Transfer-Encoding: chunked" -H "Authorization: `cat token`" -H 'Content-type: audio/wav;  samplerate=44100' --data-binary @cut4.wav  | jq '.DisplayText' -r
が飲んでしまおうと
ubuntu@test1:~/azure/stt$ curl  -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=ja-JP&local=ja-JP" -H "Transfer-Encoding: chunked" -H "Authorization: `cat token`" -H 'Content-type: audio/wav;  samplerate=44100' --data-binary @cut5.wav  | jq '.DisplayText' -r
恵庭昼寝る夜も寝る
```
見にくいので抜き出します。

```bash
小川未明作海外太陽
五億をいびきをかいて寝る
口開けて笑ったときに
が飲んでしまおうと
恵庭昼寝る夜も寝る
```
本来認識して欲しいもの

```bash
小川 未明 作

海と太陽
海は昼眠る、夜も眠る、
ごうごう、いびきをかいて眠る。
昔、昔、おお昔
海がはじめて、口開けて、
笑ったときに、太陽は、
目をまわして驚いた。
かわいい花や、人たちを、
海がのんでしまおうと、
やさしく光る太陽は、
魔術で、海を眠らした。
海は昼眠る、夜も眠る。
ごうごう、いびきをかいて眠る。
```
欠けています。試しに他のファイルでもやってみましたが、時間が15秒よりも長くても正常に終わる場合とセンテンスで終わるものとがありました。
う～ん。これはちょっと別の方法でやったほうがいいかもしれません。
たぶん、センテンスが長い時間だったら終了したりしてそう。

### プログラムからの実行
いつもはPythonでやっていたので、pythonで・・・と思ったが、Pythonのライブラリが出ていない。
C#、AndroidやJavascriptのWebSocketはあるけど。バッチ用のSDKのI/FがLinuxではなさそう。
ということで一旦終了。