Google Cloud Speech-to-Text APIでマイク入力からストリーミング音声認識をする

## はじめに

2018年に以下の記事を投稿しました。

- **[Google Cloud Speech APIのリアルタイム音声認識は使い物になる精度なのか？](https://qiita.com/hamham/items/9b553d0759a2319ea211)**

おかげさまで結構なアクセス数や「いいね」をいただいたのですが、先日**「同じ手順を踏んでもエラーが出て動作しない」**とコメントいただきました。
調べてみたところ、コードでインポートしているライブラリ（grpc-google-cloud-speech-v1beta1）が2019年4月ごろにサポート終了していることが原因なようです。
ということで、マイク入力でストリーミング音声認識を行う方法を再度記事としてまとめました。

## 動作環境

以下の環境で試しています

- Windows 10
- [Python 3.6.8 (64bit)](https://www.python.org/downloads/windows/)
- [Google Cloud SDK](https://cloud.google.com/sdk/docs/quickstart-windows?hl=ja) 

**GCPでプロジェクトを作成したり、gcloudの初期設定をしたり、Pythonのセットアップしたり、必要なパッケージをpipでインストールしたりは、[前述の記事](https://qiita.com/hamham/items/9b553d0759a2319ea211)とほぼ変わりませんので参考にしてください。**

## Speech APIとCloud Speech-to-Textは別物？？
GCPのコンソールから「speech」で検索すると、以下のように3種類のAPIが見つかります。

![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/ed9ad682-d590-407a-ad97-461de7e2f6aa.jpeg)

以前は「Speech API」を使っていたのですが、どうやら現在は非公開になっているようで、「Cloud Speech-to-Text API」に名称も機能も変わっているようです。
今回はこちらを使うのでこれを有効化します。
もう1つの「Cloud Text-to-Speech API」は文字を音声にするAPIなので今回は説明しません。

## 公式のサンプルコードで試す

公式サイトに **[Pythonでストリーミング音声認識するためのサンプルコード](https://cloud.google.com/speech-to-text/docs/streaming-recognize?hl=ja#performing_streaming_speech_recognition_on_an_audio_stream)** があります
まずはこれをコピペして適当な名前（この記事では**transcribe_streaming_mic.py**）と名前をつけてしてローカル（この記事ではCドライブ直下）に保存します。
このままだと英語用になってますので、途中の

```
language_code = 'en-US'
```
となっている部分を

```
language_code = 'ja-JP'
```
と日本語を認識する設定になるように書き換えます。

これでコマンドプロンプトから**streamオプション**をつけて実行してみます。

```:console
c:\>transcribe_streaming_mic.py stream

Traceback (most recent call last):
  File "C:\transcribe_streaming_mic.py", line 7, in <module>
    from google.cloud.speech import enums
ImportError: cannot import name 'enums'
```
enumsがインポートできないというエラーが出てしまいました（汗・・

## speech-v1を使うように変更


pipで**grpc.google.cloud.speech-v1**を追加インストールします。

```
pip install grpc.google.cloud.speech-v1
```

そして、サンプルコードで以下のようにライブラリをインポートしている部分があります。

```
from google.cloud import speech
from google.cloud.speech import enums
from google.cloud.speech import types
```
これを以下のように**speech_v1**をインポートするように書き換えます。

```
from google.cloud import speech_v1 as speech
from google.cloud.speech_v1 import enums
from google.cloud.speech_v1 import types
```

これで準備が整ったので再度実行してます。

```:console
c:\>transcribe_streaming_mic.py stream
（中略）
warnings.warn(_CLOUD_SDK_CREDENTIALS_WARNING)
```

今度は認証のエラーが出てしまいました（汗・・


## サービスアカウントキーの作成

GCPコンソールの「APIとサービス ＞ 認証情報」からサービスアカウントキーを作成します。

![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/7c60bd0e-58af-1f3f-00e1-23e74232c280.jpeg)


サービスアカウントキーに適当な名前（この記事では**speech-to-text**）をつけます。
役割は何が最低限必要かよくわからなかったのですが、Projectの「閲覧者」を与えれば結果的に動作しました。

![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/acbe573f-d20e-a9cd-128c-2ccf3fb1d461.jpeg)


これでjsonファイルを作成します。（この記事では**credential.json**としてCドライブ直下に保存します）

そしてコマンドプロンプトから、環境変数としてこのjsonを指定します。

```
set GOOGLE_APPLICATION_CREDENTIALS=C:\credential.json
```

## 準備完了

こんどこそ準備が整ったので実行します。
PCのマイクに向かって喋ると認識された文字が出てくるはずです。

![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/6233e2e2-12d4-a201-8ad1-c3792b1a3047.jpeg)


## 参考

- [Google Cloud Speech API を使った音声の文字起こし手順](https://qiita.com/knyrc/items/7aab521edfc9bfb06625)
- [Google Cloud Speech-to-Textを使ってマイクから入力した音声にリアルタイムで字幕をつける](https://qiita.com/hotstaff/items/52499d67ee73eb93e7fd)
- [gRPC status codeの一覧](https://qiita.com/Hiraku/items/0549e4cf7079d22b27e8)
- [超初心者でもgoogle-cloud-speechを使えるが、つまずいた所はある。](https://qiita.com/hanlio/items/875b91e0d4931a57e86b)
- [google cloud speech ImportError: cannot import name 'enums'](https://stackoverflow.com/questions/56800281/google-cloud-speech-importerror-cannot-import-name-enums)
- [Google speech to Text api in android status code UNIMPLEMENTED error](https://stackoverflow.com/questions/55444727/google-speech-to-text-api-in-android-status-code-unimplemented-error)