blog
ブログ
2016.04.14

Pepper技術ブログ:オウム返しアプリを作ってみる

こんにちは!
日本システムデザイン Pepper担当のスエヨシです。
前回までのチュートリアル的な内容と比べると急に難しくなりますが、今回は「オウム返しアプリ」を作ってみたいと思います。

◆どうやって実現する?

まず、今回作ろうとしているアプリの具体的な仕様としましては、
「人が話しかけた内容を、内容の如何に関わらず音声認識で認識・取得して、その内容をそのまま発話する」
というものを想定しています。

この仕様を実現する方法としてまず思いついたのは、
「SpeechReco ボックスの認識対象に適当な言葉を一つ設定しておけば、設定した言葉以外の全てを onNothing 出力で取得できるのではないか」というものでした。

しかし、Pepper技術ブログ:はじめてのPepperアプリ開発(その3)の記事内で説明しているとおり、SpeechReco の onNothing 出力には戻り値は定義されていない為、「設定した言葉以外を認識した場合の認識内容を取得」といったことはできません。onNothing 出力は設定した言葉を認識できなかった場合の分岐先としてしか使用できない、ということですね。
かといって、wordRecognized 出力で認識した情報を取得するためには SpeechReco ボックスに認識させたい言葉を設定しておく必要がありますが、今回の「オウム返し」を実現しようとするのであれば考えうる言葉を全て設定しなければならないわけで、これもまた現実的ではありません。

では、SpeechReco ボックスが今回の仕様にそぐわないのであれば、どうしましょうか。

調べたところ、同様の内容を検証されている方がいらっしゃいました。
こちらの記事によると、QiChat スクリプトの文法を使用すればオウム返しを実現できるとのことですので、早速 Dialog と QiChat スクリプトについて調べてみましょう。

前回の記事で紹介した通り、Pepper に対話機能を実装する方法としては、SpeechReco 以外のもう一つの方法として Dialog があります。前回の紹介内容では割愛しましたが、Dialog の QiChat スクリプトには柔軟な対話を実現するために色々な文法が用意されています。
というわけで、Dialog(QiChat) の機能でオウム返しを実現できるか否か、まずは公式ドキュメントをよく見てみましょう。
ALDialog – Aldebaran documentation(公式ドキュメント ※英語)
QiChat – Aldebaran documentation(公式ドキュメント ※英語)



はい。
見つかりました。

・ワイルドカード( Wildcard: * )

u:(私の名前は * です) お会いできて光栄です。

→任意の単語・フレーズとマッチングさせる記号。上記の例では「私の名前は○○です」という問いかけであれば全て対話が成立し、Pepper は「お会いできて光栄です。」と答えます。

・入力保存( Input storing: _ )

u:(私の名前は _* です) お会いできて光栄です、$1 さん

→人の問いかけの中に出てきた特定の言葉を取得・再利用する記号です。ワイルドカードと組み合わせると、当該箇所のすべての言葉を音声認識で取得できます。再利用する際は、入力保存を設定した順に、特殊変数 $1、$2、$3、…… を使用して取り出します。上記の例では「私の名前は○○です」という問いかけであれば全て対話が成立し、入力保存にて「○○」の部分を取得、Pepper はそれを再利用して「お会いできて光栄です、○○ さん」と答えます。

以上の文法を利用すると、

u:(_*) $1

このように1行記述すれば、最初に想定した「人が話しかけた内容を、内容の如何に関わらず音声認識で認識・取得して、その内容をそのまま発話する」という仕様を実現できることになります。

◆実装してみました

前項で検討した方式を踏まえて、実際に実装したアプリの内容がこちらになります。

20160413_chrg_parrot_speech
実装例

色々複雑に組まれているように見えますが、今回やりたかった「オウム返しアプリ」としての主処理は ParrotDialog に定義した QiChat スクリプト(スクリーンショット内のスクリプトエディタ参照)だけで実現できています。前項で検討した通り「ワイルドカードと入力保存を組み合わせて問いかけ内容を取得・再利用」を1行で記述し、Dialog を停止させる為の処理として「おわり」の問いかけでの対話が1行、合わせてたったの2行です。

その他の部分は、
・会話言語の設定(SetLanguage)
・オウム返しを開始する旨の発話(最初の Say)
・Dialog での音声認識の閾値を調整する為の Python スクリプト(DialogSettingScript)
・オウム返しを終了する旨の発話(最後の Say)
・終了ボタンを配置した画面と、それをタブレットに表示する処理(index.html と ShowApp)
・終了ボタン押下時の処理(ビヘイビア root のメモリ入力から Dialog の onStop への接続)
等の機能を実装しており、アプリらしい振る舞いをするように調整してあります。

以上、オウム返しアプリが完成しました。

実際に動作確認してみたところ、ちゃんとPepperくんがオウム返ししてくれました。
ただ、「スエヨシ」と話しかけて「スエキチ」と返してくる等、話しかける言葉によっては正しく認識しない場合もあるので、問いかけられる言葉は想定できる範囲でちゃんと記述して明示するなどしたほうが良いのかもしれません。
また、公式ドキュメントの記載によると、ワイルドカードを多用しすぎると自動音声認識のパフォーマンスが落ちる、らしいです。やはりワイルドカードの乱用はあまりよろしくないかもしれませんね。

弊社ではPepperのアプリケーション開発を行っています。
詳しくはこちらをご参照ください。

contact

ご相談・ご質問等ございましたら、お気軽にお問い合わせください。

翻訳