見出し画像

Pepperの九九出題アプリを作ってみよう②答えを聞き取ろう(後編:Pepperで試す。プログラムの不具合を調査・修正する/デバッグ)【ミワ ムラタのRobo Blocks奮闘記】

こんにちは!Robo Blocksチームのムラタ ミワです。プログラミング初心者ながら、プログラミングツールRobo Blocksを担当しています。

さあ、九九出題アプリを作ってみようシリーズの3回目です。これまで、ランダムでかけ算九九の出題をし、ユーザーの答えを聞き取るロジックを作ってきました。

前回に引き続き、ユーザーの答えを聞き取るプログラム作りに挑戦しましょう!前回は、パソコン上でプログラムを作成し、聞き取りが成功するところまで確認できました。今回は、いよいよロボットのPepperで動かしていきたいと思います!

とはいえ、、実は、九九出題アプリを作るにあたって、わたしが最も苦労したのが、Pepperで正しく聞き取れるようにすることでした。パソコン上ではうまくいっても、Pepperは想定通りに聞き取ってくれない、なんてことも!今回は、Roboblocks中級者の皆さんにも、参考にしていただけるコツがあるかもしれません。

パソコン上でのプログラミングにとどまらず、ロボットのPepperを使って試行錯誤する辺りは、RoboBlocksならではの体験です。謎解きのような、頭を使う過程でもあります。是非、試行錯誤する工程も楽しんで取り組んでいただければと思います!

ゴール

  • Pepperが、ユーザーの回答を聞き取る

  • Pepperが、ユーザーの回答の正解/不正解を判定する

  • Pepperが、正解/不正解の結果をユーザーに伝える

ポイント

  1. 聞き取り終了を忘れずに!

  2. うまくいかないときの調査方法(デバッグのヒント)

  3. ワイルドカードを使ってみよう!

  4. 聞き取り精度を高めよう!

作ってみよう

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で動かすとうまくいかないこともあるんですね!不具合の調査・修正(デバッグ)方法についても参考にしていただければと思います。

今回のポイント

  1. 聞き取り終了を忘れずに!

  2. うまくいかないときの調査方法

  3. ワイルドカードを使ってみよう!

  4. 聞き取り精度を高めよう!

前回の記事

次回の記事

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ソフトバンクロボティクス株式会社 ホームページ
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ブログ編集部━┛