pepperでクラウド音声認識サービスを使う (ROS Indigo, rospeex)

pepper君の音声認識精度がいまいちなので、クラウド音声認識サービスを使って精度向上ができないか試してみました。
NAOqiのドライバでpepperのマイク信号をネットワーク経由で取得し、音声区間のみをクラウドサービスに送ることで音声認識結果を得るという方法です。

[Google Speech API](http://mikepultz.com/2013/07/google-speech-api-full-duplex-php-version/)ではかなり良い精度で認識できました。[NICTの音声認識サービス](http://www2.nict.go.jp/univ-com/slc/index.html)でもまずまずの精度でした。

[サンプルコード](https://github.com/kiyota-yoji/naoqi_rospeex)をGitHubに公開していますので、お試しください。

## 注意点

* NICTのAPIの利用は、学術研究目的に限られています。詳しくは[rospeexのライセンス](http://rospeex.org/license-ja/)を参照してください。
* Google Speech APIには、1日50回の呼び出し回数制限があります。

## 動作環境

* [Ubuntu 14.04.1 LTS](http://releases.ubuntu.com/14.04/) 64bit
    * 手元の環境では、Mac OSのVMware Fusionで動かしています
* [ROS Indigo](http://wiki.ros.org/indigo)
* [rospeex](http://rospeex.org/top-ja/)
* [NAO Python 2.7 SDK 2.1 Linux 64](https://community.aldebaran-robotics.com/resources/)
    * Aldebaranのアカウントが必要



## インストール手順

### ROS Indigo

[ROS Indigo の Ubuntu へのインストール](http://wiki.ros.org/ja/indigo/Installation/Ubuntu)の手順通りでインストールできます。
環境変数の変更反映のため、ターミナルの再起動が必要です。

#### 環境変数の確認

```bash
$ export | grep ROS
```

ROS_ROOT とか ROS_PACKAGE_PATH の設定が表示されることを確認してください。
もし表示されない場合は、インストール手順の「環境設定」の項目をもう一度確認してください。

#### ROSワークスペースの作成

catkin workspaceの作成

```bash
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ~/catkin_ws/
$ catkin_make
```

環境変数 ROS_PACKAGE_PATH に、上で作成した ~/catkin_ws/src を追加

```bash
$ echo 'source ~/catkin_ws/devel/setup.bash' >> ~/.bashrc
```

ターミナル再起動後、環境変数 ROS_PACKAGE_PATH の確認

```bash
$ set | grep ROS_PACKAGE_PATH
...
ROS_PACKAGE_PATH=/home/username/catkin_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks
```

### rospeex

[rospeexのインストール手順](http://rospeex.org/install-ja/)を参考に行います。

#### ROSパッケージのインストール

```bash
$ cd ~/catkin_ws/src
$ git clone https://bitbucket.org/rospeex/rospeex.git
$ rosdep update
$ rosdep install rospeex
#All required rosdeps installed successfully
```

#### ビルド

```bash
$ sudo apt-get install qtmobility-dev
$ cd ~/catkin_ws
$ catkin_make
```

#### デモを動かす

rospeexに付属している[Talking Watch サンプル](http://rospeex.org/asktime-ja/)で、rospeexの動作を確認します。
Ubuntuでサウンドデバイスが有効になっている必要があります。

##### roscore プロセスの起動

新しいターミナルを開き、[roscore](http://wiki.ros.org/ja/roscore)を起動します。
ROS環境を動かす際には、roscoreの立ち上げが必須です。

```bash
$ roscore
```

##### デモプログラムの起動

新しいターミナルから、音声認識用の波形モニタを起動します。

```bash
$ rosrun rospeex_audiomonitor audio_monitor_epd
```

![Screenshot from 2015-02-17 13:44:37.png](https://qiita-image-store.s3.amazonaws.com/0/69546/5755e737-b523-44f8-1927-bddc5aadbf6d.png)

もう一枚新しいターミナルを開き、サンプルプログラムを開きます。

```bash
$ roslaunch rospeex_samples talking_watch_python_ja_local.launch
```

マイクに向かって「今何時？」と質問すると、ターミナルに現在時刻が表示されたら成功です。

![Screenshot from 2015-02-17 13:55:42.png](https://qiita-image-store.s3.amazonaws.com/0/69546/5c4b4dd1-081b-f447-5f0f-beda3ecbd853.png)

※本来このデモプログラムでは現在時刻をしゃべってくれるはずですが、Ubuntu 14.04ではffplayツールが存在しないため、しゃべってくれないようです

### NAO Python SDK

[Aldebaran Robotics Software Resources](https://community.aldebaran-robotics.com/resources/)のページより、「Python 2.7 SDK 2.1 Linux 64」をダウンロードします。
※Aldebaran Roboticsのアカウントが必要です。

任意のパス (ここでは /opt 直下) に展開します。

```bash
$ cd /opt
$ sudo tar zxvf /path/to/pynaoqi-python2.7-2.1.0.19-linux64.tar.gz
$ ls /opt/pynaoqi-python2.7-2.1.0.19-linux64
_allog.so               libboost_math_tr1l.so
_almathswig.so          libboost_prg_exec_monitor.so
_inaoqi.so              libboost_program_options.so
_qi.so                  libboost_python.so
allog.py                libboost_random.so
almath.py               libboost_regex.so
almathswig.py           libboost_serialization.so
engines                 libboost_signals.so
inaoqi.py               libboost_system.so
libalbehavior.so        libboost_thread.so
libalcommon.so          libboost_timer.so
libalerror.so           libboost_unit_test_framework.so
libalmath.so            libboost_wave.so
libalproxies.so         libboost_wserialization.so
libalpythontools.so     libcrypto.so
libalsoap.so            libcrypto.so.1.0.0
libalthread.so          libgtest.so
libalvalue.so           libgtest_main.so
libboost_atomic.so      libqi.so
libboost_chrono.so      libqic.so
libboost_context.so     libqimessaging.so
libboost_coroutine.so   libqipython.so
libboost_date_time.so   libqitype.so
libboost_filesystem.so  librttools.so
libboost_graph.so       libssl.so
libboost_locale.so      libssl.so.1.0.0
libboost_log.so         libtinyxml.so
libboost_log_setup.so   motion.py
libboost_math_c99.so    naoqi.py
libboost_math_c99f.so   qi
libboost_math_c99l.so   share
libboost_math_tr1.so    vision_definitions.py
libboost_math_tr1f.so
```

環境変数 PYTHONPATH に、展開した NAO Python SDKへのパスを通します。

```bash
$ echo 'export PYTHONPATH=/opt/pynaoqi-python2.7-2.1.0.19-linux64:${PYTHONPATH}' >> ~/.bashrc
```

ターミナル再起動後、環境変数 PYTHONPATH に SDK へのパスが通っていることを確認します。

```bash
$ set | grep PYTHONPATH
PYTHONPATH=/opt/pynaoqi-python2.7-2.1.0.19-linux64:/home/username/catkin_ws/devel/lib/python2.7/dist-packages:/opt/ros/indigo/lib/python2.7/dist-packages
```


### サンプルコード naoqi_rospeex

#### ROSパッケージ

```bash
$ cd ~/catkin_ws/src
$ git clone https://github.com/kiyota-yoji/naoqi_rospeex
$ rosdep update
$ rosdep install naoqi_rospeex
```

#### 依存するdebパッケージ

```bash
$ sudo apt-get install python-pyaudio
```

## サンプルコードを動かす

ROSのlaunchファイルで起動します。
音声認識結果はターミナルに表示されます。

### pepperのマイクで音声認識させる

pepperのIPアドレスを環境変数 NAO_IP に設定して起動します。
起動してから音声を受け付けるまでに10秒ほどかかります。

#### NICTのエンジンを使う (デフォルト)

```bash
$ NAO_IP=192.168.0.4 roslaunch naoqi_rospeex sr_nao.launch
...
[INFO] [WallTime: 1424159368.607674] reconfigure changed
[INFO] [WallTime: 1424159368.608243] subscribed to audio proxy, since this is the first listener
frame_data: 19110, energy = 171
lang=ja, engine=nict
[INFO] [WallTime: 1424159381.798684] speech recognition in progress: 1
こんにちは。
```

#### Googleのエンジンを使う

Google Speech APIを使うには、あらかじめAPI keyの設定が必要です。
末尾のメモを参照の上、取得したAPIキーを~/catkin_ws/src/naoqi_rospeex/config/sr_config.yaml に書いてください。

```yaml
# This file is rospeex sr config file.
# These parameters mesans,
# google_api_key: if you want to use google speech api in rospeex,
#                 you MUST get google api key from following site.
#                 https://console.developers.google.com

google_api_key: (ここにAPIキーを書く)
```

```bash
$ NAO_IP=192.168.0.4 roslaunch naoqi_rospeex sr_nao.launch engine:=google
...
[INFO] [WallTime: 1424159852.998351] reconfigure changed
[INFO] [WallTime: 1424159852.998967] subscribed to audio proxy, since this is the first listener
frame_data: 177450, energy = 252
lang=ja, engine=google
[INFO] [WallTime: 1424159960.504821] speech recognition in progress: 1
池袋駅から徒歩10分圏内のマンションをさがしたいんですけど
```

#### 他の言語を指定する

NICTのエンジンでは日本語(ja)、英語(en)、中国語(zh)、韓国語(ko)、
Googleのエンジンでは日本語(ja)、英語(en)が指定できます。


```bash
$ NAO_IP=192.168.0.4 roslaunch naoqi_rospeex sr_nao.launch lang:=en engine:=google
...
[INFO] [WallTime: 1424160599.257334] reconfigure changed
[INFO] [WallTime: 1424160599.258082] subscribed to audio proxy, since this is the first listener
frame_data: 35490, energy = 185
lang=en, engine=google
Hello.
```

```bash
$ NAO_IP=192.168.0.4 roslaunch naoqi_rospeex sr_nao.launch lang:=ko
...
[INFO] [WallTime: 1424160827.972297] reconfigure changed
[INFO] [WallTime: 1424160827.973224] subscribed to audio proxy, since this is the first listener
frame_data: 46410, energy = 212
lang=ko, engine=nict
안녕하세요.
```

### Ubuntuサーバーのマイクで音声認識させる

サーバーに接続したマイクを使って認識させることも可能です。

```bash
$ roslaunch naoqi_rospeex sr_dummy.launch engine:=google
...
frame_data: 114660, energy = 64
lang=ja, engine=google
羽田空港から池袋まで行く方法 教えて
```


```bash
$ roslaunch naoqi_rospeex sr_dummy.launch lang:=en
...
frame_data: 43680, energy = 89
lang=en, engine=nict
Hello.
```

ちなみに、この例では、 ~/catkin_ws/src/naoqi_rospeex/scripts/dummy_microphone.py を使って、NAOqiによって取得されるのと同一形式の音声データをローカルのマイクで生成しています。


## メモ: Google Speech APIのキーを取得する

Googleのクラウド音声認識API (Speech API)を使うためのAPIキー取得手順をまとめておきます。

無料アカウントでは、1日50回の呼び出し回数制限があります。

※ 参考
* [Google Speech API ver.2の使い方](http://qiita.com/mountcedar/items/be1e5d54fcef8f3a4bda)
* [Google音声認識(Speech API)のAPIキー取得方法](http://eyepodtouch.net/?p=81)

### Chromium-dev グループへの参加

Speech APIを有効にするためには、Googleグループ Chromium-dev への参加が必要です。

[Chromium-devのページ](https://groups.google.com/a/chromium.org/forum/?fromgroups#!forum/chromium-dev)にて、「グループに参加」をクリックしてください。

![（99+）Chromium-dev - Google グループ 2015-02-17 11-43-48.png](https://qiita-image-store.s3.amazonaws.com/0/69546/02532f4b-9728-fc0c-f690-e86895aef144.png)

![（99+）Chromium-dev - Google グループ 2015-02-17 11-46-01.png](https://qiita-image-store.s3.amazonaws.com/0/69546/9ceecdb9-139e-c8de-5d51-9b000db5e625.png)

### Google Developer Consoleでの操作

[Google Developer Console](https://console.developers.google.com/project)にアクセスし、「プロジェクトを作成」します。

![Google Developers Console 2015-02-17 11-52-46.png]
(https://qiita-image-store.s3.amazonaws.com/0/69546/97dcf055-c8c0-4cdc-3a51-09d1c861dbf2.png)

![Google Developers Console 2015-02-17 11-56-32.png](https://qiita-image-store.s3.amazonaws.com/0/69546/241ba1b9-347b-c705-4568-de3332074aed.png)

作成したプロジェクトのページにアクセスし、「APIと認証」→「API」を開いて、「Speech API」を有効(ON)にします。

![Google Developers Console 2015-02-17 11-59-47.png](https://qiita-image-store.s3.amazonaws.com/0/69546/c930388b-84cd-78b6-3f86-d63db1a9c0ce.png)

![Google Developers Console 2015-02-17 12-06-05.png](https://qiita-image-store.s3.amazonaws.com/0/69546/f0e20bbe-3966-1cb4-615b-2b501e85262c.png)

「APIと認証」→「認証情報」を開いて、サーバー用のAPIアクセスキーを作成します。

![Google Developers Console 2015-02-17 12-09-38.png](https://qiita-image-store.s3.amazonaws.com/0/69546/eb256e93-1dcf-325d-1b1e-3d85d39d4e46.png)

![Google Developers Console 2015-02-17 12-11-34.png](https://qiita-image-store.s3.amazonaws.com/0/69546/b5265c8e-063c-f359-5fce-1636f428addd.png)

![Google Developers Console 2015-02-17 12-15-03.png](https://qiita-image-store.s3.amazonaws.com/0/69546/aff019fc-ea69-fce8-7b6b-8f1d2eff3e6a.png)

※自分のPCのグローバルIPアドレスを調べるには、[IPアドレス確認サービス](http://www.cman.jp/network/support/go_access.cgi)などを利用してください。

![Google Developers Console 2015-02-17 12-18-12.png](https://qiita-image-store.s3.amazonaws.com/0/69546/bbc00b8f-83f8-d845-dc53-9d1545512491.png)