Python
GoogleCloudPlatform
音声認識
SpeechRecognition

Google Cloud Speech API Beta でwavファイルの音声認識

More than 1 year has passed since last update.

2016年8月現在の情報です

Google Cloud Speech API Beta でwavファイルの音声認識の試用メモ。


CLOUD SPEECH API

Google Cloud Speech API Betaにある通り、音声認識のAPI。


  • 80か国語対応

  • 雑音に強い

  • コンテキストに合った認識

  • デバイス非依存

  • リアルタイムと録音済みファイル両対応

とのことで、お手軽な高性能ASRらしい。


資料

公式ドキュメント

pythonサンプルコード


CLI (Google Cloud SDK+curl) から使う方法

Quickstartによると、


  1. Google Cloud Platformアカウントを作る

  2. プロジェクトを作り、Speech APIを有効化

  3. Service Account keyファイルを生成し、手元にダウンロード

  4. コマンドラインツールGoogle Cloud SDKをインストールしたうえで、上記Service Account keyファイルを使って認証トークンを得る

  5. 得られた認証トークンを使い、あらかじめ用意したwavファイル等の音声データをAPIに投げて認識結果を得る

秘密鍵を含んだService Account keyファイル (json) を生成し、それを使って都度認証トークンを得る。


プロジェクト作成からService Account keyファイル取得まで

QuickStartの Set Up Your Projectの項のとおり。

が、6のService Account作成で、"new service account" を作成する際、ドキュメント に無いRoleという項目が出来てて戸惑う。

Service Accountの登録が済むとjsonファイルをダウンロードできるので、任意の場所に保存する。秘密鍵が含まれるので人目にさらさないこと。


Google Cloud SDKで認証トークンを得る



  1. Google Cloud SDKをインストールし、gcloudコマンドを叩けるようにする。

  2. 上で取得したService Account key ファイルを使って認証トークンを得る

$ gcloud auth activate-service-account --key-file=account keyファイルのパス

$ gcloud auth print-access-token



帰ってきた認証トークンを覚えておく


CurlでAPI呼び出し

QuickStartのMake a Speech API Requestの通りにsync-request.jsonを作成し、


sync-request.json

{

"config": {
"encoding":"FLAC",
"sample_rate": 16000
},
"audio": {
"uri":"gs://cloud-samples-tests/speech/brooklyn.flac"
}
}

sync-request.jsonがあるディレクトリで

$ curl -s -k -H "Content-Type: application/json" \

-H "Authorization: Bearer 上で得た認証トークン" \
https://speech.googleapis.com/v1beta1/speech:syncrecognize \
-d @sync-request.json

うまくいけばjsonで認識結果が返ってくる。


音声データと認識内容の設定方法

入力ファイルの場所や形式の設定はRequest bodyにのjson (上の例だとsync-request.json) で指定する。

例のsync-request.jsonではGoogle Cloud Storageにあらかじめ配置されたサンプルのflacファイルを使っているが、手元の音声データを送ることも勿論可能だしflac以外のエンコードにも対応している。


手元にある音声ファイルを送る

Rest APIのreferenceの、syncRecognizeの通り、Request bodyのconfigで音源や認識の設定を、audioで音声データを指定する。

audioの指定はRecognitionAudioの通り、uricontentで、手元の音声ファイルを送る場合はBase64で文字列にエンコードしてcontentとして送ればいいらしい。

サンプルはエンコード方式がFLAC、サンプリングレートが16000(16khz)になってるので、送る音声データに合わせること。


pythonでSpeech APIを使う

チュートリアルの通り、glcoudコマンド + curlではなく、pythonからもSpeech APIを呼べる (Node.jsのサンプルもある)

この手順だとGoogle Cloud SDKは要らないが、代わりにGoogle API Client Libraryが必要。curlでいけるんだからライブラリは要らないかと思いきや、API Discovery Service & 認証トークン取得のためにGoogle API Client Libraryが使われている。これらが必要なければ前述のcurlに倣ってライブラリなしでも使えそう。


Service Account keyファイルの取得

上記CLIの手順1-3と同じ。


Application Default Credentialの設定

手順はサンプルコードの通りだが、こちらは認証トークン取得のためのService Account keyファイルを事前に環境変数GOOGLE_APPLICATION_CREDENTIALSに設定しておく必要がある:

$ export GOOGLE_APPLICATION_CREDENTIALS=Service Account ファイルのパス

これをApplication Default CredentialとしてGoogleCredentials.get_application_default().create_scoped()メソッドが参照することで認証トークンが得られるとのこと。


APIの呼び出し

サンプルコードの通り:

$ python speech_rest.py 音声ファイル.wav

で認識結果が表示される。

注意


  • 日本語音声を認識する場合、bodyのlanguageCodeen-USからja-UPに変更する。

  • FLACでエンコードされたデータを送りたい場合はbodyのencodingをFLACにすること。

  • サンプルだと認識結果をjson.dumps()しているだけなので、日本語を認識した場合は正しく表示されるよう対応が必要。

このサンプルは入力ファイル1つに対する処理なので、複数ファイルを認識させたい場合はAPI Discoverとトークン取得を繰り返さないようにした方が良さそう。

認証トークンはそれなりの頻度で更新されるようなので、トークン再取得のケアも要る。テスト中(体感15-30分ぐらい?)にいきなり401が帰ってきて何だろう?と思ったらトークンが更新されてた、、ってことがあった。


使用感

定量的じゃなくて申し訳ないですが:


  • 認識にある程度の時間がかかる (2-4秒程度?)

  • 認識精度はかなり高い。結構大きな雑音(マイクのそばで音楽を流したり)があってもちゃんと聞き取る。何にも設定しないでこの精度ってすごい


    • 雑音が人の話声だとどうなるか試してみたい



  • コンテキスト関連のオプションを試してないので、今後使ってみたい

  • QuickStartに Learn in 5 minutes ってあるが、私には5分じゃ全く無理で悲しくなった