こんにちは、エンジニアのオオバです。

GitHub - mogeta/calm_down
上記、同僚がLTでCloud Speech-to-Textを使ったマイクロサービスを作っていたので、ぼくも触ってみようということで、触ってみたという記事です。

Speech-to-Text: 自動音声認識  |  Google Cloud
ちなみにCloud Speech-to-Textとは、Google製のAI テクノロジーを搭載したAPIで、音声をテキストに変換してくれるクラウドサービスです。

→11万文字で徹底解説した「DOTweenの教科書」Unityアニメーションの超効率化ツールはこちら

公式ドキュメントに従っていく

クイックスタート: クライアント ライブラリの使用  |  Cloud Speech-to-Text ドキュメント  |  Google Cloud
基本的にはこちらのページのSpeech-to-Textの公式ドキュメントに従っていきます。
今回は「TestCloudSpeechApp」という新規プロジェクトを作成します。

プロジェクトの作成と設定

ドキュメントの通り以下の作業をします

  1. プロジェクトの作成
  2. サービス アカウントの作成
  3. 秘密鍵のダウンロード
  4. プロジェクトに対して Cloud Speech-to-Text API を有効にする

GoogleCloud Speech-to-TextをGoで触ってみる_0

プロジェクトの設定ボタンをクリックします。

Configure a billing accountという警告

GoogleCloud Speech-to-TextをGoで触ってみる_1

警告内容に従い、課金アカウントを作成するため 「CONTINUE」ボタンをクリックします。

GoogleCloud Speech-to-TextをGoで触ってみる_2

案内に従っていき、無料トライアルを開始します。

GoogleCloud Speech-to-TextをGoで触ってみる_3

すると1年間有効の300ドルが付与されます。

GoogleCloud Speech-to-TextをGoで触ってみる_4

請求先アカウントを作成をクリックします。
おそらくこの工程が2. サービス アカウントの作成です。

GoogleCloud Speech-to-TextをGoで触ってみる_5

このような画面になるので、 DOWNLOAD PRIVATE KEY AS JSONをクリックして秘密鍵のJSONをダウンロードしておきます。
この工程が3. 秘密鍵のダウンロードです。

GoogleCloud Speech-to-TextをGoで触ってみる_6

そして先程作成したプロジェクトのCloud Speech-to-Text APIを有効化します。NEXTボタンをクリック。
この工程が4. プロジェクトに対して Cloud Speech-to-Text API を有効にするにあたります。

GoogleCloud Speech-to-TextをGoで触ってみる_7

準備が完了しました。

環境変数 GOOGLE_APPLICATION_CREDENTIALS を、サービス アカウント キーが含まれる JSON ファイルのパスに設定します。この変数は現在のシェル セッションにのみ適用されるため、新しいセッションを開く場合は、変数を再度設定してください。

.bashrcや.bash_profileなどに

export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"  

という一行を追加してパスを通します。
"[PATH]"には先程ダウンロードした秘密鍵のJSONまでのパスを記述します。

一旦ここまでがプロジェクトの設定です。引き続き公式ドキュメントに沿って作業します。

Cloud SDKのインストールと初期化

Cloud SDK のドキュメント  |  Google Cloud
こちらのドキュメントに従います。

GoogleCloud Speech-to-TextをGoで触ってみる_8

まずは、SDKをダウンロードしてきます。

インストールのシェルを実行。

sh install.sh  

GoogleCloud Speech-to-TextをGoで触ってみる_9

アップデートしてよいかと問われたので、アップデートを選択。

GoogleCloud Speech-to-TextをGoで触ってみる_10

既存設定をいじりたくなかったので(というか忘れているので)、新規で設定を作ることを選択。

GoogleCloud Speech-to-TextをGoで触ってみる_11

設定名を入力。
※起動は-のみ使用可能

GoogleCloud Speech-to-TextをGoで触ってみる_12

ログインするGoogleアカウントを選択。

GoogleCloud Speech-to-TextをGoで触ってみる_13

先程作ったプロジェクトを選択。今回は TestCloudSpeechAppを選択しています。

GoogleCloud Speech-to-TextをGoで触ってみる_14

成功するとこのような表示になります。

そろそろクライアント作業に入ります。

音声文字変換をリクエストするサンプルコードを動かす

クライアント ライブラリのインストール

今回は初めてですがGoを選択します。

go get -u cloud.google.com/go/speech/apiv1  

とシェルで実行してライブラリをインストールしておきます。

Page not found · GitHub · GitHub
こちらのコードを動かしてみます。コピーして、helloworld-speech-to-text.goというファイルを作成してペーストしておきます。

実行

go run helloworld-speech-to-text.go  

案の定失敗

Failed to read file: open /path/to/audio.raw: no such file or directory  
exit status 1  

エラー内容から、

ソースコードの/path/to/audio.raw部分を自分で用意した音声ファイルを突っ込む必要がありました。
Googleさん音声ファイルを用意しておいてよ〜って思ってたんですが、この記事を書き終えた後に気づきましたが、C#の方のサンプルにはアップロードされていました。

GoogleCloud Speech-to-TextをGoで触ってみる_15

Page not found · GitHub · GitHub

QuickTimeで音声収録してwavに変換

ここから自分の音声ファイルを作成していきます。

GoogleCloud Speech-to-TextをGoで触ってみる_16

Macの場合はQuickTimeでお手軽に収録できます。手持ちのMacBookにはマイクも付いているので、特に機材用意もなく収録できます。

GoogleCloud Speech-to-TextをGoで触ってみる_17

QuickTimeからはm4aというフォーマットで保存されます。

m4aでは失敗したのでwavへ変換

m4aでも試しましたが、失敗してしまったので、間違いなさそうなwav形式に大好きなffmpegで以下のようなコマンドでサクッと変換します。

ffmpeg -i sample.m4a sample.wav  

※ffmpegが未インストールだった場合はbrew install ffmpegしてください

GoogleCloud Speech-to-TextをGoで触ってみる_18

サンプルコードのfilenameの部分をリネーム。

再度Goを実行します。

go run helloworld-speech-to-text.go  

認識された!!

GoogleCloud Speech-to-TextをGoで触ってみる_19

ドライな感じでコンソールに出力されただけですが、ぼくの音声(Hello)がちゃんと「Hello」と認識されて少し感動しました。

途中ですが最後に

同僚のマイクロサービスを動かすところまでは本記事では到達できませでしたが、Cloud Speech-to-Textを使うところまではできました。
ほぼほぼプロジェクト設定周りに時間を食われた形ですが、動いてよかったです。

ぼくの肉声ファイルを含む全ソースを以下にアップしておきます。
GitHub - baobao/helloworld-speech-to-text: Helloworld Speech-to-Text

副次的に学んだこと

音声をシェルから再生させて、情報を知る

SoX - Sound eXchange download | SourceForge.net

brew install SoX  

brewからインストールして使いました。

play sample.wav  

と実行すると指定した音声が再生され音声情報も表示されます。

GoogleCloud Speech-to-TextをGoで触ってみる_20

シェルから実行できるのはちょっと便利。

ffmpegでトリミング

インターネットから音声ファイルを落としてきた時に、やたら長かったので、サクッとffmpegでトリミングできないかなと調べていたら、良い参考記事がありました。ありがとうございます。
ffmpeg で指定時間でカットするまとめ | ニコラボ

ffmpeg -i input.wav -t 3 output.wav  

みたいに -tオプションでトリミングができます。

オススメ記事