Google Cloud Speech-to-Text API を完全に理解する



## 公式ドキュメント

https://cloud.google.com/speech-to-text/docs

## 対象

・ターミナル、テキストエディタ(vimなど)の扱いができる方

・音声ファイルを自動で書き起こししたい方


## 料金

最初の60minは無料です。
また、音声ファイルから、翻訳された音声の長さに基づいて算出されるそうです。

詳しくは公式ドキュメントをご覧ください。
https://cloud.google.com/speech-to-text/pricing?hl=ja


## 向いている音声

・複数人ではなく、1-2人の音声

・雑音が少なく、はっきりと聞き取れる音声

## 当方の環境

・Mac（catalina 10.15.3）


#事前準備

1 まず、GCPアカウントを作成し、コンソールにログインし、適当なプロジェクトを作成する
→ クレジットなど、支払い情報も登録しておくこと

<img width="474" alt="スクリーンショット 2020-03-29 22.27.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307769/077fc0ca-1931-43d1-69fd-872e26117c13.png">

2 ナビゲージションメニューから、「APIとサービス」を選択しダッシュボードに入ってください。

3 認証情報からAPIキーを作成してください。

<img width="700" alt="スクリーンショット 2020-03-29 22.31.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307769/ac922c07-1187-a9c2-6f3c-dff20111f0e2.png">

4 ナビゲージションメニューから、「storage」に入ってバケットを作成してください。
→ 詳しい方は以下の内容はご自身でお選びください

1. 適当なバケット名をつける
2. ロケーションはmulti-region,asiaにしてください
3. ストレージクラスはstandardにしてください
4. アクセス制御はきめ細かい管理を選択してください
5. 暗号化はgoogleが管理する鍵を選択してください
6. 作成完了

5 作成したバゲットの権限に、名前を allUsers ロールを ストレージオブジェクト管理者 でメンバー追加を行ってください。

<img width="863" alt="スクリーンショット 2020-03-29 22.43.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307769/03322c1e-2b30-d0dd-88ab-e78dafe507f1.png">

6 バケットに音声ファイルをアップロードしてください

＊音声ファイルについて

以下のオーディオコンバーターサイトでお持ちの音声ファイルを、wav形式で詳細設定をサンプルレート16000khzに変換してください。

https://online-audio-converter.com/ja/ 

詳細については[公式ドキュメント](https://cloud.google.com/speech-to-text/docs/basics?hl=ja)を参照ください。flac形式などでもできるそうですが、当方はうまくいかなかったため、wavでご案内しています。詳しい方はご自身で設定くださいませ。

この時点でGCP側の設定が終了になります、音声ファイルは公開状態なので、translate後はバケットから削除してください。

7 ターミナルを開いて、python 3.5以上になっているかご確認ください。なっていない場合は3.5以上に設定してください。詳細はここでは割愛します。

```
python -v
```

6 zipファイルをダウンロードして、任意の場所で展開してください。
→ 公式ではホームディレクトリを推奨しています

7 ターミナルで任意のディレクトリまで移動し、install.shを実行してください

```
./google-cloud-sdk/install.sh
```

実行後、反映のために、ターミナルを再起動してください。

8 SDK初期化を行います

```
gcloud init
```

9 どんどん進めていきましょう

`To continue, you must log in. Would you like to log in (Y/n)? Y`
→ y を入力

`Pick cloud project to use:
     [1] [my-project-1]
     [2] [my-project-2]`
→ 先程作成したプロジェクトを選択してください

これが終了すると、準備完了になります。

次は1分未満の音声ファイルを書き起こしする場合と、1分未満の音声ファイルを書き起こしする場合でやり方が変わるので、それぞれの方法を紹介します。

## サンプルを実行する

1 ターミナルにて以下のコマンドを打ち込む

``` 
gcloud ml speech recognize 'gs://cloud-samples-tests/speech/brooklyn.flac' --language-code='en-US' 
```

2　成功すると以下のレスポンスが返ってきます
* confidenceは信頼度を表し、1に近いほど正確な翻訳を返したことになります。精度が低い場合は音声ファイルを見直すと改善するかもしれません。

```
 {
      "results": [
        {
          "alternatives": [
            {
              "confidence": 0.9840146,
              "transcript": "how old is the Brooklyn Bridge"
            }
          ]
        }
      ]
    }
```

## 1分未満の音声ファイルを書き起こしする場合

日本語の場合（他の言語の場合は公式ドキュメントでご確認ください。）

```
gcloud ml speech recognize 'gs://バケット名/音声ファイル名' --language-code='ja-JP' 
```

## 1分以上の音声ファイルを書き起こしする場合

1 以下のコマンドを打ち込む

```
gcloud ml speech recognize-long-running 'gs://バケット名/音声ファイル名' --language-code='ja-JP' --async
```

* --asyncでgoogle側で非同期処理を行ってくれているので、1分未満の音声ファイルを書き起こしする場合とは違い、すぐに返ってくるレスポンス待ちは行われません。

2 OPERATION_IDが付与されます

```
{
   "name": OPERATION_ID
}
```

3 終わるまで、時間が少しかかるので、以下のコマンドで進行状態を確認します。
→ 30分の音声ファイルで10分くらいだった気がします

```
gcloud ml speech operations describe OPERATION_ID
```

途中だと以下のレスポンスが返されます

```
{
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
    "lastUpdateTime": "2020-03-27T07:49:17.871212Z",
    "progressPercent": 85, //85％完了している
    "startTime": "2020-03-27T07:41:24.492602Z"
  },
  "name": "xxxxxxxxxxxxx"
}
```

完了すると以下のレスポンスが返されます

```
{
  "done": true,
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
    "lastUpdateTime": "2020-03-27T07:51:01.138196Z",
    "progressPercent": 100,
    "startTime": "2020-03-27T07:41:24.492602Z"
  },
  "name": "xxxxxxxxxxxxxxx",
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
    "results": [
      {
        "alternatives": [
          {
            "confidence": 0.93330336,
            "transcript": "ここにtranslateした内容が表示されます"
          }
        ]
      },
```