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

*基本的な対話ルーチンを作ろう [#xb8ddbf7]

#contents


ここまでのプログラムを組み合わせて、対話ルーチンの基礎を作りましょう。

具体的には、次のような動作を行うプログラムを作りましょう。

①顔追従で周囲の人を探す
②顔を見つけたら挨拶。知っている人なら名前を言う。知らない人なら「はじめまして」と言う
③以下の言葉に対応する
 「こんにちは」→「こんにちは」を返す
 「覚えて」→名前を聞いて覚える
 「忘れて」→知っている顔なら登録削除する
 「さようなら」→音声対話を終了する


-○顔認識処理の作成


まずは、顔を認識して、知っている人か知らない人かで別の挨拶をするところまで作りましょう。


顔追従のプログラムを作り、顔が見つかったら顔の特徴取得のブロックで特徴を取得、続いて知っている顔か?のブロックで、知っている場合は「こんにちは○○さん」、知らない場合は「始めまして」と発話させましょう。


ここまで作成したらプログラムを実行し、正しく認識・発話するか確認してみましょう。


また、動作の見栄えを良くするため、顔を見つけたら「顔追従のサーチの可否」ブロックを追加してfaceSerchをfalseにし、しゃべっている間は顔を見失ってもきょろきょろしないようにしましょう。しゃべり終えたら、もう一つ「顔追従のサーチの可否」ブロックを追加してfaceSerchをtrueにし、再度見回すようにしましょう。

あと、プログラムの最初に「待機動作の開始」を追加して、常にロボットが動くようにしましょう。


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


次に音声対話のプログラムを別のメソッドで作りましょう。

顔追従のプログラムをメインメソッドに設定し、顔が見つかった後の分岐を



次に音声対話の部分を作りましょう。
全ての処理を同じメソッドに入れてしまうとプログラムが見づらくなってしまうため、音声対話の処理は、別のメソッドを追加してそちらに作っていきましょう。

メソッド名は「talk」としておきましょう。

メソッドを追加したら、音声認識(ベストスコア)ブロックを一つつなげて、それぞれの分岐に発話ブロックをつなげてください。
そして、それぞれの発話ブロックに対して、「こんにちは」の分岐側には「こんにちは」、そうでない場合の分岐側には「何ですか?」と設定してください。

次に、顔認識のメインメソッドから音声対話のメソッドを呼び出すところを作ります。エクスプローラには現在クラスに存在するメソッドが一覧表示されており、このリストから呼び出したいメソッドをツールボックスのようにクラスウィンドウへドラッグ&ドロップすると、そのメソッドを呼び出すブロックが作成されます。

それでは、エクスプローラからtalkメソッドをドラッグ&ドロップして、顔認識のメソッドの顔が見つかったか?ブロックの後につなげましょう。


ここまでできたら一度プログラムを実行してみましょう。顔が見つかったら挨拶し、その後音声認識に進みます。目が水色になったらロボットに「こんにちは」と話しかけて、ロボットが「こんにちは」と返すか確認しましょう。



このプログラムを実行して気になった人もいると思いますが、一度音声認識(対話)が終わると、いちいち「顔を見つけて挨拶する」所からやり直しになります。これでは対話している感じにならないので、ロボットに「さようなら」と話しかけるまで音声対話部分(talkメソッド)だけを繰り返すようにします。

音声対話部分だけを繰り返すには、顔追従と同じく無限ループのブロックでtalkメソッドの中身を一括でくくります。

また、「さようなら」の声に反応するために、音声認識ブロックに「さようなら」の分岐を追加します。
ブロックをダブルクリックして「条件の追加」をクリックし、追加された条件に「さようなら」を設定してください。


続いて「さようなら」の分岐に発話ブロックを追加し、「じゃあね、バイバイ」と設定しましょう。

これで「さようなら」の言葉に反応することができるようになりましたが、繰り返しを抜ける処理が無いので、もう一つ処理の追加が必要です。


無限ループなどの繰り返し構造を途中で抜けるためには、breakブロックを使います。繰り返し構造の最中にbreakブロックを実行すると、現在の繰り返し条件に関わらず、そこで繰り返しのブロックの後につながったブロックへジャンプします。

それでは、「じゃあね、バイバイ」の発話ブロックの後に、「breakブロック」をドラッグ&ドロップを追加して接続してください。


プログラムができたら実行してみましょう。一度顔を見つけて挨拶したら、後は音声認識部分だけを繰り返すようになっているか確認してみましょう。また、「さようなら」と話しかけると、次に顔を見つけたら挨拶の部分からやり直すようになっているか確認してみましょう。




-○顔の登録と削除


次に、顔の登録・削除部分を作ります。まず音声認識の分岐を追加しましょう。音声認識ブロックをダブルクリックして、「条件の追加」で二つ分岐を追加し、それぞれの分岐のwordを「覚えて」「忘れて」にしてください。


まずは顔を覚える方を作成します。「覚えて」の分岐に「知っている顔か?」のブロックを接続し、それぞれの分岐に発話ブロックをつなげてください。


顔の登録は知らない(未登録)人だけに行いたいので、下側の分岐(知っている顔ではない)の方にプログラミングします。下側の分岐に発話ブロックと名前の取得ブロックをつなげて、発話ブロックは「名前を教えてください」と設定してください。

名前の取得ブロックの内容は、以前作成した顔登録のブロックと同じ内容にします。以前のチュートリアルを参考に、上側の分岐(名前が取得できた)には「○○さんだね。覚えたよ」としゃべらせて、顔の登録ブロックで変数speechResultに記録された名前を登録します。下側の分岐(名前が取得できなかった)には発話ブロックを一つつなげて、「名前がわからなかったよ」としゃべらせましょう。




今度は、顔の削除機能を作成します。顔の削除は音声認識の「忘れて」の分岐先にプログラミングしていきます。


まず、「忘れて」の分岐の先に「知っている顔か?」のブロックを接続し、それぞれの分岐に発話ブロックをつなげてください。

顔の登録と逆に、今度は知っている顔の場合のみに削除処理を実行したいので、「知っている顔か?」ブロックの上側の分岐(登録された顔)に





以上が、対話処理の基本構造となります。これをベースにすることで、様々なロボットのプログラムを作成することができるようになります。

チュートリアルで触れていないブロックについては、「命令ブロック」のページを参照してください。