みなさん、Cloud Speech APIというサービスをGoogleが出していることはご存知でしょうか?Cloud Speech APIとはGoogleのもつ音声認識技術を使用し、音声をテキストに変換してくれるサービスです。また、WebやAndroidでの音声検索時のデータや最新のディープラーニング技術を利用して日々音声認識の技術は改善されており、日々Cloud Speech APIの精度も向上しています。
そんなCloud Speech APIですが、昨年夏に発表されて以降はβ版として運用されておりました。しかし、4月17日に遂にGA(Generally Available)になったとGoogleから発表がありました。
Cloud Speech API is now generally available
https://cloudplatform.googleblog.com/2017/04/Cloud-Speech-API-is-now-generally-available.html
また、上のブログ記事にもありますが、今回GAになるにあたって
- 長めの音声に対する変換精度の向上
- 従来のバッチ処理と比べて約3倍の速度向上
- WAVやOPus, Speexのサポート
の機能拡張があるようです。
精度だけでもすぐに試してみたいという方は、https://cloud.google.com/speech/ のページからすぐに試すことも可能です。
本記事ではそんなGAになったばかりのCloud SpeechAPIの主な機能と使い方についてご紹介します。
目次
Cloud Speech APIの特長
Cloud Speech APIとはGoogleの持つ音声認識の技術を利用するためのAPIです。ローカルやGoogle Cloud Storage上の音声データファイルを入力に、そのデータを確度(confidence)と共にテキストに変換してくれます。
Cloud Speech APIの種類
Cloud Speech APIには大きく分けてRESTとRPCの2種類のAPIが用意されています。
さらにそれぞれのAPIにおいて同期APIと非同期APIが用意されており、RPC版には加えてストリーミングAPIが用意されています。
APIの制限
2017年4月20日現在、APIの呼び出しには以下のような制限があります。
- 5回/秒、250,000回/日の呼び出し制限
- 200秒につき5000秒分までの音声処理
- 480時間/日の音声データ処理
- ストリーミング呼び出しと同期呼び出しの最大処理時間は1分間
- 80分以上の音声データに対して非同期呼び出しを行う場合、現状GCS上でかつ「LINEAR16」形式でエンコードされたデータのみ処理可能
- ワードヒント機能を利用する場合、各100文字以内の500フレーズのみ(トータル10,000文字まで)指定可能。
※参考 使用制限
https://cloud.google.com/speech/limits
Cloud Speech APIの費用は電話代程度
Cloud Speech APIの費用は変換リクエストで処理したデータファイルの音声の時間尺に対しての課金(処理時間では無く)になります。β版が公開された2016年8月より、以下の料金が課せられるようになっています。
月の利用 | 15秒ごとの料金 |
0~60分まで | 無料 |
61~1,000,000分まで | $0.006 |
上の表にもありますが、今のところ月に100万分の音声処理が利用可能となっています。60分までは無料、その後は15秒ごとに0.006ドルかかります。だいたい3分で8円程度(1ドル110円計算)なので、電話代と同じようなものでしょうか。
また、この料金はスマフォやタブレット、PC上のアプリケーションから利用する場合の料金になります。組み込み機器(車やテレビ、スピーカー)で利用する場合や100万分以上利用したい場合はこちらから別途利用の承認と料金の詳細について問い合わせを行う必要があるそうです。
※参考 Google Cloud Speech APIの利用料金
https://cloud.google.https://cloud.google.com/speech/pricingcom/speech/pricing
事前準備
では実際にCloud Speech APIを利用してみましょう。
プロジェクトの作成
Cloud Speech APIを試すにはGoogle Cloud Platformでプロジェクトを作成する必要があります。
プロジェクトの作成方法については以下の記事を参考にしてください。
初心者のためのGCPプロジェクト始め方入門
APIの有効化&Service Accountの取得
プロジェクトの作成が完了したら、Cloud Speech APIを有効化し、APIを実行する為のService Accountを取得する必要があります。
API Manager→ライブラリから「Google Cloud Speech API」を選択する。
「有効にする」をクリックしてAPIを有効化します。「無効にする」に切り替わればOKです。
次にService Accountを取得します
API Manager→認証情報から画面右下「サービスアカウントの管理」をクリックします。
画面上部の「サービスアカウントを作成」をクリックします。
サービスアカウント名に任意の名前を入力します。サービスアカウントIDは自動入力されます。(自分の好きなように変更することは可能です)
新しい秘密鍵の提供にチェックを入れ、キーのタイプにJSONを選び、作成ボタンをクリックします。
するとjsonファイルがダウンロードされますので、そのファイルを任意の場所に保管しておいてください。後々プログラムを実行する際にこのjsonファイルを利用します。
以上で事前に必要な準備は終わりです。
Cloud Speech APIを試す
ここからは実際に音声データを用意してCloud Speech APIを利用してみます。
今回はREST APIを同期/非同期に呼び出す方法をご紹介します。
REST API
REST API ~同期~
まずはREST APIを同期的に呼び出してみます。
以下のテキストを読み上げる15秒程の音声データをローカル上に用意し、APIを実行します。
出展企業200社を揃え3万人が集う日本最大規模のデジタルクリエーター見本市デジタルクリエイト2007が8月29日に幕張メッセにて開幕します |
実際のデータは以下からダウンロード可能です。
https://drive.google.com/file/d/0B38gOETu8BCnN0RReGRKVVFMTDg/view?usp=sharing
#!/usr/bin/env python
# [START import_libraries]import argparse
import base64
import json
from googleapiclient import discovery
import httplib2
from oauth2client.client import GoogleCredentials
# [END import_libraries]
# [START authenticating]
DISCOVERY_URL = ('https://{api}.googleapis.com/$discovery/rest '
'version={apiVersion}')
# Application default credentials provided by env variable
# GOOGLE_APPLICATION_CREDENTIALS
def get_speech_service():
credentials = GoogleCredentials.get_application_default().create_scoped(
['https://www.googleapis.com/auth/cloud-platform'])
http = httplib2.Http()
credentials.authorize(http)
return discovery.build(
'speech', 'v1beta1', http=http, discoveryServiceUrl=DISCOVERY_URL)
# [END authenticating]
def main(speech_file):
"""Transcribe the given audio file.
Args:
speech_file: the name of the audio file.
"""
# [START construct_request]
with open(speech_file, 'rb') as speech:
# Base64 encode the binary audio file for inclusion in the JSON
# request.
speech_content = base64.b64encode(speech.read())
service = get_speech_service()
# 処理する動画によってこの部分のパラメータを変える必要があります
service_request = service.speech().syncrecognize(
body={
'config': {
# There are a bunch of config options you can specify. See
# https://goo.gl/EPjAup for the full list.
'encoding': 'FLAC', # 動画の形式
'sampleRate': 16000, #サンプリングレート
# See https://goo.gl/DPeVFW for a list of supported languages.
'languageCode': 'ja-JA', # どの言語で変換するか
},
'audio': {
'content': speech_content.decode('UTF-8')
}
})
# [END construct_request]
# [START send_request]
response = service_request.execute()
for alt in response['results']:
for t in alt['alternatives']:
transcription = t['transcript']
print(transcription)
# [END send_request]
# [START run_application]
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument(
'speech_file', help='Full path of audio file to be recognized')
args = parser.parse_args()
main(args.speech_file)
# [END run_application]

~/sample.flacは音声ファイルの場所を示しています。各自試すときは自分の環境に置き換えてください。

実行するとエラーになりスタックトレースが表示されると思います。これは未だ該当プロジェクトのCloud Speech APIを実行する承認が取れていないことを示しています。
このエラーを解消する為にはhttps://cloud.google.com/speech/docs/common/auth#authenticating_with_application_default_credentials にもある通り、3-2で作成したサービスアカウントを用いて認証を通す必要があります。
上記のようにGOOGLE_APPLICATION_CREDENTIALSという環境変数に3-2で取得したjsonファイルを指定することでAPIを実行出来るようになります。以降、Cloud Speech APIの実行時には上記の設定が済んでいる前提で話を進めます。
再度プログラムを実行すると、
FLAC形式の音声データがテキストに変換されていることが分かります。
ちなみに今回試した約15秒の音声データの処理結果が返ってくるまでに5秒程度時間がかかりました。(β版で以前試した時は15秒程ドかかっていたので、確かに上述の通り3倍パフォーマンスの改善が見られました!!)
REST API ~非同期~
次にREST APIを非同期に呼び出してみます。
プログラムは以下になります。
#!/usr/bin/env python
# [START import_libraries]import argparse
import base64
import json
import time
from googleapiclient import discovery
import httplib2
from oauth2client.client import GoogleCredentials
# [END import_libraries]
# [START authenticating]
# Application default credentials provided by env variable
# GOOGLE_APPLICATION_CREDENTIALS
def get_speech_service():
credentials = GoogleCredentials.get_application_default().create_scoped(
['https://www.googleapis.com/auth/cloud-platform'])
http = httplib2.Http()
credentials.authorize(http)
return discovery.build('speech', 'v1beta1', http=http)
# [END authenticating]
def main(speech_file):
"""Transcribe the given audio file asynchronously.
Args:
speech_file: the name of the audio file.
"""
# [START construct_request]
with open(speech_file, 'rb') as speech:
# Base64 encode the binary audio file for inclusion in the request.
speech_content = base64.b64encode(speech.read())
service = get_speech_service()
//呼び出すメソッドがsyncrecognizeからasyncrecognizeに
service_request = service.speech().asyncrecognize(
body={
'config': {
# There are a bunch of config options you can specify. See
# https://goo.gl/EPjAup for the full list.
'encoding': 'FLAC', # raw 16-bit signed LE samples
'sampleRate': 16000, # 16 khz
# See https://goo.gl/DPeVFW for a list of supported languages.
'languageCode': 'ja-JA', # a BCP-47 language tag
},
'audio': {
'content': speech_content.decode('UTF-8')
}
})
# [END construct_request]
# [START send_request]
response = service_request.execute()
# [END send_request]
name = response['name']
print(name)
# Construct a GetOperation request.
//変換処理が完了するまでチェックし続ける
service_request = service.operations().get(name=name)
while True:
# Give the server a few seconds to process.
print('Waiting for server processing...')
time.sleep(1)
# Get the long running operation with response.
response = service_request.execute()
if 'done' in response and response['done']:
break
for alt in response['response']['results']:
for t in alt['alternatives']:
transcription = t['transcript']
print(transcription)
# [START run_application]
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument(
'speech_file', help='Full path of audio file to be recognized')
args = parser.parse_args()
main(args.speech_file)
# [END run_application]

最初のリクエストに対してname(ランダムな数列)が返ってきており、その後進行中の処理が完了するまで待ち受けている様子が分かると思います。
Cloud Speech APIの利用上注意する点
Cloud Speech APIは変換させたい音声ファイルによって適切なパラメータを設定しないと、精度が極端に落ちてしまいます。変換対象の音声ファイルのメタ情報を調べて(適宜変換させて)正しい値を設定してください。
【エンコーディング】
Cloud Speech APIでサポートしている音声形式は以下の通りです。
※2017/4/20現在、GAになったタイミングでWAV, OPus, Speexの3つの形式が新たにサポートされました。
変換対象の音声ファイルが上記以外の形式である場合、一度上記の形式にエンコードし直さないとCloud Speech APIでは識別出来ません。また、エンコードし直した音声データをCloud Speech APIで変換すると、どうしても精度は落ちてしまいます。ですので、出来る限り元データを上記の形式で作成し、それをCloud Speech APIで変換する、というのが最も精度の出る手段かと思います。
【サンプリングレートは16000】
サンプリングレートもエンコーディングと同様、変換対象の音声ファイルによって設定する値を変更する必要があります。
Cloud Speech APIでは8000~48000までをサポートしていますが、16000を推奨しています。それ以外でも全く識別出来ない訳ではないですが、私が検証した中ではサンプリングレートが44100と大きめの値の音声データを変換した際に音声の途中まで(全体で60秒の音声のうち前半30秒まで)しか識別出来ない、という現象が起こりました。
今の所はエンコーディングと同様に、出来る限り16000で作成した音声データを変換するのが良さそうです。
【再生形式はモノラルで】
音声の再生形式にはモノラルやステレオ、バイノーラルといったものがありますが、現在Cloud Speech APIでサポートされているのはモノラルのみとなっております。それ以外の形式のデータの場合はモノラルに変換してからCloud Speech APIにかける必要があります。
Cloud Speech APIのまとめ
記事ではローカル上の音声ファイルをCloud Speech APIを利用して同期/非同期に処理し、テキスト変換する方法についてご紹介しました。
現状、制約や注意点等はありますが、Cloud Speech APIを用いることで比較的簡単に音声→テキストの変換が行えることを実感して頂けたのではないでしょうか?
また、今回はご紹介出来ませんでしたが、 APIの種類 にもある通り、Cloud Speech APIにはストリーミング向けのAPIも用意されており、こちらと例えばTranslate APIを併用することで将来的にリアルタイムでの音声の自動翻訳や文字起こしといったことも出来るようになるでしょう。
次回はこれまで正しく認識されなかった音声がワードヒント機能を使うことでどのくらい精度が向上するのか検証し、記事にする予定です。
本記事がCloud Speech APIを使いはじめる第一歩になれば幸いです。
Cloud Speech APIを活用したクラウドシステム開発にご興味がございましたらCloud Ace(クラウドエース) までご連絡ください。