Raspberry PiでGoogle Cloud Speech APIを使う


はじめに

Google Cloud Speech APIは、Googleが2016年3月23日(現地時間)にクラウド関連イベント「GCP Next 2016」で発表した機械学習による音声認識機能です。2017年2月10日現在、同社のクラウドプラットフォーム「Google Cloud Platform」の一部としてβ版が利用できるようになっています。

What is Cloud Speech API?
Google Cloud Speech APIのデモビデオ

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向けツールの充実に力が入れられるとの報道もあり、今後さらに使いやすくなることが期待できそうです。

リファレンス

関連記事