51
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-16

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 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] (https://cloud.google.com/speech/reference/rest/)の、[syncRecognize](https://cloud.google.com/speech/reference/rest/v1beta1/speech/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分じゃ全く無理で悲しくなった
51
48
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?