Skip to main content
caution

このチュートリアルの内容は既に有効でない可能性があり、新しいソフトウェアメンテナンスと技術サポートは提供されなくなりました。

XIAO nRF52840を使用したEdge Impulseベースの音声認識

このwikiでは、音声認識のためにSeeed Studio XIAO nRF52840のML機能とEdge Impulseを使用する方法を紹介します。XIAO nRF52840 Senseに既に搭載されているマイクロフォンを使用します。

プロジェクト前の知識

XIAO nRF52840はEdge Impulseによって公式にサポートされておらず、データを収集するデバイスとして存在しませんが、デバイスのマイクロフォンを使用して推論を実行する方法を実演します。

はじめに

このチュートリアルに従うには、以下のハードウェアが必要です

Seeed Studio XIAO nRF52840-Sense

ハードウェア準備

ハードウェアの準備は必要ありません。XIAO nRF52840には、このプロジェクトに必要なものがすべて既に搭載されています。PDMマイクロフォンだけが必要です。

XIAO nRF52840 Senseのハードウェアピン配置

XIAO nrf82840 hardware

ソフトウェア準備

これを試すには、3つのものが必要です:

  1. Google音声コマンドデータセット(以下を確認)
  2. Edge Impulseアカウント
  3. Arduino IDE

データセット

  • Google音声コマンドデータセットを使用します。全データセットではなく、その中のいくつかの単語だけです。
  • まず、データセットをダウンロードして解凍してください。完全なデータセットは2.3GBです。
  • このGoogle音声コマンドデータセットは、GoogleがTensorFlow Lite for MicroControllersのマイクロ音声例で使用しているものです。
  • コードはこちらで確認できます。

上記の最初のリンクからデータセットをダウンロードでき、以下のように展開されます:

Speech commands dataset

はじめに

それでは、Edge Impulseを使用してデータセットに基づくMLモデルを作成しましょう。

ステップ1 - Edge Impulseを開く

  • Edge Impulseは、開発者がマイクロコントローラーやスマートフォンなどのエッジデバイスにカスタムMLモデルを作成・デプロイできる機械学習(ML)開発プラットフォームです。
  • キーワードスポッティング、異常検知、分類などの特定のタスクに対してMLモデルを構築・最適化するための様々なツールとリソースを提供します。

新しいプロジェクトを作成しましょう。名前を付けてください。

Edge Impulse New project

新しいプロジェクトを作成した後、データ取得ページに移動します。

Edge Impulse Data Aquisition

ステップ2 - データを追加

Google音声コマンドデータセットを使用するため、「Add existing data」を選択します。 次に、「Upload data」を選択します。

Edge Impulse upload data

次に、データを選択します - 音声データセットのフォルダの1つを選択しましょう。

Edge Impulse upload data screen

データセットには訓練用の多くの単語があります。3つのフォルダ(ラベル)と背景ノイズを選択して訓練しましょう。4つのラベルを取得します。 「Browse」ボタンを押します。 最初は「go」です。フォルダを選択すると、すべての.wavファイルが表示されます - 「Upload」を押します。

Files to upload

次に、カテゴリのデフォルトオプションを保持します。Edge Impulseにデータを分割させます。 ラベルについては、自分でラベルを書きます。これらすべての後、「Upload data」を押します。

Edge Impulse upload data screen

右側で、ファイルがアップロードされているのが確認できます。ファイル数が多いため、時間がかかる場合があります。

Files upload progress

しばらくすると完了し、アップロードされたファイルの簡単な要約が表示されます。

Files upload resume

この後、画面は以下のようになります。

Edge Impulse dataset screen

さらにデータをアップロードするには、ファイルリストの上にある右側の小さなアップロードボタンを押します。 これをさらに3回繰り返します - さらに2つのラベルと背景ノイズです。 happy、bird、そして「noise」ラベルの「background noise」フォルダを選択します。 最終的に、これらがすべてのラベルです。

Edge Impulse dataset screen

次に、単語を学習するネットワークを作成しましょう。Impulse designをクリックしてインパルスを作成します。

Edge Impulse dataset screen

ステップ3 - 訓練方法を選択

クリップはそれぞれ1秒で16Khzなので、ウィンドウサイズと周波数を同じに保ちましょう。次に、処理ブロックを追加しましょう。

Edge Impulse dataset screen

Edge Impulse はここでも大いに役立ちます。「Add a processing block」をクリックして、Audio (MFCC) を選択してください。

Edge Impulse dataset screen

次に、「Add learning block」をクリックして Classification を選択してください。

Edge Impulse dataset screen

これで、最後の列 - Output features - に4つのラベル(bird、go、happy、noise)が表示されます。 「Save Impulse」を押して、これまでの作業を保存してください。

Edge Impulse dataset screen

ステップ 4 - 特徴量の生成

それでは、MFCC パラメータを見てみましょう。必要に応じて値を変更できます。 今回は、デフォルト値を保持しましょう。「Save Parameters」をクリックしてください。 パラメータを保存すると、「Generate features」の新しいウィンドウが表示されます。

Edge Impulse dataset screen

クリック後、Edge Impulse が特徴量の生成を開始します。

Generate features

しばらくすると、特徴量が生成され、それらを視覚化できます。

Feature explorer

これで、選択したパラメータでネットワークを訓練できます。「Classifier」をクリックしてください。

ステップ 5 - 分類器

Classifier

ここでは、訓練サイクル、データ拡張の有無など、ネットワーク設定を調整できます。 Edge Impulse は、キーワードスポッティング用のシンプルで効果的なニューラルネットワークアーキテクチャを提供します。このアーキテクチャは以下の層で構成されています:

  • 入力層: 入力層は MFCC 特徴量を入力として受け取ります。
  • 隠れ層: 隠れ層は MFCC 特徴量からより高次の特徴を抽出することを学習します。Edge Impulse は、畳み込み層やリカレント層など、さまざまな隠れ層タイプをサポートしています。
  • 出力層: 出力層は、音声入力にキーワードが含まれている確率を予測します。

デフォルトパラメータを変更できますが、デフォルトで十分です。「Start Training」をクリックしてください。

Network architecture

訓練開始後、画面の右側で訓練の進行状況を確認できます。

Training progress

Target device を nRF52840 - 私たちの XIAO nRF52840 Sense のような - に変更して、パフォーマンス計算と最適化を確認できます。

Target device

訓練が完了すると、混同行列とデータエクスプローラが表示されます。

Confusion Matrix

ネットワークの準備ができたので、いくつかのサンプルを試してライブ分類を行ってみましょう。 ライブ分類に移動すると、サンプルを選択して分類結果を確認できます。ここでは、鳥の例について、結果で bird が得られます。素晴らしいです。モデルが動作しています。

Live classification

それでは、モデルテストに移動しましょう。 テスト用に分割されたサンプルを使用してモデルをテストしてみましょう。「Classify all」をクリックしてください。

Test data

約90%の精度が得られます。

Accuracy

ステップ 6 - デプロイメントと Arduino ライブラリの取得

それでは、デプロイメントに移動して、マイクロコントローラ用のファイルを取得しましょう。

デプロイメントオプション

Arduino を選択しましょう。

Accuracy

次に、Quantized(int8) を選択したまま、「Build」をクリックして Arduino IDE で使用するファイルをダウンロードしてください。 最適化を少し試すことができます。精度が低いことに気づいた場合は、EON コンパイラをオフにして再試行してください。

Accuracy

しばらくすると、ファイルが自動的にダウンロードされます。

Arduino Files download

ステップ 7 - Arduino IDE にライブラリを追加

Arduino IDEで、新しくダウンロードしたファイルを追加しましょう。 Sketch > Include Library > Add .ZIP Libraryに移動します

Arduino IDE Add library

ダウンロードしたファイルを選択します。しばらくすると、出力ウィンドウにライブラリがインストールされたというメッセージが表示されます。

Library installed

ステップ8 - XIAO nRF52840 SenseのRGBライトを音声制御する

サンプルを開きましょう Examples > <your_files_names> > nano_ble33_sense > nano_ble33_sense_microphoneに移動します

Library installed

なぜArduino BLE 33 Senseなのでしょうか?これらは同じライブラリ - PDM(パルス密度変調)- を使用してマイクを制御します。Arduino Nano BLE 33 SenseはMP34DT05を搭載し、XIAO nRF52840 SenseはMSM261D3526H1CPMを搭載しています。 スケッチが開いたら、コンパイルしてエラーがないか確認しましょう。

Sketch open

しばらくすると、スケッチがコンパイルされ、エラーは報告されません。

Sketch open

次に、XIAO nRF52840 Senseを接続し(まだ接続していない場合)、コードをボードにアップロードします。

Sketch open

Compile result

Upload

次に、シリアルポートを開き(Ctrl+Shift+M)、推論結果を確認します(ボードはすでに録音、推論、予測を開始しています)

Serial Monitor

選択した単語の一つを言ってみてください。私は「go」と言いました

Serial Monitor

単語が正しく検出されると、最も可能性の高い単語は1.0に近い結果を持ち、他の単語は0.0に近い値を持ちます。 では、少し楽しんでコードを少し変更してみましょう。 XIAO nRF52840 Senseには3色の内蔵LEDがあります:

  • 赤 - LED_BUILTINまたはLED_RED

Red LED

  • 緑 - LED_GREEN

Green LED

  • 青 - LED_BLUE

Blue LED

3つの単語があるので、それぞれに色を割り当てて、その単語に対応する色を点灯させましょう。

  • 赤はbirdに
  • 緑はGoに
  • 青はhappyに

より簡単にするため、ボードのPIN定義を確認し、以下のPINがLEDの色に割り当てられています:

  • RED - Pin 11
  • GREEN - Pin 13
  • BLUE - Pin 12

まず、閾値を定義する必要があります。予測は0.0から1.0の範囲であることがわかっています。1.0に近いほど、単語の分類に確信があります。この値は後で調整できます。0.7に設定します。

まず、いくつかの変数を定義します。これらをインクルードライブラリの直後に定義しました:

/* threshold for predictions */
float threshold = 0.7;

/**
LABELS INDEX:
0 - bird
1 - go
2 - happy
3 - noise
*/
// LED pin (defines color) to light up
/**
PIN 11 - RED
PIN 12 - BLUE
PIN 13 - GREEN
*/
int LED = 0;
int oldLED;

int oldLED は、予測がない場合や予測が変わった場合にオフにできるよう、前回点灯したLEDを定義します。

int LED は、現在点灯させるLEDです。

次に、loop()関数内のforループ命令の中で、CLASSIFIER_LABEL_COUNTをループする箇所(129行目付近 - 上記の行を含む):

for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {

if命令を使用して分類値をチェックします。定義された閾値を上回っている場合、switch命令を使用してどの単語が記録されているかを確認します。

私たちの追加を含む完全なforループは以下の通りです:

for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
ei_printf(" %s: %.5f\n", result.classification[ix].label, result.classification[ix].value);
//lets light up some LEDS

if (result.classification[ix].value > threshold) {
//now let's see what label were in
switch (ix) {
case 0: LED = 11; break;
case 1: LED = 13; break;
case 2: LED = 12; break;
default: LED = 0;
}
//in Sense, LOW will light up the LED
if (LED != 0) {
digitalWrite (oldLED, HIGH); //if we enter a word right next to previous - we turn off the previous LED
digitalWrite (LED, LOW);
oldLED = LED;
}
else //turn off LED
digitalWrite (oldLED, HIGH);
}
}

変更後、コードをマイコンにアップロードして、訓練した単語を言ってみて、その単語に応じてLEDが点灯するかを確認してください。

これで完了です。直接サポートされていませんが、Edge Impulseを使用してXIAO nRF52840 SenseでMLモデルを実行できるようになりました。

✨ コントリビュータープロジェクト

技術サポート & 製品ディスカッション

私たちの製品をお選びいただき、ありがとうございます!私たちは、お客様の製品体験が可能な限りスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、複数のコミュニケーションチャネルを提供しています。

Loading Comments...