Raspberry PiでGoogle Cloud Speech APIを使う

# はじめに

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

[![What is Cloud Speech API?](http://img.youtube.com/vi/wzp9dfVpeeg/0.jpg)](https://youtu.be/wzp9dfVpeeg)
Google Cloud Speech APIのデモビデオ

# Raspberry Piで動かしてみる

## 準備

まず、Google Cloud SDK ドキュメントの「[Debian / Ubuntu 用のクイックスタート](https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu)」に従ってセットアップを行います。最後のステップでCloud SDKのインストールをしようとした段階で`apt-transport-https`が足りないと言われたら`sudo apt-get install apt-transport-https`でインストールします。

`gcloud init`コマンドを使用したSDKの初期化まで終えたら、[Google Cloud Speech API Python Samples](https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/speech/grpc)の説明に従ってセットアップを進めていきます。その際、`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`は結構時間がかかりますがしばらく待っていると終わります。

```bash
$ 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...
```

一通りダウンロードが終わったら、ストリーミングのサンプルを動かしてみます。サンプルの言語は英語（米国）に設定されていますので、まずは英語で話します。上手く認識されると、以下のように認識結果が表示されます。

```bash
$ 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がサポートしている言語はドキュメント中の「[言語のサポート](https://cloud.google.com/speech/docs/languages)」に一覧が掲載されていますので、その中から日本語を示す`ja-JP`をセットします。

```py:変更前
def request_stream(data_stream, rate, interim_results=True):
    ...
    recognition_config = cloud_speech_pb2.RecognitionConfig(
        ...
        language_code='en-US',  # a BCP-47 language tag
    )
    ...
```

```py:変更後
def request_stream(data_stream, rate, interim_results=True):
    ...
    recognition_config = cloud_speech_pb2.RecognitionConfig(
        ...
        language_code='ja-JP',  # a BCP-47 language tag
    )
    ...
```

これで日本語で認識されるようになります。

```bash
$ 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（アルドゥイーノ）」だと「アルディーノ」などを解釈されてしまいます。そこで、日本語に対して特定の語句を追加するため、スクリプトの冒頭にエンコーディングの設定を追加します。

```py
#!/usr/bin/python
# coding=utf-8
```

もしくは

```py
#!/usr/bin/python
# -*- coding: utf-8 -*-
```

特定の語句やヒントは以下のようにして与えます。ヒントとして与えられるフレーズには[制限](https://cloud.google.com/speech/limits#content)がありますが、その範囲内で与えることにより固有名詞などが正確に認識されるようになります。

```py
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向けツールの充実に力が入れられるとの報道](http://jp.techcrunch.com/2017/01/26/20170125google-planning-ai-tools-for-pi-makers-this-year/)もあり、今後さらに使いやすくなることが期待できそうです。

# リファレンス

- [Google Cloud SDK ドキュメント](https://cloud.google.com/sdk/docs/)
- [Google Cloud Speech API ドキュメント](https://cloud.google.com/speech/docs/)
- [PyAudio](https://people.csail.mit.edu/hubert/pyaudio/)
- [PyAudio Documentation](https://people.csail.mit.edu/hubert/pyaudio/docs/)
- 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

# 関連記事

- [IoTワークショップでRaspberry Piを使う](http://qiita.com/mayfair/items/74aaad0202ba9171e282)
- [Raspberry PiでJabra Speak 410を使う](http://qiita.com/mayfair/items/384c8d774accd4309416)
- [Snowboy Hotword DetectionをRaspberry Piで動かす
](http://qiita.com/mayfair/items/d16d092328e60f0cac6b)