【Scratch 2019】Scratch を使い音声で車を操作 ＋ 音声合成（2019/12/25）

この記事は 「[Scratch Advent Calendar 2019](https://qiita.com/advent-calendar/2019/scratch)」の 最終日、25日目の記事です。
今年はアドベントカレンダー用の記事を毎日書き続けたのですが、ついに最終日（連続25日目）！

また、Scratch Advent Calendar に関して、今年は以下の 4つの記事を投稿済みで、今回で5つ目の記事となります。

【今月書いた記事のリスト】

1. [機械学習・音声認識・デバイス連携の独自拡張（2019/12/6）](https://note.com/youtoy/n/nba3960d52ccb)
2. [画像認識・デバイス連携・関連の独自拡張（2019/12/7）](https://note.com/youtoy/n/n8cae77447867)
3. [Scratch と micro:bit で鳴き声がする動物パズルを作る（2019/12/12）](https://qiita.com/youtoy/items/91b6b8521bc2eead63d9)
4.  [Scratch と micro:Maqueen を連携させる（2019/12/19）](https://qiita.com/youtoy/items/342ae2a7c9ae5c115895)

## はじめに

最終日も、これまでの記事で多く登場していた [Junya Ishihara（@ jishiha）さん](https://twitter.com/jishiha)が公開されている[独自環境の Scratch](https://champierre.github.io/scratch3/)、そこで利用可能な独自拡張機能を題材にしようと思います。
最終日は、複数の拡張機能の組み合わせを試してみようと思います。

## 2つの独自拡張機能を組み合わせる

今回、組み合わせて試す拡張機能は、以下の 2つの独自拡張機能＋公式の拡張機能 1つです。

- Speech2Scratch 【音声認識】 （※ 独自拡張）
- Scratch2Maqueen （※ 独自拡張）
- 音声合成

### 【実現すること】 声で micro:Maqueen を操作

まずは、今回のゴールとなる内容を動画でご覧ください。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/jishiha?ref_src=twsrc%5Etfw">@jishiha</a> さんが作られた Scratch の独自拡張機能の中の 2つ、<br>Speech2Scratch（音声認識）と Scratch2Maqueen を使って、声で車を操作してみたよ。<br><br>また、公式の拡張機能の音声合成も組み合わせてみました。 <a href="https://t.co/s5860TUrxL">pic.twitter.com/s5860TUrxL</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1209498528004726785?ref_src=twsrc%5Etfw">December 24, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

声で「前進・後退・右折・左折」の何れかの指示をだすと、それに応じて micro:Maqueen が動きつつ、音声合成機能で動く方向をしゃべる、という内容になっています。
それでは、具体的にプログラムの内容を見ていこうと思います。

### 大まかな手順

プログラムの内容に触れる前に、全体の手順について記載します。
今回の内容を試すための手順は、おおまかには以下のとおりです。

1： micro:Maqueen の用意と、micro:bit への書き込み作業などの Scratch2Maqueen を使うための下準備（※ Scratch2Maqueen の準備については、上でも挙げた別記事「[Scratch と micro:Maqueen を連携させる](https://qiita.com/youtoy/items/342ae2a7c9ae5c115895)」の内容をご参照ください）
2： Junya Ishihara（@ jishiha）さんが公開されている[独自環境の Scratch](https://champierre.github.io/scratch3/)へアクセス
3： 3つの拡張機能を読み込む
4： プログラムを作成して実行

### プログラムについて

#### 全体

今回使ったプログラムの全体像は以下のとおりです。
上半分は、初期処理と音声認識関連の部分です。また、下半分が、micro:Maqueen を動かす部分になります。

<img width="430" alt="プログラム.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/14e7fb0e-2b18-4e09-c0f7-e3c34e85e701.jpeg">

この後、上と下のそれぞれの内容を見ていきます。

#### 上半分

こちらが、プログラムの上半分の部分です。

<img width="553" alt="プログラム：上.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d517cf32-e1f1-a158-8167-3f835646566c.jpeg">

初期化部分はブロック定義を使って、処理をひとまとめにしています。
そして、音声認識の前に少し待機の時間（今回は2秒）を入れてから音声認識を行い、5秒後に認識結果を変数へ格納しています。その後に、メッセージ機能を使い、音声認識後の処理（下半分の部分）へ進んでいく流れです。

上半分のプログラムの中でコスチュームの変更のブロックを入れていますが、これは「音声認識の待機・認識処理中・終了」の3状態を視覚的に分かりやすくするために入れました。
コスチュームは以下のようなものを使っていて、周囲に赤や青の輪っかが表示されていたり、何も表示されていなかったりという 3状態になります。

![コスチュームの変化.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/af68c86d-996d-8ea8-6c5c-e0deb4afcc9b.jpeg)

見た目上で青い輪っかが出ている間にしゃべった内容が、認識対象となるようなイメージです。

#### 下半分

こちらが、プログラムの下半分の部分です。

<img width="539" alt="プログラム：下.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b65498e9-7113-1b62-8fe6-c9392b598870.jpeg">

上半分で書かれたプログラムから「音声認識後」というメッセージが送られて来たら、この下半分のプログラムが実行されます。
micro:Maqueen を動かす部分は、初期化部分と同様にブロック定義を使って分離させています。
メインの処理は、音声認識の結果に含まれるキーワード（今回は「前、後ろ、右、左」の 4単語）によって条件分岐させ、micro:Maqueen の左右のモーターの制御の設定を変えるようにしています。

音声合成については「しゃべらせつつ、モーターを動かしつつ」という並列の処理にしたかったため、メッセージ機能を使って処理を分離しました（また、画像の左半分の部分のプログラムで、音声認識結果から 4つの条件分岐が行われた際に、音声合成でしゃべらせたい内容を変数に格納するようにしています）。

以上が今回作ったプログラムの内容です。

## さいごに

今回は、今月に既に書いていた Scratch関連の記事で取り上げていた、Scratch の独自拡張を複数組み合わせてみるというものでした。
今回使った環境の独自拡張機能は機械学習が行えるものなどもあり、それらも活用した何かを今後試せればと思います。