Pepperは人間が喋った任意の言葉を認識できるか？

Pepperの音声認識は、任意の日本語テキストを取得できるか、をSpeech Reco.ボックスとQiChat scriptの2つの方法で試しました。QiChat scriptのWild card「*」を利用して任意の言葉を取得可能ですが、認識の精度はあんまり良くない結果になりました。

#はじめに
[Pepperチュートリアル (4)：会話をする、音を鳴らす](http://qiita.com/Atelier-Akihabara/items/52e086e7c47d85b9ed3d)では、Pepperが人間から喋った特定の言葉対して返事をする会話の作り方を紹介しました。主に「ボックスを使った音声認識 + 音声出力」と「QiChat scriptの活用」の２つの方法があります。

この記事で紹介された会話の作り方として、音声認識で**認識したい言葉**を事前に登録しておく必要が有ります。しかし、人間からどういう内容を喋ってくれるかを予想するのは大変ですし、現実的に無理の場合も有ります。例えば、以下のシーンを想定しましょう。

　*Pepper：こんにちは、お名前は？*
　*人間：＿＿＿と申します。*
　*Pepper：＿＿＿さんですね。よろしく。*

「＿＿＿」という人の名前を予知できなければ、**認識したい言葉**として事前に登録できません。そして、Pepperが任意の人を名前で呼ぶことも困難です。世の中のすべての人の名前を事前に登録しておけば、実現可能ですが、大変な作業になるでしょう。

Pepperは人間が喋った任意の言葉を認識できるかについて、**Speech Reco.ボックス**と**QiChat script**を調査しました。

#Speech Reco.ボックスの調査
音声認識として最初に思いついたのは**Speech Reco.ボックス**でした。しかし、Speech Reco.ボックスの説明に「パラメーターのWorld listに登録された言葉から１つ認識する」（1）と書かれていますので、おそらく任意の言葉は認識できないと思います。
下記のように、Speech Reco.ボックスの**Word list**（2）に言葉を登録せずに実行すると、何も認識できませんでした。

![writing1.png](https://qiita-image-store.s3.amazonaws.com/0/56670/ee1aa3e9-bffb-442e-0fbf-1a8f6865f5ea.png)


Pythonのコードを確認しますと、Speech Reco.ボックスでは[**ALSpeechRecognition API**](http://doc.aldebaran.com/2-1/naoqi/audio/alspeechrecognition.html)を使っています。
**ALSpeechRecognition API**は人間の声を認識したら、あらかじめ**認識したい言葉**のリストに登録された言葉から、**信頼度（confidence）**の高い言葉を抽出して出力するように作られています。Speech Reco.ボックスはALSpeechRecognition APIを利用している限り、それ以上のことはできないでしょう。

#QiChat scriptでの実験

次に、**QiChat script**を利用して、人間が喋った任意の言葉を認識できるかを試します。
QiChatのドキュメントを確認したところ、人間が喋った任意の言葉を認識できる**Wildcard「*」**記号がありました。

>**Wildcard: *
>Syntax**
>u:(sentence * sentence) answer
>**Usage**
>Matches any word or phrase.
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/dialog-syntax_full.html#wildcard

**Wildcard「*」**に合わせて、認識された言葉を変数に保存する**Input storing「_」**記号、および変数から保存された言葉を取得する**Variable「$」**記号を併用すれば、人間が喋った任意の言葉をPepperから繰り返すことを実現できるではないかと考えました。

そして、下記のように単純な**Dialogボックス**と**QiChat script**を作成して実験しました。
Pepperが人間が喋った名前を認識して、人を名前で呼ぶことと、その他の任意の言葉を聞いたら、末尾に「〜ですか？」と追加して返事することを試します。

![スクリーンショット 2014-12-15 07.17.25.png](https://qiita-image-store.s3.amazonaws.com/0/56670/601b23b2-551b-3aac-1fb2-77802f34b572.png)

記号「_*」は人間が喋った任意の言葉を認識して、認識されたテキストを変数に保存します。
記号「$1」は保存されたテキストを変数から取り出します。
Dialogボックスの作り方は[会話入門 (Pepper TechFes技術セッション)](http://qiita.com/Atelier-Akihabara/items/37f5e99058ec39307038)を参照してください。
QiChatの記号の詳細は[QiChat Syntaxのドキュメント](http://doc.aldebaran.com/2-1/naoqi/audio/dialog/dialog-syntax_full.html)を参照してください。

**バーチャルロボット**で確認した結果（期待通りの動作）は以下のイメージです。

　*人間：こんにちは (100%)*
　*ロボット：こんにちはお名前は  ？*
　*人間：田中ともうします (100%)*
　*ロボット：こんにちは田中さん*
　*人間：今日は暑い (100%)*
　*ロボット：今日は暑いですか  ？*

実機でも期待通りの動作になればいいですが、しかし、現実世界はそううまくいきません。
**アトリエ秋葉原のPepper実機**で実験した結果（実際の動作）、下記結果になってしまいました。

　*人間：こんにちは*
　*ロボット：こんにちは　お名前は  ？*
　*人間：田中ともうします*
　*ロボット：<...>ですか  ？*
　*人間：今日は暑い*
　*ロボット：キョウジですか  ？*

なぜか、Pepper君は「田中」という人の名前を認識できなかったし、「今日は暑い」という言葉もぜんぜん違う言葉として認識してしまいました。

#音声認識の精度

Pepperの日本語認識精度を確認したく、下記のQiChat scriptを使って簡単な実験をしました。

```
topic: ~RepeatJapanese()
language: jpj
u:(_*) $1 ですか？
```

実験はアトリエ秋葉原のPepper実機を利用して、マイクに向けて日本語の言葉を喋った後、ChoregrahpのダイアログパネルからPepperが実際に認識した言葉とその信頼度を取得しました。結果は下記となります。(正しく認識された言葉をハイライトしています)

![スクリーンショット 2014-12-15 08.16.53.png](https://qiita-image-store.s3.amazonaws.com/0/56670/3dd68c04-c2ad-6f7a-095b-6abaf8e8a507.png)

結果を見ますと、Pepperはあいさつの言葉をちゃんと認識できますが、人の名前や数値はとても苦手のようです。それから、ぜんぜん間違う言葉として認識したとしても、信頼度を高くつく場合もありますので、信頼度だけでは音声認識の正確性を判断するのは難しいですね。

ちょっと残念な結果になりました。でも、食べ物の中にPepperはケーキ好きのことが分かりました^_^

#Winldcard「*」の性能問題

**Wildcard「*」**のドキュメントに、下記の注意事項が書かれています。

>**Use wildcards sparingly**
>**Wildcardを慎重に使用する**
>Too many wildcards can degrade performance of the automatic speech recognition.
>大量にWildcardを使うと音声認識性能が低下する可能性もあります。
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/dialog-syntax_full.html#wildcard

おそらく**Wildcard「*」**を使った場合、Pepperが覚えたすべての言葉からマッチングする言葉を検索します。そのような検索処理は計算量が多いですので、頻繁に実行すると性能が低下してしまいます。
そのため、`u:(_*) $1 ですか？`のような使い方はお勧めできなく、本当に必要な時だけ、**Wildcard「*」**を入れて実行するのは無難だと思います。

#おわりに
Pepperの音声認識は、Wildcard「*」を使って任意の日本語テキストを取得でますが、認識の精度はあんまり期待できません。当面では、任意の言葉をPepperに認識させるよりは、認識したい言葉をSpeech Reco.ボックスのWord list、もしくはQiChat scriptのconceptに登録した方が、はるかに認識の精度が上がると思います。

でも、今後Pepperはニュアンスコミュニケーションズ社のクラウド音声認識エンジンと繋がって、どんどん認識の精度も上がっていくと思いますので、大変楽しみにしています。