一昨日、環境クイズに使ったQiChatスクリプトの挨拶部分に、顔認識を組み込むことにした。要するに、顔を名前とともに、覚えさせ、顔を見せるとその名前を呼び起こして、答えるというものである。
図の、(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を発生させてしまうからだ。
スクリプトは、ちゃんと、予想通りの動きをしているのだが、顔の認識が悪いようで、別な人物の名前を答えてしまう。はて、困った。