Pepperの九九出題アプリを作ってみよう②答えを聞き取ろう(後編:Pepperで試す。プログラムの不具合を調査・修正する/デバッグ)【ミワ ムラタのRobo Blocks奮闘記】
こんにちは!Robo Blocksチームのムラタ ミワです。プログラミング初心者ながら、プログラミングツールRobo Blocksを担当しています。
さあ、九九出題アプリを作ってみようシリーズの3回目です。これまで、ランダムでかけ算九九の出題をし、ユーザーの答えを聞き取るロジックを作ってきました。
前回に引き続き、ユーザーの答えを聞き取るプログラム作りに挑戦しましょう!前回は、パソコン上でプログラムを作成し、聞き取りが成功するところまで確認できました。今回は、いよいよロボットのPepperで動かしていきたいと思います!
とはいえ、、実は、九九出題アプリを作るにあたって、わたしが最も苦労したのが、Pepperで正しく聞き取れるようにすることでした。パソコン上ではうまくいっても、Pepperは想定通りに聞き取ってくれない、なんてことも!今回は、Roboblocks中級者の皆さんにも、参考にしていただけるコツがあるかもしれません。
パソコン上でのプログラミングにとどまらず、ロボットのPepperを使って試行錯誤する辺りは、RoboBlocksならではの体験です。謎解きのような、頭を使う過程でもあります。是非、試行錯誤する工程も楽しんで取り組んでいただければと思います!
ゴール
Pepperが、ユーザーの回答を聞き取る
Pepperが、ユーザーの回答の正解/不正解を判定する
Pepperが、正解/不正解の結果をユーザーに伝える
ポイント
聞き取り終了を忘れずに!
うまくいかないときの調査方法(デバッグのヒント)
ワイルドカードを使ってみよう!
聞き取り精度を高めよう!
作ってみよう
1. 聞き取り終了を忘れずに!
前回、作成したプログラムがこちら。パソコン上では、九九の出題に答え、正解すると「アタリ」の音「ピポン」、不正解のときにはハズレの音「ブブッ」が鳴り、正答を発表します。
ここまでできたら、Pepperで動かしてみましょう!
Pepperはちゃんと出題してくれるかな?ちょっと楽しみです。
意気揚々と臨んだ結果は、、、
なんとっ!
なんとっっ!
全然うまくいきません。。。
まず、うまくいかないこと1つ目。
答えを聞き取って反応した後も、さらに他の音も聞き取って、繰り返し反応してしまいます。
これは、Pepperの動作を観察していると原因が見えてきます。聞き取りモードがずっと継続しているために、次々と音を聞き取って反応してしまっているようです。Pepperは聞き取りモードのとき、目と耳が青く光るので、見た目でわかりやすいのです。
そこで、言葉を聞きとったときブロックのすぐ下に、聞き取り終了を配置します。これで、繰り返し聞き取って反応してしまう不具合を改善できました。
2. うまくいかないときの調査方法(デバッグのヒント)
次の課題は、、
正解のときは「アタリ」音が鳴るのですが、不正解を言っても全然「ハズレ」が鳴りません!なんなら、不正解のはずなのに「アタリ」音が鳴ったりします。
なぜ、、?!
Pepperが聞き取っている言葉が想定と違うのかも、、
Pepperが聞き取った言葉が何なのかを知る必要があります。
そんな、予期せぬ不具合が発生したときに、わたしがよく使った調査方法がこちら!
この「文字を表示」ブロックを使って、処理の各所でデータを見える化する方法です。
正解のとき、不正解のとき、それぞれPepperが聞き取った言葉がどんな値になっているのかを調べてみました。文字を表示する時間が必要なので、「1秒待つ」ブロックを追加しています。「1秒待つ」ブロックが無いと、表示時間が短すぎて読み取れません。
すると、、
正解のときは、当然、伝えた通り、出題された九九の「答え」と同じ値(正確には、小数点第1位まで。例:「40」と伝えると「40.0」と表示される)が表示されました。
が、不正解を伝えると、、
①不正解を伝えて、「アタリ」音も「ハズレ」音も鳴らないとき
ディスプレイ上の表示は何も動きませんでした!Pepperの目が緑に光って「トゥルッ」と音が鳴り(Pepperは、聞き取った時こんな反応をします)、まるで聞き取ったように見えていましたが、実は音に反応しているだけで、何も聞き取っていないのと一緒だったのです。
②不正解を伝えたにも関わらず、「アタリ」音が鳴るとき
伝えた言葉ではなく、出題された九九の答えの値が表示されました。つまり、不正解の答えを言ったにも関わらず、正解の値を聞き取ったことになっていたのです。
これにより、出題された九九の「答え」以外のワードが全く認識されていないことがわかりました!
このように、プログラムが想定通りに動いてくれない時は、処理の途中で、データの中身を確認することがとても有効です。想定通りのデータの値になっていなかったり、想定通りに受け渡されていなかったり、不具合の原因を特定するヒントになります。
この九九出題アプリを作る過程でも、何度もつまずき、何度もこの方法で解決策を探ってきました。
プログラムの誤りや欠陥(バグ)を見つけて修正することをデバッグと呼びます。デバッグを行う際のやり方として、参考にしていただければと思います。
3. ワイルドカードを使ってみよう!
さて、九九出題アプリに戻りましょう!
Pepperが聞き取った言葉の値を調べたところ、「答え」のワードしか聞き取っていないことがわかりました。「〜を聞きとるようにする」ブロックで指定したワードしか聞き取れていないということです。
実は、Pepperは、「〜を聞きとるようにする」ブロックで設定されたワード(以下、聞き取りワード)しか聞き取れないのです。聞き取りワードに近いか、そうでないか、で判断しています。そして、ちょっとでも聞き取りワードに近いと判断されると、それとして処理が進んでしまうので、聞き間違いも出てきてしまうのです。
今回のように、聞き取りワード以外も広くあまねく聞き取りたい場合にどうすれば良いのか、、、
その答えはこの記事に紹介されていました!
聞き取りワードにアスタリスク(*)を設定すると、ワイルドカードとして、いろんな言葉を聞きとってくれるようになるのです!なんとミラクル!まさに神の一手!
アスタリスク(*)の詳しい使い方はこちらの記事をご確認ください。
今回は、「答え」と、*を聞き取るようにします。通常は、聞き取りワードは、「はい;いいえ」のように、セミコロンで繋ぐことで複数の言葉を設定することが可能です。
しかし、「答え」は変数です。丸いブロックです。単純なセミコロンで繋ぐことはできません。どうやって繋ごうかな、、と思いついたのが3つのやり方。
①前回の記事でもご紹介した、文字列を繋ぐブロック。「おはようとこんにちは」ブロックを使うこと!
②「を聞き取るようにする」ブロックを2つ使うこと!
③「*」のみを聞き取るようにすること!
早速Pepperで動かして実験。
結果、成功したのは、②「を聞き取るようにする」ブロックを2つ使うこと!、③「*」のみを聞き取るようにすること!でした。
ついに「ハズレ」音を聞くことができました!
①は、残念ながら「ハズレ」音を鳴らすことはできず、正解ルートしか行けませんでした。
4. 聞き取り精度を高めよう!
さぁ、ワイルドカードで全てうまくいくのか、何回か実験を繰り返していると、20台の数字が聞き取れない場合があることが判明!
例えば、「5×4=」の出題に対して、「20」と回答すると、「二重」と聞き取っていたのです。これも、聞き取った言葉を、文字で表示する方法でわかったことです。
(20台の数字でも正しく聞き取ることの方が多かったので、絶対ではありません)
どうやって解決するか。ワイルドカードでは、20台の数字を数字として受け取ってくれない場合があるようです。不正解の聞き取りをカバーしようと使ったワイルドカードが、うまく機能してくれない。。
それならば、不正解のワードも全て聞き取りワードに設定してしまおう!という力技に出ることに。1から100までの数字全部を聞き取りワードに設定してしまうことにしました。9×9=81で、九九の答えは最大81なので、1から100までにしています。
1から100までの数字を手打ちしても良いてのですが、打ち間違いもあるので、このように変数を利用して聞き取りワードを作成することにしました。
「99回繰り返す」ブロック内の動きは下記の通りです。
(1巡目)
・聞き取りワード候補= 2
・聞き取りワード候補集= 1;2
(2巡目)
・聞き取りワード候補= 3
・聞き取りワード候補集= 1;2;3
このように99回繰り返すので、結果、聞き取りワード候補集は、「1;2;3〜99;100」となります。
早速実験してみると、ついに、20台の数字含め、正解/不正解が想定通りに動いてくれるようになりましたーーー!!!涙、涙です。
アスタリスク(*)を使った時よりもPepperの反応も速い気がします。
ちなみに、1〜100までの数字以外の言葉(おはよう、ペッパー、など)をPepperに話しかけると、1〜100までのいずれかの数字として認識してしまいます。聞き取った言葉の値を文字で表示するとわかります。
正解の数字は1/100のため、多くの場合、不正解の数字として認識され、結果、「ハズレ」音が鳴ることになります。使っていて違和感を感じることは少ないと思います。しかし、正解の数字として認識され、全く関係ないことを言ったのに「アタリ」音が鳴ってしまう可能性もあります。
これを解決すべく、下記のパターンを試したのですが、いずれも不発に終わりました。
①1〜100までの数字とアスタリスク(*)を「;」で繋いで聞き取りワードとする
こちらは、「20」を正しく「20」と認識できましたが、
1〜100までの数字以外の言葉(おはよう、ペッパー、など)を、1〜100までのいずれかの数字として認識してしまいました。
②「を聞き取るようにする」ブロックを2つ使って、1〜100までの数字とアスタリスク(*)を聞き取りワードとする
こちらは、1〜100までの数字以外の言葉(おはよう、ペッパー、など)を、正しく(おはよう、ペッパー、など)認識できましたが、
「20」を「二重」と認識してしまいました。
そんなこんなで、現時点では、1〜100までの数字を聞き取りワードにするのが、良いやり方かなと思っています。
もし、もっと良いやり方があれば教えてください!
今回、作成したプログラムはこちらです。
まとめ
今回は、ロボットのPepperを使って聞き取りの検証、不具合の調査・修正を行いました!正しく動くまで、なかなか手こずりました。パソコン上でうまくいっても、Pepperで動かすとうまくいかないこともあるんですね!不具合の調査・修正(デバッグ)方法についても参考にしていただければと思います。
今回のポイント
聞き取り終了を忘れずに!
うまくいかないときの調査方法
ワイルドカードを使ってみよう!
聞き取り精度を高めよう!
前回の記事
次回の記事
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ソフトバンクロボティクス株式会社 ホームページ
https://www.softbankrobotics.com/jp/
Pepper for Education
https://www.softbankrobotics.com/jp/product/education/
STREAMチャレンジ
https://www.softbankrobotics.com/jp/product/academy/stream/
━━━━━━━━━━━━━━━━━━━━Pepperブログ編集部━┛