watsonのspeech to textを使ってみる

# はじめに
最近ライトアカウントが出来たり話題に上がるIBM Cloudの、WatsonのSpeech to Text(STT)を使ってみる。
STTは超絶簡単にまとめるとIBMの音声認識システム。
詳細は[ここ](https://console.bluemix.net/docs/services/speech-to-text/index.html#about)にある。
ただし、英語と格闘する羽目になる。
基本的にcURLでカタカタしてれば良さそうなので、cURLは必須かも。
今回使用しているAPIは全部[ここ](https://www.ibm.com/watson/developercloud/speech-to-text/api/v1/)に載ってる。
ただし、英語と格闘する羽目になる。
※ライトアカウントでSTTよく使えなかったので、今回は普通に課金出来るアカウントでやってます。

# cURL
## カスタム言語モデル作成
簡単に言うとWatsonくんに言葉を覚えさせる機能。
音声認識がいまいちだなと思ったらこいつをカスタマイズしてあげることで音声認識の精度が上がる。

### JSONファイルを作成する(省略可)
カスタムモデルを作成するのに必要な情報をまとめたJSONファイルを作成する。
※文字コードはUTF-8

```JSON
{
    "name":"test"
    , "base_model_name":"ja-JP_BroadbandModel"
    , "description":"テスト用カスタムモデル"
}
```

### 実行方法
**追記(2018/11/21)----**
現在はAPIコールの際にBasic認証からIAM認証に変わったので、掲載されている例はちょっと古いものとなります。
認証方法が変わっただけ(のはず)なので、認証部分だけ下記の様にすれば叩けると思います。  

``` bash
curl -u "apikey:{apikey}" "{url}/{method}"
```

**----追記ここまで**

以下コマンドを実行。
JSONファイルは作成せずコマンドに直書きしても問題なし。
`{ }`で囲まれた箇所は環境に合わせて変更。

```bash
curl -X POST -u "{username}":"{password}" --header "Content-Type: application/json" -d @{作成したJSONファイルまでのパス} "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations"
```

### レスポンス
作成したカスタムモデルのcustomizationIdが返ってくる。

```JSON
{
    "customization_id": "xxxxxxxx",
}
```

## カスタム言語モデル削除
使っていて困ることも無いけど、要らなければ消せる。

### 実行方法
以下コマンドを実行。
`{ }`で囲まれた箇所は環境に合わせて変更。

```bash
curl -X DELETE -u "{username}":"{password}" "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/{customization_id}"
```

### レスポンス
無いので、後述の一覧取得で確認。

## カスタムモデル一覧取得
現在作成されているカスタムモデルの一覧が取得できる。
一覧には名前とかstatusとかcustomization_idとか色々出力される。

### 実行方法
以下コマンドを実行。
`{ }`で囲まれた箇所は環境に合わせて変更。

```bash
curl -X GET -u "{username}":"{password}" "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations"
```

もし、特定のカスタムモデルのみ取得したい場合は以下のように最後にcustomization_idを指定する。

```bash
curl -X GET -u "{username}":"{password}" "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/{customization_id}"
```

### レスポンス
こんな感じで色々返ってくる

```JSON
{"customizations": [
   {
      "owner": "hogehoge",
      "base_model_name": "ja-JP_BroadbandModel",
      "customization_id": "xxxxxxxx",
      "dialect": "ja-JP",
      "versions": ["ja-JP_BroadbandModel.v09-05202016.06202016"],
      "created": "2018-01-11T04:27:32.723Z",
      "name": "test",
      "description": "テスト用カスタムモデル",
      "progress": 0,
      "language": "ja-JP",
      "status": "pending"
   }
]}
```

## カスタムモデルのトレーニング
カスタムモデルにコーパスやcustom_wordを追加した際に必要な機能。
これをやらないとせっかく追加したコーパスとかが働かない。
customization_weightはβ機能。
元々STTに登録されている言葉に比重を置くか、追加したコーパスなどに比重を置くかを指定できる。
ちなみにデフォルトは0.3。1によるほど追加した方に比重を置くことになる。
0.3なのは最も効率よく学習をさせられるため(IBM談)

### 実行方法
以下コマンドを実行。
`{ }`で囲まれた箇所は環境に合わせて変更。

```bash
curl -X POST -u "{username}":"{password}" "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/{customization_id}/train?word_type_to_add={all|user}&customization_weight={0.0～1.0}"
```

### レスポンス
なし。
一覧取得で確認。
終わっていなければstatuがtrainingになる。
終わっていればavailable。

## コーパス登録
Watsonくんに言葉を教えられる便利機能。
これのおかげである分野に特化したSTTを作成できる。

### 実行方法
以下コマンドを実行。
`{ }`で囲まれた箇所は環境に合わせて変更。

```bash
curl -X POST -u "{username}":"{password}" -d @{登録するコーパスファイル} "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/{customization_id}/corpora/{登録する際のコーパス名}"
```

### レスポンス
ないから一覧から確認。

## コーパス削除
いらないコーパスは消せる。

### 実行方法
以下コマンドを実行。
`{ }`で囲まれた箇所は環境に合わせて変更。

```bash
curl -X DELETE -u "{username}":"{password}" "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/{customization_id}/corpora/{corpusname}
```

### レスポンス
ないので一覧から取得

# GUIが良いよ！って人向け
~~一応[Watson API Explorer](https://watson-api-explorer.mybluemix.net/apis/speech-to-text-v1)を使えばWebから各種APIを使える。~~
~~正直ここでやったほうが楽。特別なこだわりが無ければここで良いと思う。~~
**追記：現在(201811/18)はリファレンスに飛ばされ使えないみたいです。**
(一応無いか探したけど、見当たらなかった。)
**追記その２：どうやら認証方式がBasic認証からIAM認証に変わった際に~~置いていかれた~~サービスが終了したらしいです。**

## 注意点
コーパス登録は挙動が怪しい。
API Explorerから「Watsonは、あらゆるデータ形式を理解し、人間と自然なコミュニケーションを取りながら、学習し、推論を根拠とともに提示します。」と言う文章だけのコーパスを登録すると結果は下記の通り。

```JSON
{
  "corpora": [
    {
      "out_of_vocabulary_words": 1,
      "total_words": 165,
      "name": "APICorpus",
      "status": "analyzed"
    }
  ]
}
```

同じ文章をcURLで登録した結果は下記の通り。

```JSON
{
  "corpora": [
    {
      "out_of_vocabulary_words": 0,
      "total_words": 29,
      "name": "testCorpus",
      "status": "analyzed"
    }
  ]
}
```

見て分かる通り、total_wordsの値がかけ離れてます。
total_wordsは登録される単語数の様なものなので、明らかにおかしい気がします・・・

# まとめ
GUIも良いけど、cURLが無難だと思われる。