Top / VstoneMagicを使ってみる / プログラミング / 顔と名前を覚えさせてみよう

顔と名前を覚えさせてみよう

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

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

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

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

  • ○ロボットに自分の名前を聞き取らせてしゃべらせてみる

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

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

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

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

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

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

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

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

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

このプログラムでは、ロボットの発話がこれまでのような固定されたワードではなく、認識した名前に応じて変化します。これは、発話ブロックが参照している変数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の項目の設定が間違っている可能性があります。

  • ○ロボットに顔を覚えさせてみる

次に、顔認識機能を利用して、自分の顔と名前をロボットに覚えさせてみましょう。今回のプログラムは、未登録の顔の場合のみ名前を聞いて登録し、既に登録済み顔の場合は登録された名前をしゃべるようにします。

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

次に、ツールボックスより顔の特徴検出のブロックをドラッグ&ドロップし、顔が見つかった場合の分岐へ接続してください。このブロックは、顔認識の機能で見つかった顔に関する特徴を取得し、変数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)を「さんだね、覚えたよ。」にしてください。

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

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