📝

Cloud Speech-to-TextAPIで自動文字起こし

9 min read

動作環境

  • Catalina ver10.15.7
  • MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)
  • 1.4 GHz クアッドコアIntel Core i5
  • 16 GB 2133 MHz LPDDR3

いろんな記事を見て、自分も実装してみることにした

特段目新しい題材ではないものの、横展開がすごいしやすそうだなーとおもったことから
作成してみることに。ここから翻訳してみようかなとか、マイクだけじゃなくてスピーカーも文字おこししてみようかなとか色々使い道ありそうだしね。
(Googleのドキュメントが死ぬほどわかりにくいのが理由の半分です)

今回のゴール

音声を文字としてターミナルへ出力させる。(最終的にはテキストへの出力)
(チュートリアルまでの確認)

構成図

使用技術

  • Python 3.7.3(Ver3.6.xを推奨します)
  • GCP : Cloud Speech-to-TextAPI

前提条件

  • Pythonがインストールされている(ver3.5~)
  • GoogleAccountを取得している
  • GCPにログイン出来る
    とりあえず、これだけあれば良い。
    なお、本件で使用したリソースは削除済となります。

1. とりあえずPyhton3のインストールしときましょう

あとからGoogle Cloud SDKをインストールする際に必要になりますので、以下のリンクを参考に各OSでインストールして下さい。
Python環境構築ガイド
※Windows環境の方はChocolateyを推しときます。
なお、ChocolateyでPythonをインストールする際は以下のコマンドを使用します。

# Pythonのインストール
$ choco install python
# Version指定時
$ choco install -y python --version=3.7.3
# pipのインストール
$ pip install --upgrade pip

2. pyaudioについてちょっと補足(Windowsでのみ確認)

今回のPythonはver3.7.3で行ったが、Ver3.6までに比べ必要な設定が増えます。
なのでver3.6.xでやるのが吉です。
後述にてpyaudioをインストールする作業が発生する際に以下のファイルが必要になるので、ここでDLしておきましょう。

■なぜこの作業が必要?
pyaudio上で、「portaudio.h」というライブラリが必要になるがこれは完全に独立した、
C言語のライブラリとなっています。portaudio.hについてはこちら
これがWindowsでのPythonのVer3.7~用にビルドされておらず、システムがコンパイルに失敗しているため、インストール時にエラーが発生する。というのが原因になります。
そのため、PythonのVerに応じたビルド済のWindows用バイナリとなるwhlファイルを別途入手する必要があります。
whlファイルを入手し、以下の様にpip install することで要件を満たす事が出来ます。

■PyAudioの依存関係の不具合の解消
Ver3.7以降だとpyaudioのインストール時にverに沿ったwhlファイルをDLする必要があります。そのため、インストール前にこのリンクからwhlファイルをDLして下さい。

■whlファイルの選択の仕方

  1. リンク先に画面遷移したらPyAudioを探し、所定のバージョンを選択します。

  2. バージョンごとのwhlファイルの選択の仕方としては以下のように読み取って選択します。

  3. DL後は現在の作業ディレクトリにwhlファイルを置いて以下のコマンドを実行して下さい。
    (基本的には任意の場所で結構です)

pip install .\PyAudio-0.2.11-cp37-cp37m-win_amd64.whl

3.GCP上でプロジェクトを作成

  1. GCPにログインして、「プロジェクトを作成」を選択します。

  2. プロジェクト名を設定します。(お好きな名前でどうぞ。ここでは「MySpeechApp」 としました。)
    ※場所に関しては「組織なし」のままにしておきます。
    設定したら、作成を押しましょう。

  3. 無事作成されたら作成したプロジェクト名のダッシュボードに画面遷移しているので(してると思います)、左上のナビゲーションメニュー(ハンバーガーメニュー?)から「APIとサービス」→「ダッシュボード」へ移動します。

  4. APIとサービスのダッシュボードへ移動したら「+APIとサービスの有効化」を選択します。

  5. 「APIライブラリ」という画面になり、APIを選択出来る画面になりますので、
    検索バーに Cloud Speech-to-Text APIと入力すれば検索にひっかかります。

  6. APIを選択すると、詳細画面に移ります。ここで「有効にする」を選択します。
    ほどなくして、「概要」の画面に切り替わります。

  7. 「有効化のステータス」が有効 になっていればAPI自体は使える様になっています。
    しかし、画面上に表示されているように認証情報が必要になりますので、「認証情報を作成」
    を選択します。

  8. 「認証情報」画面に切り替わります。ここで使用するAPIを選択します。
    もちろん、Cloud Speech-to-Text APIを選択します。

  9. 次の「App Engine または Compute EngineでこのAPIを使用する予定はありますか?」という選択に対しては、今回の取り組みではインスタンスを使う予定はないので「いいえ、使用していません」を選択し、その下の「必要な認証情報」を選択します。

  10. サービスアカウントを作成します。
    サービスアカウント名を入力(お好きな名前を入力してください)します。自分はここではspeech-apiという名前にしました。
    ※サービスアカウント名を入力すると、「サービスアカウントID」には自動で入力されます。
    その次はロールを選択します。
    ロールに関しては、今回は「オーナー」を選択します。本来は閲覧者や編集者などの権限に沿って設定して下さい。
    キーのタイプは「JSON」を選択し、「次へ」を押すとサービスアカウントが作成され、キーがDL出来ます。
    なお、このJSONファイルは後の作業で使用します。DL後は作業ディレクトリに移動させておきましょう。



  11. 認証情報の画面に切り替わると、サービスアカウントに追加されていることが確認出来ます。
    GCP上で設定する内容はここまでです。

4. Google Cloud SDKのインストール

Google Cloud SDKをインストールします。
WindowsではインストーラーがDL出来るのでそちらの手順に従って設定してください。

※既にインストールされている方はSDKを初期化してください。
初期化の方法は以下を確認して下さい。
Cloud SDK の初期化

パッケージのtarファイルをDL出来たら解凍します。

$ tar -xvf {DLしたtar.gzまでのパス}

例)

$ tar -xvf ./Downloads/google-cloud-sdk-324.0.0-darwin-x86_64.tar.gz

解凍されたらgoogle-cloud-sdkが作成されているため、以下のコマンドでスクリプトを実行する。

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

設定内容としては、
1.) ログイン認証の確認をされる

# ここは「Y」と入力してください
You must log in to continue. Would you like to log in (Y/n)?

2.) ブラウザが勝手に開くので、プロジェクトを作成したGoogleAccountで認証する。
3.) ターミナル(PowerShell,cmd)に、2で選択したアカウントで使用しているプロジェクトが表示されます。番号のプロジェクトを選択すると設定が完了するので、先ほど作成したプロジェクトの番号を選択します。

# この場合は1を入力しています
Pick cloud project to use:
 [1] MySpeechApp-xxxx
 [2] hogehoge-xxxxx
 [3] Create a new project
Please enter numeric choice or text value (must exactly match list
item):  1

5. 仮想環境作成

Pythonを使って開発や実験を行うときは、用途に応じて専用の実行環境を作成し、切り替えて使用するのが一般的です。
主に、システム全体で使うPython環境に影響を与えずにモジュールの追加・入れ替えをしたり、異なるバージョンの Python を使いわけたり、同じモジュールの、複数のバージョンを使い分けたりすることが出来るメリットがあります。

現在のディレクトリでターミナル(コマンドプロンプト、PowerShell)を開いて、以下のコマンドを実行することで仮想環境を用意します。

1.) 仮想環境を作成
■Mac

$ python3 -m venv venv

■Windows

$ python -m venv venv

上記を実行すると現在の作業ディレクトリにvenvというディレクトリが作成されていると思います。このディレクトリが作成されているのを確認できたら次のコマンドを実行します。

2.) 仮想環境に切り替える
■Mac

$ . venv/bin/activate

■Windows

$ .\venv\Scripts\activate

このコマンドを実行すると、ターミナル(コマンドプロンプト、Powershell)上で以下の画像のようになっていると思います。

6. Credentialsを環境変数に設定する

環境変数 GOOGLE_APPLICATION_CREDENTIALS に先程DLしたキー(JSONファイル)迄のファイルパスをセットします。
これは、Cloud SDKでサービスアカウントを使用するには、コードを実行する環境変数を設定する必要があるためです。
環境変数(GOOGLE_APPLICATION_CREDENTIALS)を設定して、アプリケーションコードに認証情報を指定します。
DL後に作業ディレクトリにファイルを移動させていなければこのタイミングで移動させておきましょう。
こちらを参照してください。

作業ディレクトリでターミナル(コマンドプロンプト、Powershell)を開いて以下のコマンドでクリップボードへコピーします。

  • Mac(ターミナル)の場合
$ find $PWD -maxdepth 1 -name "*.json" | pbcopy
  • Windows(Powershell)の場合①
$ (Get-ChildItem .\*.json).FullName | Set-Clipboard
  • Windows(コマンドプロンプト)の場合②
$ for %a in (%CD%\\*.json) do (echo %a) | clip

クリップボードにコピーされているはずなのでそれを以下の手順で環境変数へ設定する。

  • Mac
# 環境変数に設定
# {}は入力不要です。貼り付けの際はダブルクオーテーションで囲って下さい。
$ export GOOGLE_APPLICATION_CREDENTIALS={ここで貼り付け}
# 参考例
$ export GOOGLE_APPLICATION_CREDENTIALS="Users/develop/pyaudio/hogehoge.json"
# 確認(ファイルパスが返ってくればOK)
$ echo $GOOGLE_APPLICATION_CREDENTIALS
  • Windows
# PowerShell を使用する場合:
$ $env:GOOGLE_APPLICATION_CREDENTIALS="{ここで貼り付け}"
# 参考例
$ $env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\develop\pyaudio\hogehoge.json"
# 確認(ファイルパスが返ってくればOK)
$ $env:GOOGLE_APPLICATION_CREDENTIALS
# コマンド プロンプトを使用する場合:
$ set GOOGLE_APPLICATION_CREDENTIALS={DLしたjsonファイルまでのパス}
# 確認(環境変数に設定されているか確認)
$ set

7. パッケージをインストール

必要なパッケージをインストールします。
音声を文字起こしする際に必要なパッケージと、前述のGoogleのAPIを使うためにこちらのパッケージが必要になります。

# pipのインストール
$ pip install --upgrade pip
# パッケージ類
$ pip install google-cloud-speech pyaudio

※WindowsでVer3.7〜で実行する際は前述の設定方法
を参考にして、以下のコマンドを実行して下さい。

pip install .\PyAudio-0.2.11-cp37-cp37m-win_amd64.whl

8. サンプルコードでの実装

音声ストリームでのストリーミング音声認識の実行

9. 出力確認

銀河鉄道の夜

10. hostError/OsError

どうもセキュリティソフトやサウンド・マイクの許可が通っていないとうまく動作しないため、思い当たる方はそこも確認してみてください。

11. さいごに

やっぱり、こういう備忘録的なものは自分で作るにかぎると実感。
なるべく定期的にこういうの書きたいんだけどなぁ。。

Discussion

ログインするとコメントできます