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の項目の設定が間違っている可能性があります。

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

まずは、以下のように顔を追従して見つかったかどうかで分岐を行うプログラム構造を作成してください。