Google Cloud Speech APIは音声をテキストに変換するAPIです。公式のページには

強力なニューラル ネットワーク モデルを利用し、 音声のテキスト変換を可能にする API として構成されています。簡単に利用できるこの API は、グローバルにユーザーがいても対応できる 英語や中国語をはじめとした80 を超える言語とそのバリエーションを認識します。

と書いてあります。「OK Google」でお馴染みのGoogleの音声認識エンジンを開放しているのですから、かなり強力な精度が得られるのではないでしょうか。

今回は、そんなGoogle Cloud Speech APIを使ってみようと思います。現在ベータ版です。

Speech APIを有効にする

Google Cloud Speech APIを有効にするためには、こちらにアクセスして

  1. 「Cloud Platform Console」へアクセス。
  2. 「Enable Billing」で課金を有効にします。
  3. 「Enable API」を押してプロジェクトを選択後、「Speech API」を有効にします。

認証情報を求められるのでサーバーで有効にした後、「完了」を押します。 APIキーが発行されます。

APIキーに認証情報に自分のIPアドレスを入力して、「保存」を押します。

サービスアカウントキーを発行します。

サービスアカウントを選択

「認証情報を作成」から「サービスアカウントキー」を選択し、サービスアカウントを「Compute Engine default service account」を選択してJSONファイルを作成します。

Cloud SDKのセットアップ

まずはCloud SDKのダウンロードをします。 Cloud SDKをインストール済みの方は飛ばしてください。

$ curl https://sdk.cloud.google.com | bash

curlで使ってみる

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

こちらのJSONファイルをsync-request.jsonと名前を付けて保存します。

次に、先ほど作成したサービスアカウントキーファイルを指定して、アクセストークンを取得します。

$ gcloud auth activate-service-account --key-file=service-account-key-file
$ gcloud auth print-access-token
$ curl -s -k -H "Content-Type: application/json" \
    -H "Authorization: Bearer access_token" \
    https://speech.googleapis.com/v1beta1/speech:syncrecognize \
    -d @sync-request.json

{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "how old is the Brooklyn Bridge",
          "confidence": 0.98267895
        }
      ]
    }
  ]
}

こんな結果が返ってきました。transcriptが音声ファイルの認識結果のテキストで、confidenceが信頼度でしょうか。

Pythonから使ってみる

urllib2jsonモジュールを利用します。

# -*- coding: utf-8 -*-
import json
import urllib2

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

endpoint = 'https://speech.googleapis.com/v1beta1/speech:syncrecognize'

req = urllib2.Request(endpoint)
req.add_header('Authorization', 'Bearer <API Key>')
req.add_header('Content-Type', 'application/json')

response = urllib2.urlopen(req, json.dumps(body))
res = json.loads(response.read())

for result in res['results']:
    for alternative in result['alternatives']:
        print alternative['transcript']
        print alternative['confidence']
how old is the Brooklyn Bridge
0.98267895

これで取得できます。