対話してみよう


今度は音声認識機能を使って、ロボットとおしゃべり(対話)してみましょう。

音声認識機能もクラウドサーバへの接続を行うため、インターネットが利用できるネットワーク環境で動作させてください。



音声認識を使うブロックはいくつか存在しますが、ここでは一番シンプルな「音声認識(ベストスコア)」を使います。ツールボックスより、音声認識(ベストスコア)のブロックをドラッグ&ドロップしてください。ドロップ先は何もない場所を選び、どこにも接続されない形でクラスに追加してください。

image2_009.png




音声認識のブロックは分岐構造になっています。分岐構造を持つブロックは、開始・終了のブロック間に複数のコネクタを持ち、各コネクタごとに分岐条件を設定します。ブロックの実行時には、上のコネクタから順番に条件が成立するかを確認し、条件が成立した場合、そこに接続されたブロックへ進みます。

image2_010.png



音声認識(ベストスコア)のブロックは、初期設定で2個の分岐を持ち、各分岐の条件は、上側が「こんにちはと聞き取れた場合」、下側が「そうでない場合」となります。この設定を使って、まずは「こんにちは」と話しかけたらロボットが「こんにちは」と返し、それ以外の場合は「何ですか?」と返すプログラムを作りましょう。



まずは各ブロックをつなぎかえます。まずは、既にメソッドにつながっている発話ブロックを切り離し、代わりに音声認識ブロックをつなぎます。

つながったブロックの切り離しは、キーボードのSHIFTキーを押しながらブロックをドラッグ&ドロップします。発話ブロックを、SHIFTキーを押しながらドラッグして切り離してください。

image2_011.png




次に、音声認識ブロックをメソッドに接続します。クラスウィンドウ内のブロックを接続する方法は3通りあり、本項目で順次説明していきます。まずは、コネクタ同士を隣接する方法を説明します。

音声認識の開始側ブロックをドラッグし、下図のようにメソッドの開始側ブロックのコネクタに隣接させてください。隣接するとそれぞれのブロックのコネクタが http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image057.png (接続可能)になります。この状態でマウスのボタンを離し、接続してください。

image2_012.png




次に音声認識ブロックと発話ブロックをつなぎます。今度は、ブロックを接続先のコネクタにドラッグ&ドロップする方法を説明します。

発話ブロックを、音声認識ブロックの上側の分岐のコネクタへドラッグしてください。ドラッグするとコネクタが http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image057.png (接続可能)になるので、そこでドロップしてブロックを接続してください。

image2_013.png

ついでに、プログラムを見やすくするため各ブロックをドラッグして見やすい場所に移動・整列させてください。

続いて、音声認識の下側の分岐(「こんにちは以外が聞き取れた・聞き取りに失敗した」)のプログラムを作ります。もう一つ発話ブロックをクラスにドラッグ&ドロップして下さい。

発話ブロックを追加したら、音声認識ブロックと接続します。音声認識の下側の分岐のコネクタをドラッグしてください。ドラッグすると矢印が伸びるので、その矢印を追加した発話ブロックにドラッグ&ドロップしてください。

image2_014.png


最後に、追加した発話ブロックをクリックして、プロパティウィンドウよりsay_wordsの設定を「こんにちは」から「何ですか?」に変えてください。

image2_015.png



プログラムが完成したら実行してみましょう。実行すると、ロボットの目が水色に変化して認識を開始するので、額にあるマイクに向かって「こんにちは」と話しかけましょう。「こんにちは」と正しく聞き取れた場合はロボットが「こんにちは」と返し、うまく聞き取れなかったり別の言葉を話しかけると「何ですか?」と返します。

マイクに近すぎたり遠すぎたりすると正しく聞き取れない場合があります。




  • ○分岐条件を追加してみる

    次に、音声認識ブロックに条件分岐を追加して、「名前は?」と聞いたら「Sotaです」と答えるようにしてみましょう。

    分岐に関する設定は、プロパティウィンドウに表示されません。分岐構造を持つブロックをダブルクリックし、条件分岐の設定ダイアログを別途開いて行います。

    image2_016.png

    条件分岐の設定ダイアログは、左側にブロックに登録された分岐条件をリストアップし、左側で選んだ分岐条件の詳細設定を右側に表示します。

    それでは、音声認識ブロックをダブルクリックして、分岐の設定画面を開いてください。開いたら「条件の挿入」をクリックし、新しく分岐条件をリストに追加してください。続いて、リスト上に追加された分岐をクリックして画面右側にその設定を表示し、wordの項目をダブルクリックして「名前は」に設定してください。

    image2_017.png

    設定ができたら「OK」をクリックして条件分岐の設定ダイアログを閉じてください。ダイアログを閉じると、音声認識のブロックが縦に伸びて、条件分岐が一つ追加されます。追加された条件のコネクタに、新しい発話ブロックをドラッグ&ドロップして接続し、発話内容(say_words)を「ソータです」に書き換えてください。

    image2_018.png


    ここまで作成できたらプログラムを実行し、ロボットに「名前は」と話しかけてみましょう。正しく認識されたら「Sotaです」と返答します。




  • ○認識結果を確認する

    音声認識の認識結果は、テスト実行中にコンソールウィンドウに逐次表示されます。本ロボットの音声認識機能は、一つの発話に対して複数の認識候補を返します。各候補にはScoreという値も設定され、Scoreが高いほど実際に聞き取れた音声に近くなります。音声認識(ベストスコア)ブロックは、認識結果の候補の中に分岐条件のwordで設定したワードと完全一致する物があれば、条件が成立します。

    image2_019.png

    例えば名前を尋ねるとき、「名前は?」や「お名前は?」等、人によって多少発言の揺らぎがあったり、また周囲の雑音などで明確に聞き取れない場合があります。これに対して「名前は?」と言う発話がしっかり認識できた場合しか対応できないと柔軟な対話ができませんが、このように可能性が低いものも含めて複数の候補を返せることで、柔軟な対話が実装しやすくなります。

    ただ、なかなか目的の言葉が認識されない場合、認識ワードと実際の認識候補が大きく異なる場合があるため、認識結果を参考に条件分岐の認識ワードの方を調整しましょう。

    また、認識結果の多くには句読点(「。」や「、」)が付きません。認識精度が悪い場合、認識結果に含まれない句読点を入れたりしていないか確認してみましょう。



    ちなみに、更に柔軟な認識に対応したい場合、音声認識(正規表現)と言うブロックが用意されています。例えば「いい天気」というワードに対応したい場合、普通の会話では「今日は良い天気ですね」や「いい天気だな」など、対象ワードを含んだ長文を人間がしゃべることが多く、発言が大きく揺らぎます。この場合、認識結果で「いい天気」だけの候補が出ることが非常に難しくなります。そこで、音声認識(正規表現)ブロックでは認識ワードに正規表現を含めて、完全一致ではなく部分一致も含めた判定ができます。

    image2_020.png

    音声認識(正規表現)ブロックの詳細や正規表現については、説明すると長くなるためここでは省略します。基本的に音声認識(ベストスコア)ブロックと同様に、各分岐に認識ワード(word)の項目を設定でき、ここに正規表現を含めた記述ができるようになっています。




  • ○無限ループを追加して、対話を続ける。

    今のプログラムでは、一度対話を行ったらプログラムを終了してしまいますが、一般的な対話はお互いのやり取りを何度も繰り返します。次はプログラムに繰り返しを入れて、対話を続けるようにしましょう。

    繰り返し機能を持つブロックは本ソフトウェアに何種類か備わっていますが、ここでは扱いが簡単な無限ループを使います。まずプログラムに「無限ループ(while)」のブロックを追加(ドラッグ&ドロップ)してください。無限ループはメソッドのように開始・終了ブロックを持ち、この間に挟んだ処理(ブロック)を繰り返し実行します。今から、メソッドブロックから音声認識・発話ブロックのまとまりを切り離して無限ループブロックにつなぎ変え、無限ループブロックの中に音声認識・発話ブロックのまとまりをつなぎ直します。

    まずは音声認識・発話ブロックを切り離します。ブロックをまとめて操作する場合、ブロックの選択機能を使います。クラスウィンドウの何もないところをドラッグすると水色の枠を表示し、音声認識・発話ブロックをこの枠に重ねてください。枠とブロックを重ねると、ブロック内の色が一部変わって選択状態になります。その状態で、今度はSHIFTキーを押しながら音声認識ブロックをドラッグしてください。ドラッグすると、ブロックを切り離しつつまとめて移動できます。

    image2_021.png

    このように、ブロックを選択状態にすると、移動・接続・切り離し等をまとめて行うことができます。ただし、接続・切り離しはドラッグしたブロックが基点になります。今回のプログラムでは、音声認識ブロックをSHIFTキー+ドラッグすると意図したまとまりで切り離されますが、中の発話ブロックをドラッグすると、音声認識ブロックは切り離されずドラッグした発話ブロックのみ切り離されます。

    次に、メソッドと無限ループを接続して下さい。接続方法は先に紹介した3種類のどの方法でも問題ありません。続いて、切り離した音声認識・発話ブロックのまとまりを無限ループに接続します。この時も、ブロックをまとめて選択し、音声認識の開始側ブロックをドラッグして無限ループの開始側ブロックと接続してください。

    image2_022.png


    プログラムができたら実行し、ロボットが何度も音声認識を行うようになったか確認してみましょう。

    これで繰り返し対話することはできましたが、今度はずっと対話を繰り返して終了できなくなったので、もう少し手を加えて「さようなら」と言うワードを認識したら「バイバイ」と言ってプログラムを終了するようにしましょう。

    まずは「さようなら」のワードに対応する仕組みを作ります。音声認識ブロックをダブルクリックして分岐の設定画面を表示し、先程のように新しい条件を挿入して、認識ワード(word)を「さようなら」に設定してください。条件を設定したら、そこに新しく発話ブロックを追加し、発話内容(say_words)を「バイバイ」に設定してください。

    image2_023.png


    これで「さようなら」に対する反応が出来たので、続いて「break」のブロックを使って、無限ループから抜ける処理を組み込みます。ツールボックスよりbreakブロックをドラッグ&ドロップし、「バイバイ」の発話ブロックの後に接続してください。

    image2_024.png

    繰り返し構造のブロックは種類によって繰り返す条件の設定があります。無限ループは無条件で繰り返すためこの設定はありませんが、他には「指定の回数だけ繰り返す」等の条件を指定でき、この条件が成立するまで処理が繰り返されます。しかし、breakブロックを使うと、条件が成立していない場合でも強制的に繰り返しを終了し、繰り返しが終わった後の命令までジャンプします。

    image2_025.png

    以上でプログラムは完成です。実行して「さようなら」と話しかけると「バイバイ」と言ってプログラムを終了するか確認してみましょう。



    次は、作成したプログラムをロボットに転送して、ロボット単体で実行させてみましょう。
    目次  次のページへ>>