WatsonのSTTを試してみた

# IBM Watsonの音声認識をやってみた
いろいろできるというWatsonの音声認識をやってみた。

## 事前準備
Bluemixとの契約。クレジットがある方はクレジットを用意してアカウントを作って下さい。
ここでは既にあるものとして、進めます。   
ログイン後、左のメニューからWatsonを選び「SpeechToText」を選択します。   

* サービス名
Test
* 資格情報名
Credentials-1
* デプロイする地域
米国南部
* 組織の選択
test1
* スペース
develop

として作成をします。作成が完了するとサービス資格情報の先ほどの資格情報名をクリックすると

* url
* username
* password

が表示されるので、メモっておきます。   

## テストデータの実行
まずはLinuxなどのコンソールを用いて接続しテストデータを認識させてみます。
### 接続確認
```
ubuntu@test1:~$ curl -X GET -u "{username}:{password}"  "https://stream.watsonplatform.net/speech-to-text/api/v1/models"
{
   "models": [
      {
         "name": "pt-BR_NarrowbandModel",
         "language": "pt-BR",
         "url": "https://stream.watsonplatform.net/speech-to-text/api/v1/models/pt-BR_NarrowbandModel",
         "rate": 8000,
         "supported_features": {
            "custom_acoustic_model": false,
            "custom_language_model": false,
            "speaker_labels": false
         },
```
OKです。無事に接続できました。
もし社内などでプロキシがある場合はcurlに引数で-xをつけて下さい。

```
ubuntu@test1:~$ curl -X GET -x {proxy_server}:{proxy_port}
-u "{username}:{password}"  "https://stream.watsonplatform.net/speech-to-text/api/v1/models"
```

### データの認識
次に実際にデータを送って認識させてみます。
使用するデータは[ここ](http://aozoraroudoku.jp/index.html)のデータを使ってみました。
watsonが認識できるサンプリング周波数は日本語は16000なので、手元のファイルをそのように変更します。

```bash
ubuntu@test1:~$ ffmpeg -i rd319.mp3  -ar 16000 rd319_16000.mp3
```

本来の認識して欲しい文章は
<pre>
小川 未明 作

海と太陽
海は昼眠る、夜も眠る、
ごうごう、いびきをかいて眠る。
昔、昔、おお昔
海がはじめて、口開けて、
笑ったときに、太陽は、
目をまわして驚いた。
かわいい花や、人たちを、
海がのんでしまおうと、
やさしく光る太陽は、
魔術で、海を眠らした。
海は昼眠る、夜も眠る。
ごうごう、いびきをかいて眠る。
</pre>

これをwatsonで認識させる

```bash
ubuntu@test1:~$ curl -X POST -u "{username}:{password}" --header "Content-Type: audio/mp3" --data-binary "@rd319_16000.mp3" "https://stream.watsonplatform.net/speech-to-text/api/v1/recognize?model=ja-JP_BroadbandModel" | jq '.results[].alternatives[].transcript' -r
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  779k    0  5100  100  774k    184  28705  0:00:27  0:00:27 --:--:--     0
小川 未明 白
海 と 太陽
笑 わ
調べる
夜 も 寝る
黄金 を
いびき を かいて 寝て
昔 昔
大昔
海 が
初めて
開けて 笑った とき に
太陽 は
目 を 回して 驚いた
かわいい 花屋
人たち を
海 が
飲んで しまおう と
やさしく 光る 太陽 は
魔術
海 を 眠ら した
海 は
昼寝 る
夜 も 眠れ
多く の
いびき を かいて 寝て
```
わかりにくいのでjqを使ってテキストだけを抜き出しています。
どうでしょう？何も設定していない状態での認識です。

## プログラムからの実行
ここではpythonでやってみます。

### pythonSDKのインストール
pipでpythonのSDKをインストールします。
詳しい説明は[公式を参照](https://github.com/watson-developer-cloud/python-sdk)

```
ubuntu@test1:~$ pip install --upgrade watson-developer-cloud
```

これで実行すると以下のようになる。

```
ubuntu@test1:~$ python stt1.py  |jq '.results[].alternatives[].transcript' -r
小川 未明 白
海 と 太陽
笑 わ
調べる
夜 も 寝る
黄金 を
いびき を かいて 寝て
昔 昔
大昔
海 が
初めて
開けて 笑った とき に
太陽 は
目 を 回して 驚いた
かわいい 花屋
人たち を
海 が
飲んで しまおう と
やさしく 光る 太陽 は
魔術
海 を 眠ら した
海 は
昼寝 る
夜 も 眠れ
多く の
いびき を かいて 寝て
```


コードは以下の通り

```python:stt1.py

# -*- coding: utf-8 -*-
import json
from os.path import join, dirname
from watson_developer_cloud import SpeechToTextV1

speech_to_text = SpeechToTextV1(
    username='{username}',
    password='{password},
    x_watson_learning_opt_out=False
)

#print(json.dumps(speech_to_text.models(), indent=2))

#print(speech_to_text.get_model('ja-JP_BroadbandModel'))

with open(join(dirname(__file__), 'rd319_16000.mp3'),
          'rb') as audio_file:
    print(json.dumps(speech_to_text.recognize(
        audio_file, content_type='audio/mp3', model='ja-JP_BroadbandModel' , timestamps=True,
        word_confidence=True),ensure_ascii=False,
        indent=2))
```