语音识别技术在自动化中非常有用,它不仅可以让您免提控制设备,还可以提高系统的安全性。除了制造语音控制小工具外,语音识别还为患有各种残疾的人们提供了重要帮助。
在之前的项目中,我们构建了基于Arduino的文本到语音(TTS)转换器和语音控制灯。现在在这个项目中,我们将使用机器学习来使用Edge Impulse Studio和三个命令(即“ LIGHT ON” ,“ LIGHT OFF” 和“ NOISE ”)训练语音识别模型。Edge Impulse是一个在线机器学习平台,使开发人员能够使用嵌入式机器学习来创建下一代智能设备解决方案。我们以前使用Edge impulse studio区分咳嗽声和噪音声。
所需组件
硬件
- Arduino 33 BLE感应
- LED
- 跳线
软件
- 边缘冲动工作室
- Arduino IDE
我们已经介绍了有关Arduino 33 BLE Sense的详细教程。
电路原理图
下面给出了使用Arduino进行语音识别的电路图。Arduino 33 BLE的Fritzing部分不可用,所以我使用了Arduino Nano,因为两者具有相同的引脚排列。
LED的正极引线连接到Arduino 33 BLE感测的数字引脚5,负极引线连接到Arduino的GND引脚。
创建用于Arduino语音识别的数据集
在这里,Edge Impulse Studio用于训练我们的语音识别模型。在Edge Impulse Studio上训练模型类似于在其他机器学习框架上训练机器学习模型。对于训练,机器学习模型的第一步是收集一个数据集,该数据集包含我们希望能够识别的数据样本。
由于我们的目标是使用语音命令控制LED,因此我们需要收集所有命令和噪音的语音样本,以便可以区分语音命令和其他噪音。
我们将创建一个具有三个类别的数据集:“ LED点亮”,“ LED熄灭”和“噪声”。要创建数据集,请创建一个Edge Impulse帐户,验证您的帐户,然后启动一个新项目。您可以使用移动设备,Arduino开发板来加载样本,也可以将数据集导入到边缘脉冲帐户中。将样本加载到您的帐户中最简单的方法是使用手机。为此,将手机与Edge Impulse连接。
要连接手机,请单击“ 设备 ”,然后单击“ 连接新设备” 。
现在,在下一个窗口中,单击 “使用您的手机” ,然后将显示QR码。使用手机扫描QR码,或输入QR码上提供的URL。
这会将您的手机与Edge Impulse工作室连接。
通过将手机与Edge Impulse Studio连接,您现在可以加载示例。要加载样品,请单击“ 数据采集” 。现在,在“数据采集”页面上,输入标签名称,选择麦克风作为传感器,然后输入采样长度。点击“ 开始采样” ,您的设备将捕获一个2秒的采样。在不同条件下总共记录10到12个语音样本。
在上载了头等舱的样品后,现在设置更改标签并收集“ 熄灯” 和 “噪声” 类的样品。
这些样本用于培训模块,在接下来的步骤中,我们将收集测试数据。测试数据应至少为训练数据的30%,因此请收集4个“噪声”样本以及4至5个“点亮”和“熄灭”样本。
训练模型
准备好数据集后,现在我们可以为数据创建脉冲。为此,转到“ 创建 冲动 ”页面。将1000 ms窗口大小的默认设置更改为1200ms,将500 ms窗口增加到50ms。这意味着我们的数据将在每次58 ms的时间内一次处理1.2 s。
现在,在“ 创建脉冲” 页面上,单击“ 添加处理块” 。在下一个窗口中,选择音频(MFCC)块。之后,单击“ 添加学习块”, 然后选择“神经网络(Keras)”块。然后点击“ 保存脉冲” 。
在下一步中,转到MFCC页面,然后单击“生成功能”。它将为我们所有的音频窗口生成MFCC块。
之后,转到“ NN分类器” 页面,然后单击“ 神经网络设置” 右上角的三个点, 然后选择“ 切换到Keras(专家)模式” 。
用以下代码替换原稿,并将“ 最低置信度” 更改为“ 0.70” 。然后点击“ 开始训练” 按钮。它将开始训练您的模型。
从tensorflow.keras.models导入tf作为tf,从tensorflow.keras.layers导入顺序。导入MaxNorm#模型体系结构模型= 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)))#这可以控制学习率= Adam(lr = 0.005,beta_1 = 0.9,beta_2 = 0.999)#训练神经网络模型。compile(loss ='categorical_crossentropy',optimizer = opt,metrics =)model.fit(X_train,Y_train,batch_size = 32,历元= 9,validation_data =(X_test,Y_test),详细= 2)详细= 2)详细= 2)
训练模型后,它将显示训练效果。对我来说,准确度是81.1%,损失是0.45,这不是理想的性能,但是我们可以继续进行下去。您可以通过创建庞大的数据集来提高模型的性能。
现在,当我们的语音识别模型准备就绪时,我们会将其部署为Arduino库。在将模型下载为库之前,您可以通过转到“ 实时分类” 页面来测试性能。实时分类功能使您既可以使用数据集附带的现有测试数据,也可以通过流式传输手机中的音频数据来测试模型。
要使用手机测试数据,请在手机上选择“ 切换到分类模式” 。
现在要将模型下载为Arduino库,请转到“ 部署 ”页面,然后选择“ Arduino库” 。现在向下滚动并单击“ Build ”开始该过程。这将为您的项目构建一个Arduino库。
现在在您的Arduino IDE中添加该库。为此,请打开Arduino IDE,然后单击 Sketch> Include Library> Add.ZIP library
然后,通过转到 文件>示例>您的项目名称-Edge Impulse> nano_ble33_sense_microphone 来加载示例。
用于Arduino语音识别的Arduino代码
此处已进行了一些更改,以通过语音命令控制LED。
我们在 void loop() 中进行一些更改,在该处打印命令的概率。在原始代码中,它将所有标签及其值一起打印。
对于(size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++){ei_printf(“%s:%.5f \ n”,result.classification.label,result.classification.value); }
为了控制LED,我们必须将所有命令概率保存在三个不同的变量中,以便我们可以在它们上放置条件语句。因此,根据新代码,如果“ 点亮” 命令的概率大于0.50,则它将打开LED;如果“ 点亮” 命令的概率大于0.50,则将关闭LED。
for(size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++){噪声= result.classification.value; Serial.println(“ Noise:”); Serial.println(noise); } for(size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--){lightoff = result.classification.value; Serial.println(“ Light Off:”); Serial.print(lightoff); } lighton = 1-(噪声+ 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构建语音识别并发出命令以操作设备的方式。
下面给出了包含库和代码的完整的工作视频。