Pepper 2.5.5でWatson SpeechToTextAPIを試す

Choregraphe 2.5.5になり、Pepperが利用するライブラリの多くが更新・変更されました。(詳しい変更点は[NAOqi OS 2.5](http://doc.aldebaran.com/2-5/news/2.5/naoqi_os_rn2.5.html)を参照)
このように開発ツールが更新されると、多くの場合、自分が作ったプログラムはプログラムの一部を新バージョンに合わせて書き換える必要が出てきます。

一方、WatsonやGoogle Cloud Platformなどのクラウドサービスとの連携はPepperにとって欠かせない要素となってきています。これらの外部サービスと連携していると、開発ツールだけでなく外部サービスにおける改善への対応も必要となってきます。

今回は、2.5.5のPepperに、以前のバージョンで作ったソフトウェアを対応させる例として、[PepperとWatson SpeechToTextAPIを連携させて継続的な音声認識サービスを作ってみた](http://qiita.com/JohnTomato/items/0f8469f12a69f9cc8ac6) で開発したプログラムを例に、Pepper Python SDKのインストール、依存関係の更新などをみてみたいと思います。

# サンプルプログラムのソースコード

ここで紹介する、sttproxyという、PepperとWatsonを中継するソースコードと、それを使うサンプルプログラムは、 [vr-lab/qibluemix](https://github.com/vr-lab/qibluemix) にアップロードしてあります。

今回、Pepper 2.5.5でこのプログラムを動かすにあたって、ライブラリの依存関係（`requirements.txt`）に以下の変更を行なっています。

- 使用するPython SDK (pynaoqi)のバージョンを2.5.5.5に変更
- 他のライブラリ(requests, websocket-client)についても執筆時点で最新のバージョンに変更

pynaoqi以外にもバージョンアップを実施しているのは、他のライブラリでもバグフィックスなどの改善が行われているためです。セキュリティ上の問題さえなければ、古いものを使い続けることも可能ではありますが、将来致命的な問題が発見され修正される場合がありうることを考えると、適度なタイミングで新しいバージョンのライブラリを取り込んでいくことが望ましいと言えるでしょう。

# サンプルプログラムの使い方

## Pepper Python SDK 2.5.5 のインストール

sttproxyを動かすには pynaoqi というPepper用のPythonライブラリが必要です。これは、Pepper Python SDKをインストールすることで使えるようになります。  

各OSにおけるインストール手順は [Python SDK \- Installation Guide — Aldebaran 2\.5\.5\.5 documentation](http://doc.aldebaran.com/2-5/dev/python/install_guide.html) に記載されています。本記事ではWindowsの場合について詳しく見ていきます。

Pepper Python SDK 2.4.3まではWindows用のインストーラーがexeとして配布されていたのですが、2.5.5は（少なくとも執筆時点では）インストーラーは配布されず、関連ファイルをまとめたzipファイルとしてしか配布されていません。


1. 古いバージョンのSDKがインストールされている場合は、 `pip uninstall pynaoqi` などでアンインストールします。
2. [ダウンロード \| Pepper Developer Portal](https://developer.softbankrobotics.com/jp-ja/downloads/pepper) にアクセスします。
3. "Other SDKs and utilities > Python > 2.5.5 > Windows > python 2.7 SDK 2.5.5 Win 32" をクリックし、SDKをダウンロードします。
4. `pynaoqi-python2.7-2.5.5.5-win32-vs2013.zip` のようなzipファイルが得られるので、適当な場所に解凍します。
5. 解凍したフォルダの下にlibフォルダがあるので、そのパスを環境変数 `PYTHONPATH` に追加します（例： `setx PYTHONPATH "%PYTHONPATH%;c:\python27\pynaoqi-python2.7-2.5.5.5-win32-vs2013\lib"` ）。
6. `python -c "import naoqi; print naoqi"` を実行し、インストールしたSDKを読み込めていたら成功です。

## Credentialの入手

Bluemix で Watson Speech to TextのCredentialを発行しておきます。
少し試す程度であれば、無料枠で足りるはずです。
後で使うので、発行したCredentialのusernameとpasswordを控えておきます。

## ソースコードの入手と更新

[vr-lab/qibluemix](https://github.com/vr-lab/qibluemix) からプログラムを取得します。
`git clone https://github.com/vr-lab/qibluemix.git` でcloneするか、ZIPでダウンロードし解凍します。

`sample/sttproxy/sttproxy.py` 17行目から23行目あたりの値を変更します。
PEPPER_IPには接続するPepperのIPアドレス、USERNAMEとPASSWORDには前節で取得したCredentialのusername, passwordを指定します。

```py:sttproxy.py
# --- 省略 ---
# ==== parameters ====
PEPPER_IP = "192.168.10.62"
PEPPER_PORT = 9559
EVENT_ROOT_NAME = "Bluemix/STTProxy/"
USERNAME = "abcdefg-hijklmn-0123456"
PASSWORD = "abcABC0123"
URL = "https://stream.watsonplatform.net/speech-to-text/api"
CONFIDENCE = 0.2
# ==== /parameters ====
# --- 省略 ---
```

## 実行

sttproxyサービスを起動した後に、Choregrapheのプログラムを動かします。

sttproxyは以下の手順で実行します。

1. `cd qibluemix; pip install -r requirements.txt` を実行し、必要なpythonライブラリをインストールします。
2. `python sample/sttproxy/sttproxy.py` でsttproxyを起動します。

Choregpraheのサンプルは `sample/sttproxy/pepper/` にあります。
        
# 実行結果

参照元の記事とほぼ同じ文章で実験してみました。

```text:デモで話しかけている文章
Pepperはコミュニケーションに特化したロボットです。
今はBluemixのWatsonと連携して声を認識しています。

ご飯を食べに行こうか。
今日はお寿司が食べたいな。

眠くなってきたから、コーヒーでも買ってきてもらえる？あ、ブラックで。
とりあえず、生3つ。

さようなら。
```

これらの言葉の認識結果は以下のようになりました。

```text:sttproxy.pyのログの一部
[STTProxy] on stream message:
Ｐｅｐｐｅｒ , 0.987
[STTProxy] on stream message:
Ｐｅｐｐｅｒ は コミュニケーション に 特化 した ロボット で , 0.728
[STTProxy] on stream message:
今は Ｂｌｕｅｍｉｘ の ワトソン と 連携 して 声 を 認識 して います , 0.899
[STTProxy] on stream message:
ご飯 を 食べ に 行こう か , 0.976
[STTProxy] on stream message:w
今日 は お寿司 が 食べたい なあ , 0.811
[STTProxy] on stream message:
眠く なって きた から コーヒー でも 買って きて もらえる , 0.882
[STTProxy] on stream message:
D_マ ブラック で , 0.773
[STTProxy] on stream message:
とりあえず 生 三つ , 0.851
[STTProxy] on stream message:
さようなら , 0.451
```

> 認識結果の `D_` は「あー」や「うー」などの *Hesitation* を表す記号です ([Transcribing audio: Output features and parameters](https://www.ibm.com/watson/developercloud/doc/speech-to-text/output.html))


APIのレスポンスには、認識結果の信頼度を表すconfidenceパラメータが含まれています。
動作確認時の条件を厳密に制御しているわけではないので比較は難しいですが、以前に比べて、この値が格段に良くなっているような気がします。これは、Watsonが認識精度の改善を行なっている可能性、Pepperのマイクなどの外部デバイスからの入力の改善の可能性などが考えられます。Pepperだけでなくクラウドも日々改善を行なっていることは十分考えられるため、新しいバージョンのチェックは欠かせませんね。

今回の例ではロジックの修正は必要なく、依存関係の更新のみで対応できましたが、使用しているライブラリによっては仕様変更などでこれまでのプログラムをそのまま使うことは難しい場合などもあります。次回は、プログラムを更新する例について紹介したいと思います。