|
语音识别技术在自动化中非常有用,它不仅可以让您免提控制设备,还可以提高系统的安全性。除了制造语音控制小工具外,语音识别还为患有各种残疾的人们提供了重要帮助。
在之前的帖子中,我们制作了基于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”。
现在,在下一个窗口中,单击“Use your Mobile Phone”,然后将显示一个二维码。使用手机扫描二维码,或输入二维码上提供的URL。
这样会将您的手机与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构建语音识别并发出命令以操作设备的方式。
代码 本文使用的完整代码如下所示:
main.rar
(2.25 KB, 下载次数: 74)
|