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


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

Google Speech APIではかなり良い精度で認識できました。NICTの音声認識サービスでもまずまずの精度でした。

サンプルコードをGitHubに公開していますので、お試しください。

注意点

  • NICTのAPIの利用は、学術研究目的に限られています。詳しくはrospeexのライセンスを参照してください。
  • Google Speech APIには、1日50回の呼び出し回数制限があります。

動作環境

インストール手順

ROS Indigo

ROS Indigo の Ubuntu へのインストールの手順通りでインストールできます。
環境変数の変更反映のため、ターミナルの再起動が必要です。

環境変数の確認

$ export | grep ROS

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

ROSワークスペースの作成

catkin workspaceの作成

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

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

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

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

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

rospeex

rospeexのインストール手順を参考に行います。

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

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

ビルド

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

デモを動かす

rospeexに付属しているTalking Watch サンプルで、rospeexの動作を確認します。
Ubuntuでサウンドデバイスが有効になっている必要があります。

roscore プロセスの起動

新しいターミナルを開き、roscoreを起動します。
ROS環境を動かす際には、roscoreの立ち上げが必須です。

$ roscore
デモプログラムの起動

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

$ rosrun rospeex_audiomonitor audio_monitor_epd

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

$ roslaunch rospeex_samples talking_watch_python_ja_local.launch

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

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

NAO Python SDK

Aldebaran Robotics Software Resourcesのページより、「Python 2.7 SDK 2.1 Linux 64」をダウンロードします。
※Aldebaran Roboticsのアカウントが必要です。

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

$ 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へのパスを通します。

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

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

$ 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パッケージ

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

依存するdebパッケージ

$ sudo apt-get install python-pyaudio

サンプルコードを動かす

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

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

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

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

$ 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 に書いてください。

# 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キーを書く)
$ 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)が指定できます。

$ 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.
$ 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サーバーのマイクで音声認識させる

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

$ roslaunch naoqi_rospeex sr_dummy.launch engine:=google
...
frame_data: 114660, energy = 64
lang=ja, engine=google
羽田空港から池袋まで行く方法 教えて
$ 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の使い方
* Google音声認識(Speech API)のAPIキー取得方法

Chromium-dev グループへの参加

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

Chromium-devのページにて、「グループに参加」をクリックしてください。

Google Developer Consoleでの操作

Google Developer Consoleにアクセスし、「プロジェクトを作成」します。

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

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

※自分のPCのグローバルIPアドレスを調べるには、IPアドレス確認サービスなどを利用してください。