久しぶりに動かそう

今度は、ちゃんとしたコントをやらせようと思う。
今まで作ったシスデムでかなりこなせるはずだ。
多分、naoqiなど開発ツールは相当更新されていると思うが、頭が戻るまでは、今までのシステムをそのまま使う。
まず、自分が何を作ったのかを思い出そう。このサイトにほとんどが書いてあるので、それを追うしかない。
まず、ロボットの充電から始めるか。
潰してしまった32bitLinuxを作り直そうか。

音声認識エンジンの入れ替え

Naoqiの音声認識エンジンは、優れているのだろうが、気に入らない。最も気に入らないのは、ワイルドカードによる音声認識がほとんどできないことだ。しかしその難しさは理解できる。ので、なんとかこちらでも工夫をしたいと思っていた。
が、この間、電子書籍の検索とダウンロードをロボットとの対話で行おうとすると、なかなかやっかいなのだ。たとえば、「あ」で始まる著者を探すようにという指示をロボットに与える、Dialogを実現しようとしたが、こうした1語の認識すら難しい。事前に「あ い う ・・」などという、1語のconceptを事前に与えておいても、間違う。いろいろな工夫もあるだろうが、実に面倒になってきた。認識エンジンの細かい設定の調整ができればいいのだろうが、また、メソッドがあるので、そうした設定が可能であるかのようだが、なんら解説がない。
あのSiriのようなレベルのものがあれば良いと思う。
それは難しいにしても、なんとかならないかと探していたらjuliusというフリーソフトがある。試してみたら結構いけるし、細かい設定や、ルールの指定など、自由度が高い。
たとえば、なんのルールも設定せずに、
「わしだ」
という、名前の単語を認識できた。単語レベルでは果物の名前も、事前ルール抜きにほとんど認識できる。また、
「わたし名前はわしだです」
は、
「わたしの名前はわし出すです」
と、まちがったが、結構いけてる。多少のルールを追加すれば、この程度の文章は、完全認識に行けるような気がする。
ライブラリにもできるということなので、NaoqiのC++から、このライブラリを呼び出すことを試みようと思う。一つ不安は、ロボットのマイクデバイスをjuliusで呼び出すことができるかどうかだ。それさえ可能であれば、あとはなんとかなる。

ロボットに、epubフォーマット電子書籍を読み上げさせる

業界標準のepubフォーマットで組版された電子書籍を、ロボットNAOに読み上げさせるためのローカルモジュール(wsbook)を有限会社ネット書房と共同で開発した。

特徴は次のような点にある。
(1)ロボットとの対話で音読を制御できる
(2)ルビがふってある場合は、ルビの方を読み上げる
(3)指定されたファイル順に読み上げる
(4)ロボットが読み上げる1行には限界があるが、任意の場所で区切らずに、句読点(、。)などで区切った読み方にして、不自然さを回避する。
(5)読了を中止した場所を記憶して、その場所から再開する
(6)書籍の長さは、記憶領域以外の制限はない(長い本でも最後まで読み上げられる:1巻、2巻と分けれている場合は別だが)
(7)自分の書棚の本のリストを読み上げる
などの機能を組み込んだが、まだ、次のような問題はある。
(1)ルビがふっていない、旧仮名遣いの読み上げを間違える。(かなり高度な処理が求められる)
(2)ルビがふっていない、漢字の読みを間違える(学習させる必要があるが、たとえば、どのような状況で金を「かね」とよみ、また「きん」とよむか。文脈解析、自然言語処理の機能が必要になる)
(3)中止は、言葉によるか、前頭部タッチによるかだが、少しバタバタしている。
今後、
(1)ネット書房が有する青空文庫11,000冊のepub書籍を自由に、ロボットに直接(パソコンやスマホを介さずに)ダウンロードして読むことができるようにする。
(2)Gutenbergの30,000冊の英文書籍を読み上げられるようにする。
(3)ユーザーが有しているepub電子書籍を読めるようにする
などの対応を予定している。

ロボット演劇「ロミオとジュリエット」

ibotのテレパシー機能を使って、シグナルをやりとりして、会話のタイミングをとり、また、動作を行う。これの実証実験として、シェークスピアのロミオとジュリエットの有名な場面、第二幕、第一場、「キャピューレット家の庭園」の場面を演じさせてみた。

動きは、まだ、十分な演出を行っていないので、ある意味、適当だが、もっと凝らした演出は可能である。最後に、奥から乳母が呼ぶ声を、ピッチを上げた声でしゃべらしたら、裏声になっている、ちょっと笑う。最後の最後で、「充電不足」のメッセージが出てしまった。普通に充電していれば問題なかったのだが、つい怠った。
こうしたロボット演劇は、すでに、「夕鶴」でもやっていたのだが、そちらは著作権問題がややこしそうだったので、公開はやめた。こちらは、青空文庫の坪内逍遙の訳を、私が現代語に改めたもの。著作権問題はないので、公開している。
もっともっと、ロボットによる対話という技術、コミュニケーションという技術を高めて、ロボットにできることの限界を探っていきたい。それをとおして、「人間のコミュニケーション」への理解を深めたいと思う。

生き物はつながっている:教科書準拠、ぴっきー、のっきーのロボット対話

東京書籍の『新しい理科6』の「4 生き物の暮らしと環境」をはじめるにあたって、子供達に見せたら刺激になりそうな、ぴっきー、のっきーの対話です。ぴっきー、のっきーは、通常の人との対話のようなものもできますが、それでは会話が間延びしてしまうので、ibotのテレパシー機能を使って、対話を実現しています。

今回は特に、ロボット同士の対話の間に、児童との質問と回答のやりとりも挟んでいます。

虚構と真実について、ぴっきー、のっきーが語り合う

ibotのテレパシー機能を使って、ぴっきーとのっきーに語り合わせる例の2つめ。
truth
ロ­ボットの目から見て、人間が、虚構と真実を適当に妥協させて、生きているようにみえる­という話です。しかし、それが人間の持っている自由の表れであること、プログラム化する­自分たちとは違うことを議論させてみました。

1台のスマホで、複数ロボット制御

ロボットの台数スマホを用意するのは不合理だから1台のスマホで複数のロボットを同時に制御したい。基本的に、IPアドレスで区別し、それぞれセッションを立ち上げながら制御することになる。
最も大きな問題は、以下に簡単にスマホに全てのロボット情報を取り込むかだ。次のようにした。
すでにテレパシー機能で、ローカルネットに繋がっている全てのロボット情報を、ロボット自身が相互に把握し合うプロトコルを組み込んだ(とは言っても、昨日からこれを正常に機能させるのに苦労したが)。したがって、最も都合がいいのは、1代のロボットに接続すると、そのロボットが全ての他のロボットの情報も持っていることだ。
まず、全てのロボットのスイッチをオンにする。モジュールが組み込まれる。その後、頭のセンサーをタッチすると、他のロボットの探索を開始する。センサーをタッチされた全てのロボットが、相互にIPアドレスやロボット名を含めた情報を提供し合い確保する。
スマホ(ピノキオ)から、1台のロボットにアクセスする。全てのロボット情報をピノキオに取り込む。ピノキオで、対象ロボットを切り替えながら必要な制御をする。
頭のセンサータッチは、不注意でも発生するので、無効にする機能も用意すべきだろう。

顔の認識

一昨日、環境クイズに使った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を発生させてしまうからだ。
スクリプトは、ちゃんと、予想通りの動きをしているのだが、顔の認識が悪いようで、別な人物の名前を答えてしまう。はて、困った。