Google Cloud Speech-to-Text API を gcloud で使う (概要)

# やること

- google のアカウント
- クレジットカードか paypal アカウントなどの支払い方法
- mac l0.15.1

があるという状態から Cloud Speech-to-Text API を gcloud で使う方法についてメモしておきます。gcloiud を使わなくても API は使えますが、最初に試すなら gcloud を使うのが分かりやすい(動かないときにも原因が分かりやす)のと、これができれば他の方法を試すのは難しくない(と思う)ので、gcloud を使う方法をメモっておきます。

# テキスト化のざっくりとした手順

この方法で、音声ファイルをテキスト化をするために必要な手順は以下です。

1. テキスト化したい音声ファイル (flac) を用意する。
2. Google Storage に flac ファイルを置く
3. gcloud コマンドで認識を実行する。

このために、GCP の準備と API の有効化、gcloud のインストール、storage の準備が必要です。これらの準備は、一度やっておけば次からはやらなくて OK です。

# Speech-to-Text の料金

2020/1 現在では、月に 60 分 (音声ファイルの長さの合計) までは無料です。60 分を越えた場合、1分あたり $0.036 です。1 分 4 円くらいでしょうか。無料枠で使う場合でも、カードなどの支払い方法の登録は必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/cbba8ab3-5a31-25a1-afc3-0e7c08890e86.png)

無料枠を越えて使っても何も警告などなく、超過分が課金されます。以前は 1 分以上の長い音声に対しては課金されてた気がするのですが、2020/1 時点ではその制約は無くなったようです。なお、無料枠を越えて使う場合、google にデータの保存を許可する(データロギングあり)にすると、料金が少しやすくなります。

また、この記事で説明している方法で Speech-to-Text を使うには Google Storage を使う必要があります。Storage は US-WEST1、US-CENTRAL1、US-EAST1 のリージョンに限り 1 ヶ月 5GB までは無料で使えますが、それを越えると課金されます。2020/1 時点での料金は以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/8293186c-f5b9-2aad-ec6a-482da62269e4.png)

値段も無料の条件も時々変動するので、それぞれのサイトで確認してください。

- Storage: https://cloud.google.com/storage/pricing?hl=ja
- Speech-to-Text: https://cloud.google.com/speech-to-text/pricing?hl=ja

# 準備

Mac から使う想定です。Windows でもそんなに違わないはず(多分)。音声ファイルは google のストレージに置く前提です。

1. GCP の設定
 1. GCP へのログイン
 2. gcloud をインストールする
 3. Google Speech-to-Text API を有効にする
 4. 必要に応じて Storage の準備をする
2. 音声ファイルの準備
 1. 動画ファイルか音声ファイルを用意する
 2. ffmpeg で flac に変換する
 3. 音声ファイルを Storage に置く
3. 音声認識の実行
 1. gcloud で音声認識を実行する
 2. 取得した json からテキストを取りだす

# GCP の設定

Google Cloud Platform をゼロから使い始める方法については、下記URLの通りでいけます。
- [これから始めるGCP（GCE）　安全に無料枠を使い倒せ](https://qiita.com/Brutus/items/22dfd31a681b67837a74)

上の記事の通りに進めて、プロジェクトを作成します。VM を作成するところ(仮想マシンインスタンスの作成)は飛ばして OK です。以下を、必要に応じてやっておきます。

- 請求アラートの設定
- Google 認証システムのインストール

## gcloud のインストール

認識を実行させる時は、mac のターミナルから gcloud コマンドを使って、googl cloud platform にコマンドを送ります。そのために gcloud コマンドをインストールしておく必要があります。

基本、下記の通りです。(macの場合)。
- https://cloud.google.com/sdk/docs/quickstart-macos?hl=ja

python 2.7 が必要と書かれていますが、python 3.7 でも Cloud Speech-to-Text API は動きました。もし 3.7 とか別のバージョンをインストールしていて、2.7 を入れる必要がある場合は、anaconda などの仮想環境を利用して入れる方法があります。

仮想環境のインストールについては下記が参考になります。

- [mac（winも追加）のanaconda環境でpython2系、３系を両立して切り替えるメモ](https://qiita.com/nnlabo/items/df35ab669598e983546a)

## Google Speech-to-Text API を有効にする

Google Cloud Platform にログインした状態で、上にある検索フォームのところに Speech と入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/0b951d25-66d6-5cf4-09fc-01b08d6443f4.png)

すると、Cloud Speech-to-Text API という項目が出るので、それをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/0257179f-5d81-78a9-7ae9-9099b7638026.png)

こんなページ飛ぶのでに、「有効にする」を押すと、Cloud Platfrom の API のダッシュボードに飛びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/ee55fd64-a0fa-281a-1813-1cc72e9fdcfc.png)

このページで、下の API のリストのところに Speech-to-Text が表示されていれば有効化できています。

ダッシュボードのAPIリストに Speech-to-Text の表示がない場合、有効化されているプロジェクトを選択していないかもしれません。API の有効化はプロジェクトごとにする必要があるようなので、もし今選択しているプロジェクトで API を有効化したければ、ページ下にある「APIの有効化」を押して改めて Speech-to-Text API を有効化します。

## Google Storage の準備をする

認識させたいファイルを置くための storage を準備します。GCP のコンソールを開いて、左のメニューから「Storage」「ブラウザ」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/414f7d2d-8d4e-c9e2-6a9b-be3bd543a848.png)

Storage にパケットを作成します。パケットというのは、パソコンでいうところのボリュームとかドライブ名みたいなものだと思えば、だいたいあってると思います(多分)。

Storage 使いはじめには、ひとつもパケットがないので、ひとつ作成します。「パケット作成」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/fc49d9f4-261f-cf9d-e842-7bdde34f8961.png)

パケットの名前を入れます。パケット名は、他の人が使っているパケット名と重複できません。短い名前だとダメと言われることが多いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/eefc71f2-23f3-8c97-7021-d78450ce74cf.png)

データの保存場所を選びます。特に理由がなければ Region にします。ロケーションについても、特に理由がなければ無料枠のある us-east1, us-west1, us-central1 のどれかにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/96337c9a-5c8c-f355-59cf-c1f7cb069f4e.png)

ストレージクラスを選択します。特に理由がなければ Standard にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/8198255b-06be-8645-3335-2726530170d4.png)

アクセス制御の方法を選びます。特に理由がなければ、均一にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/b925b809-0ef4-4b49-8497-5d20a88efbdb.png)

暗号化については、特に理由がなければ google が管理する鍵にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/1069df1c-7b16-d798-4c43-6875dc925e52.png)

「作成」ボタンを押すと、パケットが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/820ff191-1cd1-e065-3472-0801f52b98e6.png)

これで、ファイルを Google Storage に置けるようになりました。パケットは作成しただけでは課金されません。一方で、ファイルが無料枠を越えて置かれると無言で課金されます。無料枠を越えてファイルを置こうとしても、特に警告とかは出ません。自分でファイルの総量を管理する必要があります。

# 音声ファイルの準備

## 動画ファイルか音声ファイルを用意する

認識させたい音声が入った mp4 とか mp3 などのファイルを用意します。mac の場合、ボイスメモのアプリを使えば録音できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/de942d8c-6391-1c5d-377a-49cda80e9b99.png)

録音した音声ファイルは、下記のディレクトリに置かれるようです。

```
~/Library/Application\ Support/com.apple.voicememos/Recordings/
```

m4a 形式で保存されます。ボイスメモ上で名前を変更しても、ファイル名が日付と時間のままになるため、複数録音したりするとファイルの判別がやや面倒です。録音した時刻を見るか、実際にファイルを再生してみるなどして、中身を確認するしかないようです。

## ffmpeg で flac に変換する

ffmpeg で flac ファイルに変換します。ここでは rec.flac という名前のファイルに変換してます。

```
$ ffmpeg -i ~/Library/Application\ Support/com.apple.voicememos/Recordings/xxxxx.m4a -ac 1 rec.flac
```

オプションで `-ac 1` を指定して、モノラルにしておきます。ステレオの音声だと、認識時にエラーになることがあるようです。

ffmpeg がなければ、インストールします。mac の場合、brew でインストールできます。インストールについては下記をどうぞ。
- [それFFmpegで出来るよ！](https://qiita.com/cha84rakanal/items/e84fe4eb6fbe2ae13fd8)

ファイルの準備はこれで終わりです。wav ファイルでも認識してくれるので、windows などで wav を直接作成した場合は、変換する必要はありません。

なお、音声の長さが 1 分以上になると、以下で書いているのと少し違う操作をする必要があります。

## Google Storage に flac ファイルを置く

Google Cloud Platform のコンソールを開いて、左のメニューから「Storage」「ブラウザ」と選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/897801f8-0399-5f87-663c-8cb97ca935d3.png)

前の手順で作成しておいたパケットを選びます (パケット名をクリック)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/d75d002c-2964-0116-a090-1ac233a3cb3f.png)

「ファイルをアップロード」を押してファイルを選ぶか、Finder からファイルをブラウザ上にドラッグドロップすると、ファイルがパケットに格納されます。

# 音声認識の実行

Speech-to-Text API が有効化されていて、音声ファイル(flac)がパケットにアップロードされている状態で、gcloud で次のコマンドを実行します。

```
$ gcloud ml speech recognize 'gs://<packet_name>/<audio_file>' --language-code='ja-JP'
```

packet_name に音声ファイルを置いたパケット名を入れます。audio_file には音声ファイルの名前 (.flac ファイル) を入れます。たとえば、lchika_storage パケットに置いた rec.flac ファイルを認識させたい場合は、以下のようにします。

```
$ gcloud ml speech recognize 'gs://lchika_storage/rec.flac' --language-code='ja-JP'
{
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.93126744,
          "transcript": "これをまああの四角以外の形でも色々なものが作れるんですけどもま例えばえーとこれはこちらごかけごのものですね作ったりともうちょっと大きな8かけ8のサイズに作ったりすることもできますねもちろん資格ではなくて例えばこういう風な文字のような形をしたような基盤を作ることができます"
        }
      ]
    }
  ]
}
```

リクエストのレスポンスは json で戻ってきます。


## 取得した json からテキストを取りだす

gcloud の結果をファイルに書きだしておけば、json としてプログラムに読みこんで処理できます。

Storage に残った音声ファイルは、他の用途に使わないなら削除しておきます。

# 余談

音声の長さが 1 分以上の場合は、`recognize` のかわりに `recognize-long-running` を使います。

プログラム内から使用する場合は、ライブラリを使用して API をたたけます。C#, Go, Javascript, Python, Ruby, Java, PHP などで使えます。
- https://cloud.google.com/speech-to-text/docs/apis?hl=ja