音声認識テクノロジーは、デバイスをハンズフリーで制御できるだけでなく、システムにセキュリティを追加する自動化に非常に役立ちます。音声制御ガジェットの作成とは別に、音声認識はさまざまな障害に苦しむ人々に大きな助けを提供します。
以前のプロジェクトでは、Arduinoベースのテキスト読み上げ(TTS)コンバーターと音声制御ライトを構築しました。このプロジェクトでは、機械学習を使用して、Edge Impulse Studioを使用し、「 LIGHT ON」 、「 LIGHT OFF」、 「 NOISE 」の3つのコマンドで音声認識モデルをトレーニングします。Edge Impulseは、開発者が機械学習を組み込んだ次世代のインテリジェントデバイスソリューションを作成できるようにするオンライン機械学習プラットフォームです。以前は、咳とノイズの音を区別するためにエッジインパルススタジオを使用していました。
必要なコンポーネント
ハードウェア
- Arduino 33 BLE Sense
- 導いた
- ジャンパー線
ソフトウェア
- エッジインパルススタジオ
- Arduino IDE
Arduino 33 BLESenseに関する詳細なチュートリアルについて説明しました。
回路図
Arduinoを使用したこの音声認識の回路図を以下に示します。Arduino 33 BLEのフリッツパーツが入手できなかったので、ピン配置が同じであるため、ArduinoNanoを使用しました。
LEDのプラスのリード線はArduino33 BLEセンスのデジタルピン5に接続され、マイナスのリード線はArduinoのGNDピンに接続されています。
Arduino音声認識用のデータセットの作成
ここでは、Edge ImpulseStudioを使用して音声認識モデルをトレーニングしています。Edge Impulse Studioでモデルをトレーニングすることは、他の機械学習フレームワークで機械学習モデルをトレーニングすることに似ています。トレーニングの場合、機械学習モデルの最初のステップは、認識できるようにしたいデータのサンプルを含むデータセットを収集することです。
私たちの目標は音声コマンドでLEDを制御することなので、音声コマンドと他のノイズを区別できるように、すべてのコマンドとノイズの音声サンプルを収集する必要があります。
「LEDON」、「LED OFF」、「noise」の3つのクラスでデータセットを作成します。データセットを作成するには、Edge Impulseアカウントを作成し、アカウントを確認してから、新しいプロジェクトを開始します。モバイル、Arduinoボードを使用してサンプルをロードするか、データセットをエッジインパルスアカウントにインポートできます。サンプルをアカウントにロードする最も簡単な方法は、携帯電話を使用することです。そのためには、モバイルをEdgeImpulseに接続します。
携帯電話に接続するには、「 デバイス 」をクリックしてから、「 新しいデバイスを接続 」をクリックし ます 。
次のウィンドウで 「携帯電話を使用する」を クリックすると、QRコードが表示されます。携帯電話でQRコードをスキャンするか、QRコードに記載されているURLを入力してください。
これにより、電話がEdge Impulsestudioに接続されます。
スマートフォンをEdgeImpulse Studioに接続すると、サンプルを読み込むことができます。サンプルをロードするには、「 データ収集」を クリックします。次に、[データ収集]ページでラベル名を入力し、センサーとしてマイクを選択して、サンプルの長さを入力します。「 サンプリング の 開始 」 を クリックすると、デバイスは2秒のサンプルをキャプチャします。さまざまな条件で合計10〜12の音声サンプルを録音します。
最初のクラスのサンプルをアップロードした後、ラベルの変更を設定し、「 ライトオフ」 および 「ノイズ」 クラスのサンプルを収集します。
これらのサンプルはモジュールのトレーニング用です。次のステップでは、テストデータを収集します。テストデータはトレーニングデータの少なくとも30%である必要があるため、「ノイズ」の4つのサンプルと、「ライトオン」および「ライトオフ」の4〜5サンプルを収集します。
モデルのトレーニング
データセットの準備ができたら、データのインパルスを作成できます。そのためには、「 インパルス の 作成 」ページに移動します。1000ミリ秒のウィンドウサイズのデフォルト設定を1200ミリ秒に変更し、500ミリ秒のウィンドウを50ミリ秒に増やします。これは、データが一度に1.2秒処理され、58ミリ秒ごとに開始されることを意味します。
次に、「 インパルス の 作成」 ページで「 処理ブロックの追加 」 を クリックします。次のウィンドウで、オーディオ(MFCC)ブロックを選択します。その後、「 学習ブロック の 追加 」 を クリックし、ニューラルネットワーク(Keras)ブロックを選択します。次に、[ インパルスの保存 ]をクリックし ます 。
次のステップで、MFCCページに移動し、[機能の生成]をクリックします。オーディオのすべてのウィンドウに対してMFCCブロックを生成します。
その後、「 NN分類子」 ページに移動し、「 ニューラルネットワーク設定」の 右上隅にある3つのドットをクリックして、「 Keras(エキスパート)モードに切り替える 」 を選択します。
オリジナルを次のコードに置き換え、「 最小信頼度」 を「 0.70」に変更し ます。次に、[トレーニングの開始]ボタンをクリックします。モデルのトレーニングが開始されます。
tensorflow.keras.modelsからtfとしてtensorflowをインポートします。tensorflow.keras.layersからSequentialをインポートします。Tensorflow.keras.optimizersからDense、InputLayer、Dropout、Flatten、Reshape、BatchNormalization、Conv2D、MaxPooling2D、AveragePooling2Dをインポートします。 import MaxNorm#モデルアーキテクチャmodel = Sequential()model.add(InputLayer(input_shape =(X_train.shape、)、name = 'x_input'))model.add(Reshape((int(X_train.shape / 13)、13、 1)、input_shape =(X_train.shape、)))model.add(Conv2D(10、kernel_size = 5、activation = 'relu'、padding = 'same'、kernel_constraint = MaxNorm(3)))model.add(AveragePooling2D (pool_size = 2、padding = 'same'))model.add(Conv2D(5、kernel_size = 5、activation = 'relu'、padding = 'same'、kernel_constraint = MaxNorm(3)))model.add(AveragePooling2D( pool_size = 2、padding = 'same'))model.add(Flatten())model.add(Dense(classes、activation = 'softmax'、name = 'y_pred'、kernel_constraint = MaxNorm(3)))#これは学習率を制御しますopt = Adam(lr = 0.005、beta_1 = 0.9、beta_2 = 0.999)#ニューラルネットワークをトレーニングしますmodel.compile(loss = 'categorical_crossentropy'、optimizer = opt、metrics =)model.fit(X_train、Y_train、batch_size = 32、epochs = 9、validation_data =(X_test、Y_test)、verbose = 2)verbose = 2)verbose = 2)
モデルをトレーニングすると、トレーニングのパフォーマンスが表示されます。私の場合、精度は81.1%、損失は0.45であり、理想的なパフォーマンスではありませんが、続行できます。膨大なデータセットを作成することで、モデルのパフォーマンスを向上させることができます。
音声認識モデルの準備ができたら、このモデルをArduinoライブラリとしてデプロイします。モデルをライブラリとしてダウンロードする前に、「 ライブ分類」 ページに移動してパフォーマンスをテストできます。ライブ分類機能を使用すると、データセットに付属している既存のテストデータを使用するか、携帯電話からオーディオデータをストリーミングすることにより、モデルをテストできます。
携帯電話でデータをテストするには、携帯電話で [分類モードに切り替える]を 選択します。
モデルをArduinoライブラリとしてダウンロードするには、[展開]ページに移動し、[ Arduinoライブラリ] を選択します。次に、下にスクロールして[ビルド]をクリックし、プロセスを開始します。これにより、プロジェクト用のArduinoライブラリが構築されます。
次に、ArduinoIDEにライブラリを追加します。そのためには、Arduino IDEを開き、[ スケッチ ] > [ライブラリを含める ] > [Add.ZIPライブラリ ]をクリックし ます。
次に、 [ファイル]> [例]> [プロジェクト名]-[エッジインパルス]> [nano_ble33_sense_microphone]に移動して例を読み込みます。
Arduino音声認識用のArduinoコード
ここでは、音声コマンドでLEDを制御するためにいくつかの変更が加えられています。
コマンドの確率を出力する voidloop() にいくつかの変更を加えています。元のコードでは、すべてのラベルとその値を一緒に印刷しています。
for(size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++){ei_printf( "%s:%。5f \ n"、result.classification.label、result.classification.value); }
LEDを制御するには、すべてのコマンド確率を3つの異なる変数に保存して、条件ステートメントを配置できるようにする必要があります。したがって、新しいコードによれば、「 ライトオン」 コマンドの確率が0.50を超えると、LEDがオンになり、「 ライトオフ」 コマンドの確率が0.50を超えると、LEDがオフになります。
for(size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++){ノイズ= result.classification.value; Serial.println( "ノイズ:"); Serial.println(ノイズ); } for(size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix-){lightoff = result.classification.value; Serial.println( "ライトオフ:"); Serial.print(lightoff); } lighton = 1-(ノイズ+ライトオフ); Serial.println( "ライトオン:"); Serial.print(lighton); if(lighton> 0.50){digitalWrite(led、HIGH); } if(lightoff> 0.50){digitalWrite(led、LOW); }
変更を加えたら、コードをArduinoにアップロードします。115200ボーでシリアルモニターを開きます。
これは、Arduinoを使用して音声認識を構築し、デバイスを操作するコマンドを与える方法です。
ライブラリとコードを含む完全な作業ビデオを以下に示します。