所需的组件
● 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
”。
现在,在下一个窗口中,单击“
Use your Mobile Phone
”,然后将显示一个二维码。使用手机扫描二维码,或输入二维码上提供的URL。
这样会将您的手机与Edge Impulse Studio连接。
这些样本用于培训模块,在接下来的步骤中,我们将收集测试数据。测试数据至少应为训练数据的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构建语音识别并发出命令以操作设备的方式。
代码
本文使用的完整代码如下所示:
需要自己在网站生成相应的模型,然后替换代码