Edge Impulse を使用した音声認識
この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues
このチュートリアルの内容は有効でない可能性があり、新しいソフトウェアのメンテナンスおよび技術サポートは提供されていません。
Edge Impulse を使用した XIAO nRF52840 による音声認識
この 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 のハードウェアピン配置
ソフトウェアの準備
このプロジェクトを試すには、以下の 3 つが必要です:
- Google Speech commands データセット(以下を参照)
- Edge Impulse アカウント
- Arduino IDE
データセット
- Google Speech commands データセットを使用します。ただし、すべてのデータセットではなく、一部の単語のみを使用します。
- まず、データセットをダウンロードして解凍してください。完全なデータセットのサイズは 2.3GB です。
- この Google Speech commands データセット は、Google が TensorFlow Lite for MicroControllers のマイクロスピーチ例で使用しているものです。
- コードはこちらで確認できます。
上記の最初のリンクからデータセットをダウンロードし、以下のように展開されます:
はじめに
それでは、Edge Impulse を使用してデータセットに基づいた機械学習 (ML) モデルを作成する方法を始めましょう。
ステップ 1 - Edge Impulse を開く
- Edge Impulse は、開発者がマイクロコントローラーやスマートフォンなどのエッジデバイス向けにカスタム ML モデルを作成およびデプロイできる機械学習 (ML) 開発プラットフォームです。
- キーワード検出、異常検出、分類など、特定のタスク向けに ML モデルを構築および最適化するためのさまざまなツールとリソースを提供します。
新しいプロジェクトを作成しましょう。名前を付けてください。
新しいプロジェクトを作成したら、データ取得ページに移動します。
ステップ 2 - データを追加
Google の音声コマンドデータセットを使用するため、「既存のデータを追加」を選択します。
次に、「データをアップロード」を選択します。
次に、データを選択します。音声データセットのフォルダの 1 つを選択しましょう。
このデータセットには、トレーニング用の多くの単語が含まれています。トレーニング用に 3 つのフォルダ (ラベル) とバックグラウンドノイズを選択します。これで 4 つのラベルが得られます。
「参照」ボタンを押します。
最初は「go」です。フォルダを選択し、すべての .wav ファイルが表示されたら、「アップロード」を押します。
次に、カテゴリのデフォルトオプションをそのままにします。Edge Impulse にデータを分割させます。
ラベルについては、自分でラベルを記入してください。すべて完了したら、「データをアップロード」を押します。
右側にアップロード中のファイルが表示されます。ファイルが多いため、少し時間がかかる場合があります。
しばらくすると、アップロードされたファイルの簡単な概要が表示されます。
その後、この画面が表示されます。
さらにデータをアップロードするには、右側のファイルリスト上部にある小さなアップロードボタンを押します。
これをあと 3 回繰り返します。2 つのラベルとバックグラウンドノイズです。
私は「happy」、「bird」、および「バックグラウンドノイズ」フォルダを「noise」というラベルで選択します。
最終的に、以下がすべてのラベルです。
次に、単語を学習するためのネットワークを作成します。「Impulse デザイン」をクリックしてインパルスを作成します。
ステップ 3 - トレーニング方法を選択
クリップはそれぞれ 1 秒で 16kHz なので、ウィンドウサイズと周波数をそのままにします。次に、処理ブロックを追加します。
Edge Impulse はここでも大いに役立ちます。「処理ブロックを追加」をクリックし、「Audio (MFCC)」を選択します。
次に、「学習ブロックを追加」をクリックし、「分類」を選択します。
これで、最後の列「出力特徴量」に 4 つのラベル (bird、go、happy、noise) が表示されます。
「インパルスを保存」を押して、ここまでの作業を保存します。
ステップ 4 - 特徴量を生成
次に、MFCC パラメータを確認します。必要に応じて値を変更できます。
今回はデフォルト値をそのまま使用します。「パラメータを保存」をクリックします。
パラメータを保存すると、「特徴量を生成」するための新しいウィンドウが表示されます。
クリックすると、Edge Impulse が特徴量の生成を開始します。
しばらくすると、特徴量が生成され、それらを視覚化することができます。
次に、選択したパラメータを使用してネットワークをトレーニングします。「Classifier」をクリックしてください。
ステップ 5 - 分類器
ここでは、トレーニングサイクルやデータ拡張の有無など、ネットワーク設定を調整できます。
Edge Impulse は、キーワード検出のためのシンプルで効果的なニューラルネットワークアーキテクチャを提供します。このアーキテクチャは以下の層で構成されています:
- 入力層: 入力層は MFCC 特徴量を入力として受け取ります。
- 隠れ層: 隠れ層は、MFCC 特徴量から高次の特徴を抽出することを学習します。Edge Impulse は、畳み込み層やリカレント層など、さまざまな隠れ層タイプをサポートしています。
- 出力層: 出力層は、音声入力にキーワードが含まれている確率を予測します。
デフォルトのパラメータを変更することもできますが、デフォルト設定で十分です。「Start Training」をクリックしてください。
トレーニングを開始すると、画面の右側でトレーニングの進行状況を確認できます。
ターゲットデバイスを nRF52840(例:XIAO nRF52840 Sense)に変更することで、パフォーマンス計算や最適化を確認できます。
トレーニングが完了すると、混同行列とデータエクスプローラーが表示されます。
ネットワークが準備できたので、いくつかのサンプルを試し、ライブ分類を行ってみましょう。
ライブ分類に移動すると、サンプルを選択して分類結果を確認できます。例えば、鳥のサンプルでは、結果に「bird」と表示されます。素晴らしいですね。モデルが機能しています。
次に、モデルテストに進みましょう。
テスト用に分割されたサンプルを使用してモデルをテストします。「Classify all」をクリックしてください。
約 90% の精度が得られます。
ステップ 6 - デプロイと Arduino ライブラリの取得
次に、マイクロコントローラー用のファイルを取得するためにデプロイに進みます。
デプロイオプション
Arduino を選択します。
次に、「Quantized(int8)」を選択したままにして、「Build」をクリックして Arduino IDE で使用するファイルをダウンロードします。
最適化を少し調整することもできます。精度が低いと感じた場合は、EON コンパイラをオフにして再試行してください。
しばらくすると、ファイルが自動的にダウンロードされます。
ステップ 7 - Arduino IDE にライブラリを追加
Arduino IDE で、新しくダウンロードしたファイルを追加します。
「Sketch > Include Library > Add .ZIP Library」に移動します。
ダウンロードしたファイルを選択します。しばらくすると、出力ウィンドウに「ライブラリがインストールされました」というメッセージが表示されます。
ステップ 8 - XIAO nRF52840 Sense で RGB ライトを音声制御
例を開きます。
「Examples > <your_files_names> > nano_ble33_sense > nano_ble33_sense_microphone」に移動します。
なぜ Arduino BLE 33 Sense を使用するのか?
それは、マイクを制御するために同じライブラリ(PDM:パルス密度変調)を使用しているからです。Arduino Nano BLE 33 Sense には MP34DT05 が搭載されており、XIAO nRF52840 Sense には MSM261D3526H1CPM が搭載されています。
スケッチを開いたら、コンパイルしてエラーがないか確認します。
しばらくすると、スケッチがコンパイルされ、エラーが報告されませんでした。
次に、XIAO nRF52840 Sense を接続し(まだ接続していない場合)、コードをボードにアップロードします。
次に、シリアルポートを開き(Ctrl+Shift+M)、推論結果を確認します(ボードはすでに録音、推論、予測を開始しています)。
選択した単語の1つを言ってみてください。ここでは「go」と言いました。
単語が正しく検出されると、最も確率の高い単語の結果が1.0に近くなり、他の単語は0.0に近い値になります。
次に、少し楽しむためにコードを少し変更してみましょう。
XIAO nRF52840 Senseには、3色の内蔵LEDがあります:
- 赤 - LED_BUILTIN または LED_RED
- 緑 - LED_GREEN
- 青 - LED_BLUE
3つの単語があるので、それぞれの単語に色を割り当て、単語に応じて対応する色を点灯させます。
- 赤は「bird」用
- 緑は「Go」用
- 青は「happy」用
簡単にするために、ボードのPIN定義を確認したところ、以下のPINがLEDの色に割り当てられていました:
- 赤 - Pin 11
- 緑 - Pin 13
- 青 - Pin 12
まず、しきい値を定義する必要があります。予測値は0.0から1.0の範囲であることがわかっています。1.0に近いほど、単語の分類に確信が持てます。この値は後で調整可能です。ここでは0.7に設定します。
まず、いくつかの変数を定義します。これらはインクルードされたライブラリの直後に定義しました:
/* 予測のしきい値 */
float threshold = 0.7;
/**
ラベルインデックス:
0 - bird
1 - go
2 - happy
3 - noise
*/
// 点灯するLEDピン(色を定義)
/**
PIN 11 - 赤
PIN 12 - 青
PIN 13 - 緑
*/
int LED = 0;
int oldLED;
次に、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);
// LEDを点灯させる
if (result.classification[ix].value > threshold) {
// どのラベルか確認
switch (ix) {
case 0: LED = 11; break;
case 1: LED = 13; break;
case 2: LED = 12; break;
default: LED = 0;
}
// Senseでは、LOWでLEDが点灯
if (LED != 0) {
digitalWrite (oldLED, HIGH); // 直前の単語と異なる場合、前回のLEDを消灯
digitalWrite (LED, LOW);
oldLED = LED;
}
else // LEDを消灯
digitalWrite (oldLED, HIGH);
}
}
変更後、コードをマイクロコントローラにアップロードし、トレーニングした単語を言ってみて、単語に応じてLEDが点灯する様子を確認してください。
以上です。直接サポートされているわけではありませんが、XIAO nRF52840 Senseを使用してEdge ImpulseでいくつかのMLモデルを実行できるようになりました。
✨ コントリビュータープロジェクト
- このプロジェクトは Seeed Studio コントリビュータープロジェクト によってサポートされています。
- Brunoの努力 に感謝します。あなたの作業は展示されます。
技術サポートと製品ディスカッション
弊社製品をお選びいただきありがとうございます!製品の使用体験がスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、いくつかのコミュニケーションチャネルをご用意しています。