TensorFlow Lite for Microcontrollers と SparkFun Edge を使用した AI 音声認識

1. はじめに

作成するアプリの概要

この Codelab では、TensorFlow Lite For Microcontrollers を使用して SparkFun Edge 開発ボードでディープ ラーニング モデルを実行する方法を学びます。ここでは、ボードの 2 つのマイクから発せられた「はい」と「いいえ」の単語を畳み込みニューラル ネットワークで検出する、ボードの組み込み音声検出モデルを使用します。

bf256d403a1821af.gif

マイクロコントローラでの ML

機械学習は、Google アシスタントなど、ユーザーの生活をより快適にするインテリジェントなツールを作成するために使用できます。しかし、多くの場合、こうしたエクスペリエンスには、強力なクラウド サーバーやデスクトップなどの多くの計算やリソースが必要になります。しかし、現在では、マイクロコントローラのような小型で低消費電力のハードウェアで機械学習の推論を実行できるようになりました。

マイクロコントローラは非常に一般的で安価であり、必要なエネルギーが非常に少なく、信頼性が高いです。家電製品、自動車、おもちゃなど、あらゆる種類の家庭用デバイスに組み込まれています。実際、毎年約 300 億台のマイクロコントローラ搭載デバイスが製造されています。

1360b61fbfa33657.jpeg

機械学習を小型のマイクロコントローラに導入することで、高価なハードウェアや信頼性の高いインターネット接続に依存することなく、日常生活で使用する数十億台のデバイスのインテリジェンスを高めることができます。毎日決まった仕事をこなせるスマート家電、動作の異常と正常を見分けられるインテリジェント工業センサー、子どもが自分で楽しく学習できる魅力的なおもちゃを想像してください。

TensorFlow Lite For Microcontrollers(ソフトウェア)

358ffdb9eb758b90.png

TensorFlow は、モデルのトレーニングと実行に使用される Google のオープンソースの ML フレームワークです。TensorFlow Lite は、ソフトウェア フレームワークであり、TensorFlow の最適化されたバージョンです。スマートフォンなどの小型で比較的低電力のデバイスで TensorFlow モデルを実行することを目的としています。

TensorFlow Lite For Microcontrollers は、マイクロコントローラなどの小型で低消費電力のハードウェアで TensorFlow モデルを実行することを目的とした、TensorFlow の最適化バージョンであるソフトウェア フレームワークです。この環境で必要な制約(バイナリ サイズが小さい、オペレーティング システムのサポート、標準の C / C++ ライブラリ、動的メモリ割り当てなどが不要)に準拠しています。

SparkFun Edge(ハードウェア)

SparkFun Edge は、マイクロコントローラ ベースのプラットフォームです。1 枚の回路基板に搭載された小型のコンピュータです。プロセッサ、メモリ、I/O ハードウェアを備えており、他のデバイスとの間でデジタル信号を送受信できます。ソフトウェアで制御可能な 4 つの LED が、お気に入りの Google カラーで搭載されています。

aa4493835a2338c6.png

パソコンとは異なり、マイクロコントローラはオペレーティング システムを実行しません。代わりに、作成したプログラムはハードウェア上で直接実行されます。コードはパソコンで記述し、プログラマーと呼ばれるデバイスを介してマイクロコントローラにダウンロードします。

マイクロコントローラは高性能なコンピュータではありません。プロセッサが小さく、メモリもあまりありません。マイクロコントローラは可能な限りシンプルになるように設計されているため、消費電力が非常に少なくなります。プログラムの内容によっては、SparkFun Edge は 1 個のボタン電池で数週間動作します。

学習内容

  • パソコンで SparkFun Edge のサンプル プログラムをコンパイルする
  • プログラムをデバイスにデプロイする
  • プログラムを変更して再デプロイする

必要なもの

次のハードウェアが必要です。

次のソフトウェアが必要です。

  • Git(コマンドラインで git を実行して、インストールされているかどうかを確認します)
  • Python 3(コマンドラインで python3 または python --version を実行して、インストールされているかどうかを確認します)
  • Python 3 用の Pip(StackOverflow の回答を参照)
  • 4.2.1 以上(コマンドラインで make --version を実行してインストールされているかどうかを確認)
  • SparkFun Serial Basic ドライバ

2. ハードウェアをセットアップする

SparkFun Edge マイクロコントローラには、音声モデルを実行できるバイナリがプリインストールされています。このモデルを独自のバージョンで上書きする前に、まずこのモデルを実行してみましょう。

ボードの電源を入れます。

  1. コイン型電池を基板の背面にある電池コネクタに挿入します(電池の「+」側を上に向けます)。ボードにバッテリーがすでに挿入されている場合は、プラスチックのタブを引き抜き、バッテリーを押し込んで完全に挿入されていることを確認します)。

25a6cc6b208e8a4e.png

  1. コイン電池がない場合は、SparkFun USB-C Serial Basic プログラマー デバイスを使用してボードに電力を供給できます。このデバイスをボードに取り付けるには、次の手順を行います。
  • SparkFun Edge の側面にある 6 ピン ヘッダーを見つけます。
  • SparkFun USB-C Serial Basic をこれらのピンに差し込みます。各デバイスの「BLK」と「GRN」のラベルが付いたピンが正しく並んでいることを確認してください。
  • SparkFun USB-C Serial Basic とパソコンを USB-C ケーブルで接続します。

b140822f0019f92a.png

バッテリーを挿入するか、USB プログラマーを接続してボードに電力を供給すると、ボードが起動し、マイクでリッスンを開始します。青色のライトが点滅し始めます。

ボード上の ML モデルは、「はい」と「いいえ」という単語を認識し、音声の有無を検出するようにトレーニングされています。結果は、色付きの LED を点灯することで伝えられます。次の表に、各 LED の色の意味を示します。

検出結果

LED の色

「はい」

「いいえ」

不明な音声

音声が検出されませんでした

LED が点灯していない

試してみる

ボードを口元に当てて、「はい」と数回言います。黄色の LED が点滅します。「はい」と答えても何も起こらない場合は、次の方法をお試しください。

  • 口から約 25 cm 離してボードを持ちます
  • 周囲の騒音が大きすぎないようにする
  • 「はい」を数回連続して繰り返す(「はいはいはい」と言ってみる)

3. ソフトウェアをセットアップする

次に、マイクロコントローラに音声モデルをダウンロードしてインストールし、実行します。そのため、まずこのプログラムのソースコードと、ビルドに必要な依存関係をダウンロードします。このプログラムは C++ で記述されており、ボードにダウンロードする前にバイナリにコンパイルする必要があります。バイナリは、SparkFun Edge ハードウェアで直接実行できる形式でプログラムを含むファイルです。

以下の手順は、Linux または MacOS を対象としています。

TensorFlow リポジトリをダウンロードする

コードは、GitHub の TensorFlow リポジトリの次の場所にあります。

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro

コンピュータでターミナルを開き、普段コーディング プロジェクトを保存しているディレクトリに移動して、以下のように TensorFlow リポジトリをダウンロードし、作成されたディレクトリに入ります。

cd ~  # change into your home (or any other) directory
git clone --depth 1 https://github.com/tensorflow/tensorflow.git
cd tensorflow

Python 依存関係をダウンロードする

Python 3 を使用してバイナリを準備し、デバイスに書き込みます。Python スクリプトは、特定のライブラリが使用可能であることを前提としています。次のコマンドを実行して、これらの依存関係をインストールします。

pip3 install pycrypto pyserial --user

4. バイナリをビルドして準備する

バイナリをビルドし、デバイスにダウンロードする準備を行うコマンドを実行します。

バイナリをビルドする

必要な依存関係をすべてダウンロードしてバイナリを作成するには、次のコマンドを実行します。

make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge micro_speech_bin

ビルドが正常に動作すると、出力の最終行は次のようになります。

arm-none-eabi-objcopy tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin -O binary

バイナリが正常に作成されたことを確認するには、次のコマンドを実行します。

test -f \
tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin && \
 echo "Binary was successfully created" || echo "Binary is missing"

コンソールに Binary was successfully created が出力されます。Binary is missing が表示された場合は、ビルドプロセスに問題が発生しており、デバッグが必要になります。

バイナリを準備する

バイナリは、デバイスにデプロイするために暗号鍵で署名する必要があります。次に、バイナリに署名して SparkFun Edge にダウンロードできるようにするコマンドを実行します。

次のコマンドを入力して、開発に使用できるダミーの暗号鍵を設定します。

cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info0.py tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info.py

次のコマンドを実行して、署名付きバイナリを作成します。

python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_image_blob.py \
--bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin \
--load-address 0xC000 \
--magic-num 0xCB \
-o main_nonsecure_ota \
--version 0x0

これにより、ファイル main_nonsecure_ota.bin が作成されます。次に、別のコマンドを実行して、次のステップで使用するブートローダー スクリプトでデバイスをフラッシュするために使用できるファイルの最終バージョンを作成します。

python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_wireupdate_blob.py \
--load-address 0x20000 \
--bin main_nonsecure_ota.bin \
-i 6 \
-o main_nonsecure_wire \
--options 0x1

コマンドを実行したディレクトリに main_nonsecure_wire.bin というファイルが作成されます。これがデバイスに書き込むファイルです。

5. バイナリをフラッシュする準備をします。

フラッシュとは

SparkFun Edge は、現在実行中のプログラムを 512 KB のフラッシュ メモリに保存します。ボードで新しいプログラムを実行する場合は、ボードに送信する必要があります。ボードは、以前に保存されたプログラムを上書きして、フラッシュ メモリに保存します。

このプロセスを「フラッシュ」と呼びます。これを使用して、プログラムをボードに送信します。

プログラマーをボードに取り付ける

ボードに新しいプログラムをダウンロードするには、SparkFun USB-C Serial Basic シリアル プログラマーを使用します。このデバイスを使用すると、パソコンは USB 経由でマイクロコントローラと通信できます。

このデバイスをボードに取り付けるには、次の手順を行います。

  1. SparkFun Edge の側面にある 6 ピン ヘッダーを見つけます。
  2. SparkFun USB-C Serial Basic をこれらのピンに差し込みます。各デバイスの「BLK」と「GRN」のラベルが付いたピンが正しく並んでいることを確認してください。

b140822f0019f92a.png

プログラマーをパソコンに接続する

ボードを USB 経由でパソコンに接続します。ボードをプログラミングするには、パソコンがデバイスに割り当てた名前を知る必要があります。この方法としては、接続前と接続後のコンピュータのデバイスをすべてリストアップし、どのデバイスが新しいかを確認するのが最適です。

USB 経由でデバイスを接続する前に、次のコマンドを実行します。

If you are using Linux: ls /dev/tty*
If you are using MacOS: ls /dev/cu*

次のような接続されたデバイスのリストが出力されます。

/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC

プログラマーをパソコンの USB ポートに接続します。次のコマンドを再度入力します。

If you are using Linux: ls /dev/tty*
If you are using MacOS: ls /dev/cu*

次の例のように、出力に項目が追加されます。新しいアイテムの名前は異なる場合があります。この新しいアイテムはデバイスの名前です。

/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC
/dev/cu.wchusbserial-1450

まず、デバイス名を識別する環境変数を作成します。

export DEVICENAME=put your device name here

次に、ボーレート(デバイスにデータが送信される速度)を指定する環境変数を作成します。

export BAUD_RATE=921600

6. バイナリをフラッシュする

スクリプトを実行してボードをフラッシュする

ボードをフラッシュするには、新しいバイナリを受け取る準備をする特別な「ブートローダー」状態にする必要があります。次に、スクリプトを実行してバイナリをボードに送信します。

ボードの次のボタンについて説明します。

64c620570b9d2f83.png

ボードをリセットしてフラッシュする手順は次のとおりです。

  1. ボードがプログラマーに接続され、セットアップ全体が USB 経由でパソコンに接続されていることを確認します。
  2. ボードの 14 とマークされたボタンを長押しして、スタートします。ステップ 6 まで押し続けます。
  3. 14 とマークされたボタンを押したまま、RST とマークされたボタンをクリックしてボードをリセットし、ブートローダーの状態にします。
  4. 14 とマークされたボタンを押したまま、次のコマンドをターミナルに貼り付けて Enter キーを押し、実行します(便宜上、ボタンを押し始める前にこのコマンドをターミナルに貼り付けることもできますが、この手順に達するまで Enter キーを押さないでください)。
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/uart_wired_update.py -b ${BAUD_RATE} ${DEVICENAME} -r 1 -f main_nonsecure_wire.bin -i 6
  1. 14 のボタンを押したまま、画面に次のようなものが表示されるのを確認します。
Connecting with Corvette over serial port /dev/cu.usbserial-1440...
Sending Hello.
Received response for Hello
Received Status
length =  0x58
version =  0x3
Max Storage =  0x4ffa0
Status =  0x2
State =  0x7
AMInfo =
0x1
0xff2da3ff
0x55fff
0x1
0x49f40003
0xffffffff
[...lots more 0xffffffff...]
Sending OTA Descriptor =  0xfe000
Sending Update Command.
number of updates needed =  1
Sending block of size  0x158b0  from  0x0  to  0x158b0
Sending Data Packet of length  8180
Sending Data Packet of length  8180
[...lots more Sending Data Packet of length  8180...]
  1. Sending Data Packet of length 8180 が表示されたら、ボードの 14 とマークされたボタンを押すのをやめます(押し続けても問題ありません)。プログラムはターミナルに行の出力を続けます。最終的には次のようになります。
[...lots more Sending Data Packet of length  8180...]
Sending Data Packet of length  8180
Sending Data Packet of length  6440
Sending Reset Command.
Done.

Done が表示された場合は、正常に点滅したことを示します。プログラムの出力がエラーで終わる場合は、Sending Reset Command が出力されたかどうかを確認します。その場合は、エラーが発生したにもかかわらず、フラッシュは成功した可能性があります。

Linux マシンでは、NoResponse Error が発生することがあります。これは、既存のシリアル ドライバとともに ch34x シリアル ドライバがインストールされているためです。この問題は次のように解決できます。

ステップ 1: ch34x ライブラリの正しいバージョンを再インストールします。インストール中はデバイスがパソコンから外れていることを確認してください。

git clone https://github.com/juliagoda/CH341SER.git
cd CH341SER/
make
sudo insmod ch34x.ko
sudo rmmod ch341

ステップ 2: ボードの USB を接続して、以下を実行します。

dmesg | grep "ch34x"

次のようなメッセージが表示されます。

[ 1299.444724]  ch34x_attach+0x1af/0x280 [ch34x]
[ 1299.445386] usb 2-13.1: ch34x converter now attached to ttyUSB0

使用されているドライバが「ch34x」でない場合(ch341 など)、次のコマンドを実行して他のドライバを無効にしてみてください。

rmmod <non-ch34x driver name>

デバイスの電源プラグを抜いてからもう一度差し込み、使用されているドライバが「ch34x」であることを確認します。

7. デモ

プログラムを試す

ボードのフラッシュが正常に完了したら、 と書かれたボタンを押します。

RST: ボードを再起動してプログラムを開始します。青色の LED が点滅し始めたら、フラッシュは成功です。うまくいかなかった場合は、下記の「うまくいかなかった場合はどうすればよいですか?」のセクションまでスクロールしてください。

bf256d403a1821af.gif

ボード上の ML モデルは、「はい」と「いいえ」という単語を認識し、音声の有無を検出するようにトレーニングされています。結果は、色付きの LED を点灯することで伝えられます。次の表に、各 LED の色の意味を示します。

検出結果

LED の色

「はい」

「いいえ」

不明な音声

音声が検出されませんでした

LED が点灯していない

試してみる

ボードを口元に当てて、「はい」と数回言います。黄色の LED が点滅します。「はい」と答えても何も起こらない場合は、次の方法をお試しください。

  • 口から約 25 cm 離してボードを持ちます
  • 周囲の騒音が大きすぎないようにする
  • 「はい」を数回連続して繰り返す(「はいはいはい」と言ってみる)

うまくいかなかった場合はどうすればよいですか?

考えられる問題とデバッグ方法を次に示します。

問題: フラッシュ後、LED が点灯しない。

解決策: RST ボタンを押すか、ボードとプログラマーの接続を解除して再接続してみてください。上記の方法で解決しない場合は、ボードを再度フラッシュしてみてください。

問題: 青色の LED が点灯しているが、非常に暗い。

解決策: バッテリー残量が少なくなっているため、バッテリーを交換します。プログラマーとケーブルを使用して、パソコンからボードに電力を供給することもできます。

8. デバッグ出力を読む(省略可)

問題が発生し、コードを詳細にデバッグする必要がある場合は、このセクションを確認してください。コードの実行時にマイクロコントローラで何が起こっているかを把握するには、ボードのシリアル接続を介してデバッグ情報を出力します。パソコンを使用してボードに接続し、ボードが送信しているデータを表示します。

シリアル接続を開く

デフォルトでは、SparkFun Edge のサンプルコードは、発話されたコマンドとその信頼度をログに記録します。ボードの出力を確認するには、次のコマンドを実行します。

screen ${DEVICENAME} 115200

最初は次のような出力が表示されることがあります(これは、ボードが接続後にリセットされた場合にのみ表示されます。それ以外の場合は、デバッグ情報が表示されることがあります)。

Apollo3 Burst Mode is Available

                               Apollo3 operating in Burst Mode (96MHz)

「はい」または「いいえ」と言って、コマンドを発行してみてください。各コマンドのデバッグ情報が出力されます。

 Heard yes (202) @65536ms

上記のログでは、yes はコマンドを指します。数値 202 は、コマンドが聞き取られた信頼度を示します(最小値は 200)。最後に、65536ms は、マイクロコントローラが最後にリセットされてからの経過時間を指します。

デバッグ出力の表示を停止するには、Ctrl+A キーを押し、すぐに K キーを押し、次に Y キーを押します。

デバッグログを書き込む

この情報をログに記録するコードは、先ほど作業した command_responder.cc ファイルで確認できます。

tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc

データをログに記録するには、error_reporter->Report() メソッドを呼び出します。文字列補間に標準の printf トークンがサポートされています。これを使用して、ログに重要な情報を含めることができます。

error_reporter->Report("Heard %s (%d) @%dms", found_command, score, current_time);

このメソッドは、次のセクションでコードに独自の変更を加える際に役立ちます。

9. コードを拡張する(省略可)

SparkFun Edge のビルドとフラッシュの方法を理解したら、コードを操作してデバイスにデプロイし、結果を確認できます。

コードを読む

コードの読み取りを開始するのに適した場所は、次のファイル command_responder.cc. です。

tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc

ファイルは GitHub で こちらから確認できます。

このファイルのメソッド RespondToCommand は、音声コマンドが検出されたときに呼び出されます。既存のコードでは、「はい」、「いいえ」、または不明なコマンドが聞こえたかどうかに応じて、異なる LED が点灯します。次のスニペットは、この仕組みを示しています。

if (found_command[0] == 'y') {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
}
if (found_command[0] == 'n') {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
}
if (found_command[0] == 'u') {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
}

found_command 引数には、検出されたコマンドの名前が含まれます。この if ステートメントのセットは、最初の文字をチェックして、点灯する LED を決定します。

RespondToCommand メソッドは、次の引数を指定して呼び出されます。

void RespondToCommand(tflite::ErrorReporter* error_reporter,
    int32_t current_time, const char* found_command,
    uint8_t score, bool is_new_command) {
  • error_reporter はデバッグ情報をログに記録するために使用されます(詳細については後述します)。
  • current_time は、コマンドが検出された時刻を表します。
  • found_command は、検出されたコマンドを示します。
  • score は、コマンドを検出したことに対する信頼度を示します。
  • is_new_command は、コマンドを初めて聞いたかどうかを知らせます。

score は、コマンドが検出された確率を表す 0 ~ 255 の整数です。このサンプルコードでは、スコアが 200 を超える場合にのみコマンドが有効と見なされます。Google のテストによると、ほとんどの有効なコマンドは 200 ~ 210 の範囲に収まります。

コードを変更する

SparkFun Edge ボードには 4 つの LED があります。現在、認識が行われていることを示すために青色の LED が点滅しています。これは command_responder.cc ファイルで確認できます。

static int count = 0;

// Toggle the blue LED every time an inference is performed.
++count;
if (count & 1) {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
} else {
  am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
}

4 つの LED があるので、プログラムを変更して、特定のコマンドの score の視覚的なインジケーターとして使用しましょう。スコアが低い場合は LED が 1 つ点灯し、スコアが高い場合は複数の LED が点灯します。

プログラムが実行されていることを確認できるように、青色ではなく赤色の LED が継続的に点滅するようにします。隣接する青、緑、黄色の LED は、最新の score の強度を示すために使用されます。簡単にするため、「はい」という言葉が発せられた場合にのみ LED を点灯させます。別の単語が検出されると、LED が消灯します。

この変更を行うには、command_responder.cc ファイル内のすべてのコードを次のスニペットに置き換えます

#include "tensorflow/lite/micro/examples/micro_speech/command_responder.h"

#include "am_bsp.h"

// This implementation will light up the LEDs on the board in response to different commands.
void RespondToCommand(tflite::ErrorReporter* error_reporter,
                      int32_t current_time, const char* found_command,
                      uint8_t score, bool is_new_command) {
  static bool is_initialized = false;
  if (!is_initialized) {
    // Setup LEDs as outputs
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_RED, g_AM_HAL_GPIO_OUTPUT_12);
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_BLUE, g_AM_HAL_GPIO_OUTPUT_12);
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_GREEN, g_AM_HAL_GPIO_OUTPUT_12);
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_YELLOW, g_AM_HAL_GPIO_OUTPUT_12);
    // Ensure all pins are cleared
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
    is_initialized = true;
  }
  static int count = 0;

   // Toggle the red LED every time an inference is performed.
   ++count;
   if (count & 1) {
     am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
   } else {
     am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
   }

  if (is_new_command) {
    // Clear the last three LEDs
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
    error_reporter->Report("Heard %s (%d) @%dms", found_command, score,
                           current_time);
    // Only indicate a 'yes'
    if (found_command[0] == 'y') {
      // Always light the blue LED
      am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
      // Light the other LEDs depending on score
      if (score >= 205) {
        am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
      }
      if(score >= 210) {
        am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
      }
    }
  }
}

新しいコマンドが検出されると、is_new_command は true になります。青、緑、黄色の LED を消灯し、found_commandscore の値に応じて再度点灯します。

再ビルドしてフラッシュする

コードを変更したら、バイナリをビルドして準備するの手順をすべて実行してテストします。

10. 次のステップ

お疲れさまでした。これで、マイクロコントローラで最初の音声検出器を構築できました。

TensorFlow Lite for Microcontrollers を使用した開発の概要は以上です。マイクロコントローラでのディープ ラーニングというアイデアは新しく、エキサイティングなものです。ぜひ試してみてください。

リファレンス ドキュメント

  • 基本的なプログラムの操作を経験したので、独自のモデルをトレーニングして、さまざまなコマンドを理解しましょう。注: トレーニングには数時間かかります。
  • TensorFlow Lite for Microcontrollers の詳細(ウェブサイトGitHub)をご覧ください。
  • 他のを試して、サポートされている場合は SparkFun Edge で実行してみてください。
  • O'Reilly の書籍『TinyML: Machine Learning with TensorFlow on Arduino and Ultra-Low Power Micro-Controllers』を参照してください。この書籍では、小型デバイスでの機械学習を紹介し、いくつかの楽しいプロジェクトを説明しています。この Codelab は、書籍の第 7 章と第 8 章に基づいています。

26699b18f2b199f.png

今後ともどうぞよろしくお願いいたします。