Top / VstoneMagicを使ってみる / プログラミング / 基本的な対話ルーチンを作ろう

基本的な対話ルーチンを作ろう


それでは、ここまでの内容を組み合わせて、対話ルーチンの基礎を作ってみましょう。次のような受け答えができるようにしてみましょう。

  • ①顔追従で周囲の人を探す
  • ②顔を見つけたら挨拶し、音声対話を開始
  • ③以下の言葉に対応する
    • 「こんにちは」→「こんにちは」と返答
    • 「私は誰」→知っている顔ならその名前を返答し、知らない顔なら名前を聞いて登録する
    • 「忘れて」→登録済みの顔を全て削除する
    • 「いくつに見える」→顔の年齢を返答
    • 「今何時」→現在時刻を返答
    • 「さようなら」→「バイバイ」と返答して音声対話を終了する
    • それ以外→「何ですか?」と返答



  • ○新しいクラスの作成

    今回のプログラムは、これまでのmymainクラスではなく、別のクラスに作っていきます。まずはワークスペースに新しいクラスを追加しましょう。

    クラスを追加する場合、追加するパッケージ(ここでは「jp.co.mysota」)を右クリックし、表示されるポップアップメニューより「新規」→「クラス」をクリックしてください。クリックすると追加するクラスの設定画面を開くので、「クラス名」を「talk」、「テンプレート」を「sota」にして「OK」をクリックしてください。クリックすると、エクスプローラに新しいクラスが追加されます。

    image2_064.png


    新しいクラス「talk」を追加したら、エクスプローラからダブルクリックしてクラスウィンドウを開きましょう。追加したクラスにはメソッドが一つもないので、メソッドブロックを一つドラッグ&ドロップして下さい。

    メソッドの名前は「talkmain」に設定し、エクスプローラの「talkmain()」を右クリックしてメインメソッドに設定してください。

    image2_065.png




  • ○顔認識処理の作成

    まずは、顔を認識して挨拶をするところまで作ります。最初に「待機動作の開始」ブロックをドラッグ&ドロップしてtalkmainメソッドに接続しましょう。

    続いて以前のチュートリアルで作成した顔認識プログラムと同様に、「顔追従」「無限ループ」「顔が見つかったか」のブロックをドラッグ&ドロップしてtalkmainメソッドに接続しましょう。そして、「顔が見つかったか」の上側の分岐に発話ブロックを追加しましょう。

    image2_066.png

    これで、「①顔追従で周囲の人を探す」の部分まで作成できました。一度プログラムを実行して正しく動作するか確認してみましょう。顔が見つかった場合に「こんにちは」とロボットがしゃべれば正しくプログラムできています。



  • ○音声対話部分の処理の作成

    次に音声対話のプログラムを作ります。以前のチュートリアルと同様に、音声対話部分は別のメソッドで作りましょう。メソッドブロックを追加し、メソッド名を「speechRecog」に設定してください。続いて、speechRecogメソッドに「無限ループ」「音声認識(ベストスコア)」のブロックをそれぞれ追加・接続しましょう。

    image2_067.png


    次に、speechRecogメソッドをtalkmainメソッドから呼び出す部分を作ります。エクスプローラより「speechRecog()」をドラッグ&ドロップし、talkmainメソッドの発話ブロックの後に接続してください。

    image2_068.png



    続いて、実際の対話部分を作っていきます。音声認識ブロックの条件分岐を変更しましょう。音声認識ブロックをダブルクリックして、条件分岐の設定画面を開いてください。

    条件分岐の設定画面を開いたら、「条件の挿入」をクリックして、条件分岐の数を7個に増やしてください。各条件の設定(word)は、上から順番に以下のように設定してください。

    • 1.「こんにちは」
    • 2.「私は誰」
    • 3.「忘れて」
    • 4.「いくつに見える」
    • 5.「今何時」
    • 6.「さようなら」
    • 7.else

    image2_069.png

    「こんにちは」と「else」の条件は最初から登録されているので変更する必要はありません。また、条件の並びを変更する場合は、左側リストより変更する分岐をクリックし、「↑」「↓」ボタンをクリックしてください。


    条件分岐を追加したら、各分岐の内容を作っていきます。まずは「こんにちは」「さようなら」「else」の三つの内容を作りましょう。それぞれの分岐に発話ブロックを追加し、最初に説明した仕様の通り、発話内容を「こんにちは」「バイバイ」「何ですか?」にそれぞれ設定しましょう。また、「さようなら」の分岐で音声対話を終了するため、発話ブロックの後にbreakブロックを追加しましょう。

    image2_070.png



    ここまでプログラムができたら、一度実行してみましょう。顔を見つけたら音声対話を開始し、「こんにちは」「さようなら」に反応する、また、「さようなら」に反応したら音声対話を終了すれば、正しくプログラムできています。

    それでは、次の項目より残りの条件分岐も作っていきます。



  • ○知っている顔なら名前を返し、知らない顔なら覚えさせる

    次は「私は誰」の分岐部分をプログラミングします。この分岐は、ロボットが知っている(登録済みの)顔ならその名前を返し、知らない顔ならロボットが名前を訪ねて新しく覚えさせる(登録する)ようにします。

    まずは、「知っている顔なら名前を答える」という部分を作りましょう。まずは「私は誰」の分岐の先に「顔の特徴の取得」ブロックを追加・接続し、訪ねた人の顔の特徴を取得させます。ブロックの下側の分岐は「顔が見えなかったよ」と発話させ、上側の分岐は更に細かくプログラミングします。

    続いて「登録された顔か」のブロックを接続し、知っている顔の場合と、知らない顔及び顔の特徴が取得できない場合に分岐させましょう。更に、それぞれの分岐に発話ブロックを追加してください。

    上側の分岐の発話ブロックは、登録済みの顔の名前を発話させます。登録済みの顔の場合、名前は変数GlobalVariable.facename に記録されるので、これを組み込んだ文章を作ります。発話ブロックのsay_wordsで「自由入力」をクリックし、「GlobalVariable.facename+"さんだね。"」と設定してください。

    下側の分岐の発話ブロックは「知らないよ。よかったら名前を教えてね」と設定しましょう。

    image2_071.png



    次に、知らない顔の場合に名前を聞いて登録する処理を作ります。「登録された顔か」の下側の分岐の発話ブロックの後ろに、「名前の取得」ブロックを追加してください。ブロックを追加したら、それぞれの分岐に発話ブロックを追加し、名前を取得できたら自由入力で「speechRecogResult+"さんだね、覚えとくよ。"」、取得できなかったら「名前がわからなかったよ」と発話させましょう。

    image3_025.png

    続いて、聞き取れた名前でロボットに顔を登録します。顔の登録は前のページで説明したように精度の良い顔情報が取得できるまで繰り返す構造を作成します。プログラムの規模が少し大きくなるため、別のメソッドに切り分けて作成しましょう。

    顔を登録するメソッドは、前のページの「getUser」メソッドと同じものを作成してください。

    image3_026.png

    getUserメソッドを作成したら、先ほどの名前を取得ブロックの上側の分岐に、getUserメソッドを追加してください。

    image3_027.png

    以上で顔の判別・登録の処理は完成です。


  • ○登録した顔を忘れさせる

    続いて、「忘れて」の分岐内容を作成します。ここではプログラムを簡単にするため、全ての顔を忘れる方法でプログラミングします。

    「忘れて」の分岐に、発話ブロック・登録した顔のクリア(全消去)のブロックを順番に接続してください。発話の内容は「忘れるよ」に設定してください。また、これまで作成した部分とブロックが被ってくるので、「こんにちは」「私は誰」の分岐内容のブロックを上側に移動させましょう。

    image2_073.png

    顔を忘れるプログラムは以上で作成完了です。一度プログラムを実行して、顔を覚えたり忘れたりできるようになっているか確認してみましょう。

    ちなみに、「登録した顔の削除」ブロックを使うと、顔を一人ずつ削除できます。使い方は、覚える場合と同じく「顔の特徴を取得して、知っている顔の場合のみ、取得した名前で削除する」という流れになります。ここでは詳しい説明を省略しますが、よかったら一度プログラミングしてみましょう。




  • ○いくつに見えるかを聞かれたら答える

    次に、「いくつに見える」の分岐の内容を作り、いくつに見えるか聞かれたら年齢を答えるようにします。年齢を使用したプログラムは以前のチュートリアルで作成しましたが、その時は分岐構造でプログラミングしました。しかし、年齢そのものを発話させる場合、1歳毎に分岐を作るのは現実的に無理なので、年齢を数値として変数に取得し、それを発話させます。

    「年齢の取得」ブロックは、検出した顔の年齢を、変数faceDetectResultAge に記録します。まずは「いくつに見える」の分岐にこのブロックを追加してください。続いて発話ブロックを追加し、年齢をしゃべらせてみましょう。

    発話ブロックの設定の前に、変数に関する補足説明をします。チュートリアルの変数の説明で「変数には文字列や数値など記録できる情報型が決まっており、異なる型を記録できない」と説明しましたが、java言語の仕様として、「文字列型に数値型を加算すると、数値を文字列に変換して文章を追加する」ということができます。ここではそれを利用して、数値型のまま文章を作ります。発話ブロックの設定を「自由入力」で「"あなたは"+faceDetectResultAge+"歳ですね"」にしてください。

    image2_074.png



    プログラムができたら実行して年齢を発話できるか確認してみましょう。ビルドエラーが出る場合、発話ブロックの設定に問題がある可能性があります。前述の内容の通りに設定しているか、確認してください。



  • ○時間を聞かれたら答える

    次に、「今何時」の分岐の内容を作ります。時刻の取得は「時刻の取得」ブロックを使うことで可能になります。このブロックは、ロボット内のカレンダーに設定された時刻を取得し、変数time_string に文字列として記録します。まずはこのブロックを「今何時」の分岐に追加しましょう。

    次に、発話ブロックで時刻をしゃべらせます。変数time_string は文字列型なので、名前の発話の時と同じように文章を作ることができます。発話ブロックの設定は、自由入力で「"今は"+time_string+"です"」としてください。

    image2_075.png




    多くのプログラムがロボットとの対話によって操作を進めるため、ここで作成したプログラムをベースとして利用できます。チュートリアルで触れていないブロックについては、「命令ブロック」のページを参照してください。

    次は、音声認識機能を利用したプログラムの中断(キャンセル)について紹介します。

    目次  次のページへ>>