C++で、会話を認識させ語らせる

Choregrapheを使わずに、C++モジュールを作成し、人の言葉を認識させ、それにもとづいて言葉をしゃべらせる。

ここでは、「話しなさい」という人の言葉に対して、「了解しました。話をしましょう。」と返事をさせるようにプログラムを改訂した(元は、exampleに入っているものを利用した)。言語設定などのおよその手続きが理解できた。
つぎは、ALDialogで、qichatのトピックファイルをロードし、会話をコントロールさせることだが、できるだろうか。

C++モジュール作成とPythonからの呼び出し

C++モジュール作成とPythonからの呼び出しについて、こちらで解説した。
これをやりながら実感としてわかったことは、naoqiで登場するremote moduleという概念の意味である。naoqiにはremoto moduleとlocal moduleという二つのモジュール類型がある。(こちらを参照
よくわからなかったが、結局、われわれが普通に感じるモジュールは、ローカルモジュールに相当する。ライブラリは、普通そのメインのプログラムが動くコンピュータの中に入っている。そういうものがローカルモジュールである。これに対してリモートモジュールとは、当該コンピュータ(ここでは、ロボット)の中にあるのではなく、外からそれとネットワークを経由してつながっているコンピュータの中にあるモジュールで、そのコンピュータで起動して、ロボットが利用することになるものである。
リモートモジュールを、こちらであるように実際動かしてみるとその意味がくっきりと分かる。

ロボットのログ

ロボット本体のログはさまざまなものから見ることができるが最も重要なのは次の方法である。sshでロボット本体のOS (基本的にLinux)にログインし、
tail -f /var/volatile/var/log/naoqi/tail-naoqi.log
とすれば、逐次にログがとれる。ログのある場所が普通とちょっと違う。
他に、Choregrapheをつないでいるときは、ログウィンドウに表示される。
ただし、Choregrapheのログは要約的で、Choregrapheのことしか拾ってこないが、上記の/var/logにあるログは徹底的に詳細である。詳細すぎると言っても良い。

顔の認識

一昨日、環境クイズに使ったQiChatスクリプトの挨拶部分に、顔認識を組み込むことにした。要するに、顔を名前とともに、覚えさせ、顔を見せるとその名前を呼び起こして、答えるというものである。
choregrapheboxis
図の、(1)が、挨拶に関わるDialogのボックスである。(2)は、覚えた顔をすべて忘れるという機能のボックス、(3)は、顔を覚えるための機能を持ったボックス、(4)は、顔をデータベースの中からひろって、認識するボックスである。ボックスは、常に左が入力で、右が出力なのだが、この場合、出力のすべてをDialogボックスに戻している。
以上に関わる、QiChatスクリプトは次のようなものだ。
--------------------------
concept:(hello) [こんにちわ はじめまして]
concept:(humans) [わしだ さかうえ はやし のなか ふじもと]
concept:(forgetFaces) [顔を全部忘れなさい 顔を忘れなさい]
concept:(rememberMe) [私を覚えていますか 私のことを覚えていますか 僕を覚えていますか 僕のことを覚えていますか]
# 顔を覚えているかどうかを確かめる
u:(~rememberMe) ちょっと待ってください。^activate(recognizedAnswer) $faceRecog = 1
# 記憶している顔データをすべて削除する
u:(~forgetFaces) わかりました。 $forgetAllFaces = 1
u:(~hello) ~hello 、お会いできてうれしいです。、僕の名前はわっしー、君の名前は? 名前は、なになにです、ってこたえてね。
u:(名前は _~humans です) $1 さんですね。よろしく、お願いします。$name = $1 顔を覚えますので、5秒間、私をみてください。 $learnFace = $name
# 入力のrecognizedFace変数が変化すると、eventが発生して、これを言うことになるはずだが
u:(e:recognizedFace) %recognizedAnswer $recognizedFace さんですね。ちゃんと、覚えていますよ。^deactivate(recognizedAnswer)
# 顔は認識できたが、8秒以上かけても、データベースの顔に一致しない。
u:(e:detectedNotRecog) 申し訳ありません、あなたの顔を覚えていません。
# 顔記憶に関する処理
u:(e:successToLearn) 覚えることができました。
u:(e:failToLearn) 覚えることができませんでした。
u:(e:successToDelete) すべて忘れました。
u:(e:failToDelete) 忘れることができませんでした。
---------------------------------
ポイントは、Dialogボックスの外でしゃべらせないことだ。もう一度戻して、Dialogボックスの中で、しゃべらせる。そうしないと、外でしゃべった自分の言葉を、人の言葉と錯覚して、聞き取れないときの応答としているeventを発生させてしまうからだ。
スクリプトは、ちゃんと、予想通りの動きをしているのだが、顔の認識が悪いようで、別な人物の名前を答えてしまう。はて、困った。

お知らせ

ヒューマノイド(人型)ロボットに関する内覧会
人形ロボットが社会的に注目されています。当研究室では、NAOというフランスAldebaran社製のロボットを購入し、人とのコミュニケーションをとおした教育(特に環境教育)や福祉、会社業務などに利用できないかと研究をしております。
このようなことに関心を持っている学生のみなさんに、ロボットの実際の動きや会話、プログラミングの方法などについてご覧いただく機会を以下に提供します。本学の学生であるならば、自由に参加できます。
日時:8月8日(金)13時~15時
場所:2号館15階1522会議室
主催:上智大学ロボット研究会
http://robo.genv.sophia.ac.jp/wp_robot/
希望者は、事前に toyo@genv.sophia.ac.jp (鷲田)までメールください。