はじめに
Google Cloud Speech APIは、Googleが2016年3月23日(現地時間)にクラウド関連イベント「GCP Next 2016」で発表した機械学習による音声認識機能です。2017年2月10日現在、同社のクラウドプラットフォーム「Google Cloud Platform」の一部としてβ版が利用できるようになっています。
Raspberry Piで動かしてみる
準備
まず、Google Cloud SDK ドキュメントの「Debian / Ubuntu 用のクイックスタート」に従ってセットアップを行います。最後のステップでCloud SDKのインストールをしようとした段階でapt-transport-https
が足りないと言われたらsudo apt-get install apt-transport-https
でインストールします。
gcloud init
コマンドを使用したSDKの初期化まで終えたら、Google Cloud Speech API Python Samplesの説明に従ってセットアップを進めていきます。その際、virtualenv
がインストールされていない場合にはsudo apt-get install virtualenv
でインストールします。
GitHubからダウンロード(もしくはクローン)するとPythonのサンプル全てがダウンロードされるため、speech/grpc
に移動した上で実行します。
ここで、GOOGLE_APPLICATION_CREDENTIALS
に関して、デフォルトのユーザであるpi
の場合には以下のように指定します。
$ export GOOGLE_APPLICATION_CREDENTIALS=/home/pi/.config/gcloud/application_default_credentials.json
最後のpip install -r requirements.txt
は結構時間がかかりますがしばらく待っていると終わります。
$ pip install -r requirements.txt
Downloading/unpacking grpcio==1.1.0 (from -r requirements.txt (line 1))
Downloading grpcio-1.1.0.tar.gz (7.2MB): 7.2MB downloaded
Running setup.py (path:/tmp/pip-build-Jx8iQk/grpcio/setup.py) egg_info for package grpcio
…
Successfully installed grpcio PyAudio grpc-google-cloud-speech-v1beta1 six requests google-auth enum34 protobuf futures oauth2client googleapis-common-protos pyasn1 rsa pyasn1-modules httplib2
Cleaning up...
一通りダウンロードが終わったら、ストリーミングのサンプルを動かしてみます。サンプルの言語は英語(米国)に設定されていますので、まずは英語で話します。上手く認識されると、以下のように認識結果が表示されます。
$ python transcribe_streaming.py
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
...
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
This is a pen
次に、言語設定を変更してもう一度試してみます。nano
などのテキストエディタでtranscribe_streaming.py
を開き、request_stream
で言語を設定している部分を変更します。Google Cloud Speech APIがサポートしている言語はドキュメント中の「言語のサポート」に一覧が掲載されていますので、その中から日本語を示すja-JP
をセットします。
def request_stream(data_stream, rate, interim_results=True):
...
recognition_config = cloud_speech_pb2.RecognitionConfig(
...
language_code='en-US', # a BCP-47 language tag
)
...
def request_stream(data_stream, rate, interim_results=True):
...
recognition_config = cloud_speech_pb2.RecognitionConfig(
...
language_code='ja-JP', # a BCP-47 language tag
)
...
これで日本語で認識されるようになります。
$ python transcribe_streaming.py
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
...
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
東京特許許可局
特定の語句やヒントを指定する
Google Cloud Speech APIでは、特定の語句やヒントを指定することでコンテキストに合わせて音声認識を調整できるとされていますので試してみます。試してみると「ラズベリーパイ」と日本語で発音すると「raspberry pi」と認識されます。しかしながら、「Arduino(アルドゥイーノ)」だと「アルディーノ」などを解釈されてしまいます。そこで、日本語に対して特定の語句を追加するため、スクリプトの冒頭にエンコーディングの設定を追加します。
#!/usr/bin/python
# coding=utf-8
もしくは
#!/usr/bin/python
# -*- coding: utf-8 -*-
特定の語句やヒントは以下のようにして与えます。ヒントとして与えられるフレーズには制限がありますが、その範囲内で与えることにより固有名詞などが正確に認識されるようになります。
hints = cloud_speech_pb2.SpeechContext(
phrases=['アルドゥイーノ']
)
recognition_config = cloud_speech_pb2.RecognitionConfig(
encoding='LINEAR16',
sample_rate=rate,
language_code='ja-JP',
speech_context=hints
)
おわりに
クラウドベースの音声認識エンジンはCloud Speech APIにもいくつかありますが、日本語も含めた多くの言語に対応してるのは大きな魅力でしょう。また、今後Raspberry Pi向けツールの充実に力が入れられるとの報道もあり、今後さらに使いやすくなることが期待できそうです。
リファレンス
- Google Cloud SDK ドキュメント
- Google Cloud Speech API ドキュメント
- PyAudio
- PyAudio Documentation
- https://googlecloudplatform.github.io/google-cloud-python/stable/speech-usage.html
- https://github.com/googleapis/googleapis/blob/master/google/cloud/speech/v1beta1/cloud_speech.proto