GCP Cloud Speech-to-Text APIで音声ファイルの文字起こしをしてみた

#音声文字起こしサービスを利用したいと思った背景
私はよく、会議やセミナーなどの様子をスマホで録音しています。
ですので常々、録音内容を文字に起こしたいと思っていました。
ちょうど最近、機械学習の勉強をし始めたので、勉強がてら自分でサービスを使ってみるか！と思い、取り組んでみました。

#各社サービスの比較
音声の文字起こしは、下記のように、いくつかサービスがあり、どれが良いのかわかりませんでした。

 - Google Cloud Speech API
 - IBM Watson Speech to text
 - Micrsoft Azure Bing Speech API

>[Google,Microsoft,IBM各社のSpeech To Textなサービスの比較をしてみました](https://blog.beyond-inc.jp/?p=194)

上記のサイトで、Googleが一番精度が良さそう、とのことでしたので、とりあえずでGoogleにしてみました。

#料金
> [Cloud Speech-to-Text 料金](https://cloud.google.com/speech-to-text/pricing?hl=ja)

にて確認したところ、下記の通りでしたので、たいした金額では無いので利用することに決めました。

1. 毎月60分までなら無料
2. 60分を越えた場合、データロギングありで、$0.004/15 秒 ***（・・・120分の音声で192円 ※1ドル100円の場合）***


#環境
録音機器

- iPhone SE iOS 13.1.3

PC環境

- Winodws 7 Professional 64 bit
- [curl 7.66.0 for Windows](https://curl.haxx.se/windows/)

#手順
基本的に以下のサイトに書かれている手順に従って行いました。
>[Google Speech API の使い方 日本語音声をテキストに変換してみよう](https://blog.apar.jp/web/8971/#toc1)

ただし、このサイトの手順は、音声ファイルが1分未満の場合の手順です。
1分以上の場合は、変換のリクエスト方法が異なりますので、この際の手順は以下の公式ドキュメントを参考にしました。

>[Cloud Speech-to-Text 長い音声ファイルの文字変換](https://cloud.google.com/speech-to-text/docs/async-recognize?hl=ja)

以下、上記サイトでは書かれていないことを記載します。

###音声ファイルの準備
音源はflac形式のモノラルでなければなりません。
[Online Audio Converter](https://online-audio-converter.com/ja/)で、mp3を変換しました。

###GCPでテキスト変換実施
※下記のファイル名に意味はありません

■１．「sync-request.json」ファイルを作成する

```ruby:qiita.rb
{
  "config": {
      "encoding":"FLAC",
      "languageCode": "ja-JP"
  },
  "audio": {
      "uri":"gs://＜GCP Storage上のバケット名＞/＜音声ファイル名＞.flac"
  }
}
```

■２．「curl_1request.bat」ファイルを作成する

```ruby:qiita.rb
"C:\Program Files\curl-7.66.0-win64-mingw\bin\curl.exe" -X POST ^
     -H "Content-Type: application/json; charset=utf-8" ^
     -d @%1 ^
"https://speech.googleapis.com/v1/speech:longrunningrecognize?key=＜APIキー＞"
pause
```


■３．「sync-request.json」を、「curl_1request.bat」に、ドラッグ＆ドロップする
これでGCPに音声変換のリクエストが実行されます。
成功すると、下記のような内容がコマンドプロンプトに表示されます。

```ruby:qiita.rb
{
  "name": "1234567890123456789"
}
```
ここでの失敗事例は、以下です。

- ファイルが公開設定されていないと、エラーになる
- ファイル名に全角が含まれていると、エラーになる

■４．「curl_2get.bat」ファイルを作成して実行する（手順３を実行してから30秒ほど待ってから）

```ruby:qiita.rb
"C:\Program Files\curl-7.66.0-win64-mingw\bin\curl.exe" -X GET ^
     -H "Content-Type: application/json; charset=utf-8" ^
     "https://speech.googleapis.com/v1/operations/＜nameの値＞?key=＜APIキー＞"
pause
```

５．結果を確認する
下記のような内容が、コマンドプロンプトに表示されます。
（今回試した音声は、歯医者での歯のクリーニング後の医師のコメントで、約2分の音声です）

```ruby:qiita.rb
{
  "name": "＜nameの値＞",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
    "progressPercent": 100,
    "startTime": "2019-11-03T08:46:12.847964Z",
    "lastUpdateTime": "2019-11-03T08:46:50.459029Z"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
    "results": [
      {
        "alternatives": [
          {
            "transcript": "歯ブラシで磨きますただ歯と歯の間に掛けないんで風呂入ってる間を磨いてあげるとゆっくり的には全体に掛けました今そんなにも仕事が大きいわけじゃないですしあんまりははっきり分からないってなると正直多分大丈夫だと思うないと思いますお年賀怪しいとこだったのはここだと見たんですけど親知らずん所ってどうしても磨きづらいんで歯ブラシが届きにくいんでちょっとそれは安いかなと思ったんですけど今だったら無理に削らない方がいいと思いますので歯周病もその進んでるわけじゃないですやっぱりブラッ??ングが大事になってくるんだよはい頑張って磨いてくださいわかりましたでもうめんどくさいと思うんですよ",
            "confidence": 0.9541203
          }
        ]
      },
      {
        "alternatives": [
          {
            "transcript": "できれば夜だけでも使っていただければ100ドルがあるんだよはい極力もシワにならないんですが悪いわけじゃないなお良くなりますよはい今まででも全然問題そこまでの問題があるんで車を降りました",
            "confidence": 0.9357439
          }
        ]
      }
    ]
  }
}
```

#まとめ


 - はっきり言って精度が低くて使えないと思いました（内容、ちゃんとわかりませんよね～？）。
 - 私の場合、もっと正確に文字起こしが必要なので、この精度だと結局音声を聞き直す必要があり、GCPを使う意味がほぼありません、、今後に期待！
 - また、GCPですが、もっと簡単に利用できると思っていたのですが、結構エラーが出て調べたりしました。基本は開発者向けのサービスといった印象を受けました。



#その他の参考サイト
>[Google Cloud Speech API を動かしてみた！](https://qiita.com/basi/items/3623a576b754f738138e)