2016年8月現在の情報です
Google Cloud Speech API Beta でwavファイルの音声認識の試用メモ。
CLOUD SPEECH API
Google Cloud Speech API Betaにある通り、音声認識のAPI。
- 80か国語対応
- 雑音に強い
- コンテキストに合った認識
- デバイス非依存
- リアルタイムと録音済みファイル両対応
とのことで、お手軽な高性能ASRらしい。
資料
CLI (Google Cloud SDK+curl) から使う方法
Quickstartによると、
- Google Cloud Platformアカウントを作る
- プロジェクトを作り、Speech APIを有効化
- Service Account keyファイルを生成し、手元にダウンロード
- コマンドラインツールGoogle Cloud SDKをインストールしたうえで、上記Service Account keyファイルを使って認証トークンを得る
- 得られた認証トークンを使い、あらかじめ用意した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で認証トークンを得る
-
Google Cloud SDKをインストールし、
gcloud
コマンドを叩けるようにする。 -
上で取得したService Account key ファイルを使って認証トークンを得る
$ gcloud auth print-access-token
帰ってきた認証トークンを覚えておく
CurlでAPI呼び出し
QuickStartのMake a Speech API Requestの通りに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] (https://cloud.google.com/speech/reference/rest/)の、[syncRecognize](https://cloud.google.com/speech/reference/rest/v1beta1/speech/syncrecognize)の通り、Request bodyのconfig
で音源や認識の設定を、audio
で音声データを指定する。
audio
の指定はRecognitionAudioの通り、uri
かcontent
で、手元の音声ファイルを送る場合は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の
languageCode
をen-US
からja-UP
に変更する。 - FLACでエンコードされたデータを送りたい場合はbodyの
encoding
をFLACにすること。 - サンプルだと認識結果をjson.dumps()しているだけなので、日本語を認識した場合は正しく表示されるよう対応が必要。
このサンプルは入力ファイル1つに対する処理なので、複数ファイルを認識させたい場合はAPI Discoverとトークン取得を繰り返さないようにした方が良さそう。
認証トークンはそれなりの頻度で更新されるようなので、トークン再取得のケアも要る。テスト中(体感15-30分ぐらい?)にいきなり401が帰ってきて何だろう?と思ったらトークンが更新されてた、、ってことがあった。
使用感
定量的じゃなくて申し訳ないですが:
- 認識にある程度の時間がかかる (2-4秒程度?)
- 認識精度はかなり高い。結構大きな雑音(マイクのそばで音楽を流したり)があってもちゃんと聞き取る。何にも設定しないでこの精度ってすごい
- 雑音が人の話声だとどうなるか試してみたい
- コンテキスト関連のオプションを試してないので、今後使ってみたい
- QuickStartに Learn in 5 minutes ってあるが、私には5分じゃ全く無理で悲しくなった