• 追加された行はこの色です。
  • 削除された行はこの色です。
#topicpath

*顔と名前を覚えさせてみよう [#z2813afc]

#contents

顔認識や音声認識の機能に関連して、発話の中から人の名前を取得したり、検出した顔の特徴を記憶して個人を特定するブロックが備わっています。

これらを利用することで、より深いコミュニケーションプログラムを作ることができます。また、これらの機能は変数を利用します。


それでは、実際にプログラムを作成しながら、それらの機能の使い方を説明していきます。

本項目のプログラムも新しいメソッドで作成していきます。クラスウィンドウにメソッドのブロックをドラッグ&ドロップし、エクスプローラよりそのメソッドをメインメソッドに設定してください。



~
~顔認識や音声認識のを使ったブロックには、発話の中から人の名前を取得したり、検出した顔の特徴を記憶して個人を特定するものも備わっています。人の名前を呼んだり顔を覚えたりすると、より深いコミュニケーションプログラムを作ることができます。それでは、これらの機能を使ったプログラムを作成してみましょう。また、併せて本ソフトウェア及びjava言語の「変数」を使ったプログラムについても説明します。
~
~
~
~
-○名前を取得するメソッドを追加する
~
~本ページのプログラムも、新しいメソッドを追加して作成していきます。クラスウィンドウにメソッドブロックをドラッグ&ドロップし、methodNameを「getName」に変更しましょう。続いて、エクスプローラよりgetNameメソッドをメインメソッドに設定してください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_047.png,70%)
~
~
~
-○ロボットに自分の名前を聞き取らせてしゃべらせてみる


名前の取得ブロックは、ロボットが聞き取った言葉の中から人名だけを認識する機能です。例えばロボットに「私は山田太郎と言います」と話しかけると、その中から「山田太郎」だけを認識することができます。


まずはロボットに自分の名前を話しかけて復唱させてみたいと思います。まず、名前の取得ブロックをドラッグ&ドロップし、メソッドに接続してください。


名前の取得ブロックは分岐構造になっていますが、音声認識ブロックのように名前に対する分岐を行うのではなく、分岐条件は「名前を聞き取ることができたかどうか」の二択で固定されています。

認識した人名は speechRecogResult という変数に文字列として代入され、他の命令ブロックよりこの変数を参照する形で利用します。


それでは、名前の取得ブロックの上側の分岐(名前が聞き取れた場合)に発話ブロックを追加してください。


次に、発話ブロックの設定項目より、say_word内の「変数選択」欄をクリックしてください。クリックすると項目右端にプルダウンボタン([▼]マーク)を表示します。


表示されたプルダウンボタンをクリックすると、下に選択肢が表示されます。この中から speechRecogResult をクリックしてください。


ここまでプログラムを作成したら、一度実行してみましょう。ロボットの目が水色になって音声認識を開始したら、「私は○○です」のように人名を含む文章を話しかけてみて、ロボットがその中の人名だけを返答するか確認してみてください。

名前によっては認識しづらい場合があるので、上手く認識しない場合は「山田」など比較的一般的な名前で試してみてください。


このプログラムでは、ロボットの発話がこれまでのような固定されたワードではなく、認識した名前に応じて変化します。これは、発話ブロックが参照している変数speechRecogResultの内容が名前の取得を行うたびに変化しており、発話ブロックはその時のspeechRecogResultが記録している内容を読み上げているためです。

このように、変数を利用することで、プログラムを柔軟に変化させたり、様々なブロックで同じ情報を共有したりすることができます。


~
~聞き取った言葉から名前だけを認識する場合、名前の取得ブロックを使います。このブロックを使って音声認識を行うと、「私は山田太郎と言います」のような文章の中から「山田」や「太郎」と言った人名だけを認識することができます。
~それでは、ロボットに自分の名前を話しかけて復唱させてみたいと思います。まず、名前の取得ブロックをgetNameメソッドに追加・接続してください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_048.png,70%)
~
~名前の取得ブロックは分岐構造になっていますが、それぞれの分岐は「名前が取得できた」(上側)、「名前を取得できなかった」(下側)で固定されており、音声認識ブロックのように、各条件に認識したい文字列を設定することができません。認識した人名は speechRecogResult という変数に文字列として代入され、他の命令ブロックよりこの変数を参照する形で利用します。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_049.png,70%)
~
~「変数」とは、何らかの情報を記録しておくための箱のようなものです。これまでのプログラムでも、顔認識における「年齢」や「笑顔の度合い」などを使いましたが、このように実行中に取得した数値を変数に記録しておくことで、後から別のブロックでその内容を参照して処理を行うことができます。
~記録できる情報には文字列や数値などがありますが、各変数には記録できる情報の種類があらかじめ決められています。例えば speechRecogResult は文字列を記録するための変数であり、数字等それ以外の情報は記録できません。
~
~
~実はこれまで多用してきた発話ブロックには、「こんにちは」等の決まった文章以外に、変数に記録した文字列を指定することができます。これを使って、名前を取得できたら発話ブロックに 変数speechRecogResult の内容をしゃべらせてみましょう。
~名前の取得ブロックの上側の分岐に発話ブロックを接続し、これまでと同じくsay_wordをダブルクリックして設定画面を開いてください。画面を開いたら「」ボタンをクリックしてください。クリックするとその隣のリストボックスが操作できるようになるので、右端のプルダウンボタン([▼]マーク)をクリックしてください。
~表示されたプルダウンボタンをクリックすると、ブロックで使用できる変数が一覧表示されます。この中から speechRecogResult をクリックしてください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_050.png,65%)
~
~これで、発話ブロックは変数speechRecogResult に記録された情報をしゃべるようになります。名前の取得が成功すれば必ず speechRecogResult に人名が入るので、これで取得した名前を発話できます。
~
~
~プログラムを作成したら実行してみましょう。ロボットの目が水色になって音声認識を開始したら、「私は○○です」のように人名を含む文章を話しかけてみて、ロボットがその中の人名だけを返答するか確認してみてください。
~
|名前によっては認識しづらい場合があるので、上手く認識しない場合は「山田」など比較的一般的な名前で試してみてください。|
~
~
~
このように、変数を利用することで、ロボットの動作を柔軟に変化させたり、様々なブロックで同じ情報を共有したりすることができます。
~
~
~
----
-○変数を使って名前を文章に組み込む


speechRecogResultで名前をしゃべらせることには成功しましたが、この変数には名前しか記録されていないので、そのままでは「あなたの名前は○○です」のような文章を発話できません。

そこで、新たに変数を作成し、前後の文字列と名前を組み合わせて文章を作ります。


新しい変数の作成は、変数宣言ブロックを使います。変数宣言ブロックをドラッグ&ドロップし、発話ブロックの前につないでください。ブロックをつないだらクリックして設定項目を表示してください。


変数宣言ブロックの設定項目では、変数の名前(name)・変数の型(type)・初期値(initParam)をそれぞれ設定します。

変数の名前には、他に存在する変数と重複しない名前を付けます。ここでは「speechText」と命名してください。


変数にはそれぞれ数値・文字列等記録できる情報の種類(型)が決められており、変数の作成時に対応する型を設定する必要があります。speechRecogResultは文字列を扱う「String」という型なので、typeの項目は同じ「String」を選択してください。


初期値は、作成する変数に最初に記憶させる内容を設定します。ここでは名前の前に来る「あなたの名前は」を(定数:String)の欄に入力してください。


次に、変数の演算によって「あなたの名前は」の後に人名を付け足します。演算ブロックをドラッグ&ドロップし、変数宣言ブロックの後ろにつないでください。


演算ブロックは、任意の変数に値を記憶させたり、変数の現在値に対する演算を行うことができます。演算の概要は変数の型によって異なり、数値型の場合は四則演算、文字列型の場合は文字列同士の結合が可能です。


ブロックの設定項目には、演算する変数(left)・演算方法(ccalc)・演算に使用する定数及び変数(right)があります。ここでは先ほど作成したString型の変数speechTextに、同じくString型の変数speechRecogResultを結合します。left及びrightの(変数選択)欄には、前者にspeechTextを、後者にspeechRecogResultを、それぞれ設定してください。また、ccalcは「+=」を設定してください。
この設定により、speechText("あなたの名前は") + speechRecogResult("○○") という文字列の結合が行われます。


最後に語尾「です。」を追加します。演算ブロックを隣にもう一つ接続し、leftとccalcは先ほどと同様に「speechText」・「+=」をそれぞれ設定してください。rightは(定数:String)の欄に「です。」と入力してください。

変数speechTextの文字列が完成したら、発話ブロックのword内(変数選択)欄もspeechTextに変更して、作成した文字列が発話されるようにしましょう。


ここまで作成したらプログラムを実行してみてください。先ほどと同じくロボットに自分の名前を話しかけると、「あなたの名前は○○です。」とロボットが返せば正しくプログラムを作成できています。文字列の一部しかしゃべらない場合は、演算ブロックのccalcの設定が「=」のままになっている可能性があります。また、ビルドエラーが出る場合、ccalcの設定がおかしい、または変数の初期値設定や演算ブロックのrightの項目の設定が間違っている可能性があります。




~
~ここまでのプログラムで、名前を変数に取得してしゃべらせることには成功しましたが、speechRecogResult には名前しか記録されていないので、「あなたの名前は○○です」のような文章を発話できません。人名の発話ブロックの前後に「あなたの名前は」と「です」という発話ブロックを追加すれば文章をしゃべりますが、各発話ブロックに不自然な「間」ができてしまいます。
~きれいな発音にするためには、「あなたの名前は」と speechRecogResult  と「です」の三つの文字列をくっつけて一つの文章を作る必要があります。このように、複数の情報を加算したりする場合、変数の「演算」を利用します。それでは、次の手順で、新しく変数を作り名前を含む文章を加算していきましょう。
~
~
~
~まず、発話させる文章を記録しておく変数を一つ作成します。変数の作成は、変数宣言ブロックを使います。変数宣言ブロックをドラッグ&ドロップし、発話ブロックの前につないでください。
~
~
ブロックをつないだらクリックして設定項目を表示してください。変数宣言ブロックの設定項目では、変数の名前(name)・変数の型(type)・初期値(initParam)をそれぞれ設定します。
~変数の名前には、他に存在する変数と重複しない名前を付けます。ここでは「speechText」と命名してください。
~変数の型は、先に説明した「その変数が記録できる情報の種類」です。文字列を扱う型は「String」なので、typeの項目は「String」を選択してください。
~初期値は、作成する変数に最初に記憶させる内容を設定します。ここでは名前の前に来る「あなたの名前は」を(定数:String)の欄に入力してください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_051.png,65%)
~
~
~
~次に、変数の演算によって、 speechText に、取得した人名と語尾(「です」)を加算します。変数の演算には、演算ブロックを使用します。変数宣言ブロックの後ろに演算ブロックを追加・接続してください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_052.png,70%)
~
~
~演算ブロックは、任意の変数に値を記憶させたり、変数の現在値に対する演算を行うことができます。演算の概要は変数の型によって異なり、数値型の場合は四則演算、文字列型の場合は文字列同士の結合が可能です。
~ブロックの設定項目には、演算する変数(left)・演算方法(ccalc)・演算に使用する定数及び変数(right)があります。ここでは先ほど作成したString型の変数speechTextに、同じくString型の変数speechRecogResultを結合します。left及びrightの(変数選択)欄には、前者にspeechTextを、後者にspeechRecogResultを、それぞれ設定してください。また、ccalcは「+=」を設定してください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_053.png,70%)
~
~この設定により、speechText("あなたの名前は") + speechRecogResult("○○") という文字列の結合が行われます。
~
~
~最後に、変数speechTextに語尾「です。」を追加します。先程設定した演算ブロックの後ろに、もう一つ演算ブロックを追加・接続してください。
~追加したらブロックの設定を表示してください。こちらの演算も先程と同様に 変数speechText に文章を加算します。両者の違いは、加算する内容が 変数(speechRecogResult)か定数(「です」)かと言う点のみです。そのため、「left」には「speechText」、「ccalc」には「+=」をそれぞれ設定し、「right」には「定数:String」で「です。」と設定してください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_054.png,60%)
~
~以上の2回の演算で、変数speechTextに人名を含む文章が完成します。続いて発話ブロックのwordも「変数選択」で 変数speechTextに変更して、作成した文章が発話されるようにしましょう。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_055.png,70%)
~
~ここまで作成したらプログラムを実行してみてください。先ほどと同じくロボットに自分の名前を話しかけ、「あなたの名前は○○です。」とロボットが返せば正しくプログラムを作成できています。
~文字列の一部しかしゃべらない場合は、演算ブロックのccalcの設定が「=」のままになっている可能性があります。また、ビルドエラーが出る場合、ccalcの設定がおかしい、または変数の初期値設定や演算ブロックのrightの項目の設定が間違っている可能性があります。
~
~
~
----
-○ロボットに顔を覚えさせてみる
~
~次に、顔認識の「顔の特徴取得」の機能を利用して、自分の顔と名前をロボットに覚えさせてみましょう。今回のプログラムは、未登録の顔の場合のみ名前を聞いて登録し、既に登録済み顔の場合は登録された名前をしゃべるようにします。
~顔の特徴取得は、顔追従(検出)の最中でのみ行うことができます。まずは、過去のチュートリアルを参考に、新しいメソッドで以下のように顔追従のプログラムを作成してください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_057.png,70%)

~追加したメソッドの名前はgetFaceに変更し、エクスプローラからメインメソッドに切り替えてください。
~
~
~次に、顔が見つかったらその特徴検出を行う処理を作ります。顔が見つかったか?の上側の分岐(見つかった)に、ツールボックスより顔の特徴検出のブロックを追加・接続してください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_058.png,70%)
~このブロックは、顔認識の機能で見つかった顔に関する特徴を取得し、変数faceuserに代入します。また、見つかった顔がロボットに登録されている顔と一致した場合、その名前を変数GlobalVariable.facenameに代入します。
~
~
~
~次に、見つかった顔が登録済みかどうかを判断し、登録済みの顔であればその名前をしゃべる処理を作成します。見つかった顔が登録済みかどうかは「登録された顔か」のブロックを使います。ツールボックスよりこのブロックをドラッグ&ドロップし、顔の特徴検出ブロックの後ろに接続してください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_059.png,70%)
~
~「登録された顔か」のブロックは、上側の分岐が登録された(知っている)顔である場合、下側の分岐がそうでない(登録されていない)場合にそれぞれあたります。上側の分岐に発話ブロックを追加し、saywordを 変数GlobalVariable.facename に設定すれば、とりあえず名前をしゃべらせることは可能ですが、できれば名前取得で行ったように、一つ変数を作り、名前を含んだ文章を喋るようにしてみましょう。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_060.png,70%)
~
~
~
~次に、知らない顔の場合に名前を聞いて登録する処理を作ります。ここでは、本ページ冒頭で作成した名前の取得メソッド(getName)を改造して、聞き取った名前を登録するように変えてみます。
~まずはエクスプローラより getNameメソッドをドラッグ&ドロップし、「登録された顔か」の下側の分岐(未登録の顔である)に接続してください。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_061.png,70%)
~
~
~
~getNameメソッド

次に、顔認識機能を利用して、自分の顔と名前をロボットに覚えさせてみましょう。今回のプログラムは、未登録の顔の場合のみ名前を聞いて登録し、既に登録済み顔の場合は登録された名前をしゃべるようにします。
~まずメソッドの最初に「あなたの名前は?」と発話させましょう。名前が取得できたら「あなたは○○さんだね」と言った後に、取得した名前と顔情報(特徴)をロボットに登録します。顔の登録処理には、「顔の登録」ブロックを使用します。このブロックにはusernameという設定項目があり、ここに登録する人の名前を設定します。ここでは、名前の取得ブロックによって人名が記録された 変数speechRecogResult を選択してください。また、その後ろに発話ブロックを追加し、「覚えたよ」としゃべらせましょう。
~そして、名前が取得できなかった場合の下側の分岐にも発話ブロックを追加し、「ごめんなさい、聞き取れなかったよ」としゃべらせましょう。
~
#ref(http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_062.png,90%)
~
~
~
~
~以上で、顔を覚えるプログラムの完成です。プログラムを実行して動作確認してみましょう。最初は自分の顔がロボットに登録されていないため、顔と名前を登録する処理に必ず進みます。そして、一度顔を登録したら、次に顔が見つかった際に、ちゃんと登録時の名前で「○○さんだね」と発話するか確認してみましょう。
~
~ちなみに、覚えた顔を個別に削除する場合は登録した顔の削除ブロックを使います。この時、削除する人の名前を使うので、顔の特徴の取得や名前の取得を使って、消す人の名前をプログラムから取得しましょう。
~また、登録した顔をすべて削除する場合は、登録した顔のクリアブロックを使います。
~
~
~
~
[[目次>MenuBar]]  [[次のページへ>>>../基本的な対話ルーチンを作ろう]]


顔をロボットに登録する場合は、必ず顔追従(検出)の中で行う必要があります。まずは、以下のように顔を追従して見つかったかどうかで分岐を行うプログラム構造を作成してください。


次に、ツールボックスより顔の特徴検出のブロックをドラッグ&ドロップし、顔が見つかった場合の分岐へ接続してください。このブロックは、顔認識の機能で見つかった顔に関する特徴を取得し、変数faceuserに代入します。更に既に登録済みの顔の場合、その名前を変数GlobalVariable.facenameに代入します。


次に、見つかった顔が登録済みかどうかを判断します。この判断は「登録された顔か」のブロックで行います。ツールボックスよりこのブロックをドラッグ&ドロップし、顔の特徴検出ブロックの後ろに接続してください。


「登録された顔か」のブロックは、上側の分岐が登録された(知っている)顔である場合、下側の分岐がそうでない(登録されていない)場合にそれぞれあたります。


まずは、知っている顔の場合名前をしゃべるようにしましょう。「登録された顔か」の上側の分岐に発話ブロックを一つ追加し、say_wordの(変数選択)欄でGlobalVariable.facenameを選択してください。これで、一度正しく顔が登録されたら、次はその顔の名前をしゃべるようになります。



次に、知らない顔の場合に名前を聞いて登録する処理を作ります。
「登録された顔か」の下側の分岐(登録された顔である)に発話ブロックを追加し、say_wordの(定数入力:String)に「名前を言ってください」と設定しましょう。


その後に名前の取得ブロックを追加し、先程作成した名前取得のサンプルのようにそれぞれの分岐に発話ブロックを追加して、名前を取得できた側の発話ブロックにはsay_wordの(変数選択)にspeechRecogResultを、取得でいなかった側の発話ブロックにはsay_wordの(定数入力:String)に「聞き取れませんでした」を、それぞれ設定してください。

続いて実際に顔を登録する処理を追加します。名前を聞き取れた側の分岐に顔の登録ブロックをドラッグ&ドロップしてください。このブロックは、顔の特徴検出で取得した顔情報に名前を付けてロボットに登録します。設定項目のusernameが登録する顔の名前になります。ここでは、usernameの(変数選択)欄に、聞き取った名前を記憶した変数speechRecogResultを選択して下さい。


顔を覚えたら、覚えられたことをわかりやすくするため、「○○さんだね、覚えたよ」としゃべらせてみましょう。
変数宣言でString型の変数「addUser」を作り、initParamの(変数選択)でspeechRecogResultを選びましょう。
続いて演算ブロックを追加し、ccalcを「+=」に、leftの(変数選択)をaddUserに、rightの(定数入力:String)を「さんだね、覚えたよ。」にしてください。



以上で、顔を覚えるプログラムの完成です。プログラムを実行して動作確認してみましょう。



ちなみに、覚えた顔を個別に削除する場合は登録した顔の削除ブロックを使います。この時、削除する人の名前を使うので、顔の特徴の取得や名前の取得を使って、消す人の名前をプログラムから取得しましょう。
また、登録した顔をすべて削除する場合は、登録した顔のクリアブロックを使います。