語音識別技術在自動化中非常有用,它不僅可以讓您免提控制設備,還可以提高系統的安全性。除了制造語音控制小工具外,語音識別還為患有各種殘疾的人們提供了重要幫助。
在之前的帖子中,我們制作了基于Arduino的文本到語音(TTS)轉換器和語音控制燈。現在,在本篇文章中,我們將使用Edge Impulse Studio通過三個命令,即“ LIGHT ON”、“ LIGHT OFF”和“ NOISE”,使用機器學習來訓練語音識別模型。 Edge Impulse是一個在線機器學習平臺,使開發人員能夠使用嵌入式機器學習來創建下一代智能設備解決方案。
所需的組件
● Arduino 33 BLE Sense開發板
● 發光二極管
● 跳線
● Edge Impulse Studio
● Arduino IDE
電路原理圖
下面給出了使用Arduino進行語音識別的電路連接圖。這里沒有可用的Arduino 33 BLE的Fritzing部件,所以我使用了Arduino Nano,兩者的引腳排列相同。
LED的正極引腳連接到Arduino 33 BLE Sense開發板的數字引腳5,負極引腳連接到Arduino的GND引腳。
創建用于Arduino語音識別的數據集
本文中,Edge Impulse Studio用于訓練我們的語音識別模型。在Edge Impulse Studio上訓練模型類似于在其他機器學習框架上訓練機器學習模型。對于訓練,機器學習模型的第一步是收集一個數據集,該數據集包含我們希望能夠識別的數據樣本。
由于我們的目標是使用語音命令控制LED,因此我們需要收集所有命令和噪聲的語音樣本,以便可以區分語音命令和其他噪聲。
我們將創建一個具有三個類別的數據集:“LED ON”,“LED ON”和“noise”。要創建數據集,請先創建一個Edge Impulse帳戶,驗證您的帳戶,然后啟動一個新項目。您可以使用手機、Arduino開發板來加載樣本,也可以將數據集導入到Edge Impulse帳戶中。將樣本加載到您的帳戶中最簡單的方法是使用手機。為此,將手機與Edge Impulse連接。
要連接手機,請單擊“Devices”,然后單擊“Connect a New Device”。
這樣會將您的手機與Edge Impulse Studio連接。
通過將手機與Edge Impulse Studio連接,您現在可以加載樣本。要加載樣本,請點擊“Data acquisition”。現在,在“Data acquisition”頁面上,輸入標簽名稱,選擇麥克風作為傳感器,然后輸入采樣長度。點擊“Start sampling”,您的設備將捕獲一個2秒的采樣。在不同條件下總共記錄10到12個語音樣本。
在上傳樣本后,現在設置更改標簽并收集“light off’”和“noise”的樣本。
這些樣本用于培訓模塊,在接下來的步驟中,我們將收集測試數據。測試數據至少應為訓練數據的30%,因此請收集4個“noise”樣本和4至5個“light on”和“light off”樣本。
訓練模型
準備好數據集后,現在我們可以為數據創建一個Impulse。為此,請轉到“Create impulse”頁面。將窗口大小1000 ms的默認設置更改為1200ms,將500 ms窗口增加到50ms。這意味著我們的數據將在每次58 ms的時間內一次處理1.2 s。
現在,在“Create impulse”頁面上,單擊“Add a processing block”。在下一個窗口中,選擇Audio(MFCC)塊。之后,點擊“Add a learning block”,然后選擇Neural Network (Keras) 模塊。然后點擊“Save Impulse”。
在下一步中,轉到MFCC頁面,然后單擊“Generate Features”。它將為我們所有的音頻窗口生成MFCC塊。
之后,轉到“ NN Classifier”頁面,然后單擊“Neural Network settings”右上角的三個點,然后選擇“Switch to Keras (expert) mode”。
將原始代碼替換為以下代碼,并將“最Minimum confidence rating”更改為“ 0.70”。然后點擊“Start training”按鈕。它將開始訓練您的模型。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.constraints import MaxNorm
# model architecture
model = Sequential()
model.add(InputLayer(input_shape=(X_train.shape[1], ), name='x_input'))
model.add(Reshape((int(X_train.shape[1] / 13), 13, 1), input_shape=(X_train.shape[1], )))
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)))
# this controls the learning rate
opt = Adam(lr=0.005, beta_1=0.9, beta_2=0.999)
# train the neural network
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
model.fit(X_train, Y_train, batch_size=32, epochs=9, validation_data=(X_test, Y_test), verbose=2)
訓練模型后,它將顯示訓練效果。本文中,精度為81.1%,損耗為0.45,這不是理想的,但我們可以繼續進行。您可以通過創建龐大的數據集來提高模型的性能。
現在,當我們的語音識別模型準備就緒時,我們將把該模型部署為Arduino庫。在將模型下載為庫之前,您可以轉到“Live Classification”頁面來測試性能。Live Classification功能使您既可以使用數據集附帶的現有測試數據,也可以通過流式傳輸手機中的音頻數據來測試模型。
要使用手機測試數據,請在手機上選擇“Switch to Classification Mode”。
現在要將模型下載為Arduino庫,請轉到“Deployment”頁面,然后選擇“ Arduino庫”。現在向下滾動并點擊“Build”。這將為您的項目制作一個Arduino庫。
現在,在您的Arduino IDE中添加該庫。請打開Arduino IDE,然后單擊Sketch> Include Library> Add.ZIP library。然后,轉到File > Examples > Your project name - Edge Impulse > nano_ble33_sense_microphone加載示例。
用于Arduino語音識別的代碼
我們在void loop()函數中進行一些更改,在該處打印命令的概率。在原始代碼中,它將所有標簽及其值一起打印。
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,我們必須將所有命令概率保存在三個不同的變量中,以便我們可以在它們上放置條件語句。因此,根據新代碼,如果“light on”命令的概率大于0.50,則它將打開LED;如果“light off’”命令的概率大于0.50,則它將關閉LED。
for (size_t ix = 2; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
noise = result.classification[ix].value;
Serial.println("Noise: ");
Serial.println(noise);
}
for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix--) {
lightoff = result.classification[ix].value;
Serial.println("Light Off: ");
Serial.print(lightoff);
}
lighton = 1- (noise +lightoff);
Serial.println("Light ON: ");
Serial.print(lighton);
if (lighton > 0.50){
digitalWrite(led, HIGH);
}
if (lightoff > 0.50){
digitalWrite(led, LOW);
}
進行更改后,將代碼上傳到Arduino。以115200波特率打開串口監視器。
以上就是您可以使用Arduino構建語音識別并發出命令以操作設備的方式。
編輯:hfy
-
led
+關注
關注
240文章
23134瀏覽量
658410 -
機器學習
+關注
關注
66文章
8377瀏覽量
132406 -
語音控制
+關注
關注
5文章
481瀏覽量
28230 -
Arduino
+關注
關注
187文章
6464瀏覽量
186643
發布評論請先 登錄
相關推薦
評論