前言
先看实验效果,通过ASR-PRO语音智能识别控制模块,来控制STM32单片机实现对应的控制功能。因为后台好多小伙伴私信问用的是什么语音模块,并且很少在网上看到如何使用此模块相关的文章,所以我将会在本篇文章详细介绍一下此模块相关的信息和具体的操作流程和应用代码。
stm32语言识别
一、硬件设计
本篇文章用到的语音识别模块是信泰微电子的ASR-PRO语音智能识别模块,有需要的小伙伴可以直接在某宝直接搜索店铺就可以看到,本项目用到的是店铺中的ASRPRO开发板+喇叭的套餐,大家可以根据自己的需求去选配即可。ASR-PRO语音智能语音识别控制模块 AI离线识别开发板 自定义词条-淘宝网 (taobao.com)
模块简介
1)内置脑神经网络处理器。
2)支持 DNN\TDNN\RNN 等神经网络及卷积运算硬件运算,非软件运算。
3)支持语音识别、声纹识别、语音增强、语音检测、单麦克风降噪增强、单麦克风回声消除、360度全方位拾音等功能。
此开发板自带3路UART、6路PWM、10个IO口,支持连接众多外设,可以连接蓝牙模块、温湿度传感器、WIFI模块、电机、继电器等等模块。
语音模块可以通过配套的软件来进行编程,烧录程序只需要一条Type-C数据线,支持入门模式、标准模式和专业模式三种编程方式来进行编程,简单的应用使用入门和标准模式就足够了,只需要动动手指、打打字就能配置完成我们所需要的语音控制方式,使用起来还是比较方便的。如果涉及到比较复杂的使用的话,此软件还支持C++开发。
功能其实是十分强大的,但是由于我们的重点放在了学习STM32上面,所以本项目只是把它当成一个语音识别模块来使用。
连接方式
本项目通过stm32单片机的串口4与ASRPRO语音识别模块进行通讯,对应的引脚是串口4接收引脚(PC11) 和 串口4发送引脚(PC10),语音模块通过5V进行供电。
二、软件设计
ASR-PRO语音模块使用方法
ASR-PRO语音模块的购买链接中,有对应的百度网盘资料,下载后会看到里面会有一个名为天问Block的exe文件,点击安装下载到自定义文件目录下即可。
打开后是这个界面,选择对应的主板,我们用到的是ASRPRO开发板,所以选择ASRPRO。
以下为本项目用到的语音模块控制模版,我将根据此模版来进行介绍(我会将模版放在百度网盘链接中)。
1)点击进入专业模式,然后在左边的栏中入门模式中拉出上电初始状态的模版进行修改。
2)语音播报人:用于修改不同的播报音色(清新女生、浑厚男声等等),音量和语速也可以根据需求进行修改。
3)上电播报语音和退出播报语音同样可以自定义,唤醒退出时间是指当我们没有进行语音控制,语音模块进入睡眠的时间。
4)STM32单片机的串口4连接到ASRPRO开发板的PA5和PA6引脚对应到串口2,波特率配置为9600,此处根据硬件的引脚连接进行配置即可。
5) 修改为以下配置即可。
6)以下的命令词同样在入门模式中可以看到,语音唤醒框填的内容:当我们对语音模块进行语音控制时,语音模块识别到对应的输入后,就会通过对应的串口发送16进制数据给STM32单片机,然后我们只需要在STM32串口接收到数据后,对数据进行处理即可。
操作也十分的简单,只需要通过拖拉命令词简单的叠加即可。
7)烧录程序:通过Type-C数据线将电脑和ASR-PRO开发板进行连接,然后选择对应的COM口,注意先生成模型后,再点击2M编译下载将Bin文件烧录到开发板中即可。
CubeMX串口配置
在cubemx中对串口进行配置,将串口4配置为异步收发模式、波特率为9600,然后点击GENERATE CODE生成代码即可。
/*** @brief UART4 Initialization Function* @param None* @retval None*/
static void MX_UART4_Init(void)
{huart4.Instance = UART4;huart4.Init.BaudRate = 9600;huart4.Init.WordLength = UART_WORDLENGTH_8B;huart4.Init.StopBits = UART_STOPBITS_1;huart4.Init.Parity = UART_PARITY_NONE;huart4.Init.Mode = UART_MODE_TX_RX;huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart4.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart4) != HAL_OK){Error_Handler();}
}
STM32语音控制代码
voice.c中要注意的函数是:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 函数,这是串口接收中断的回调函数,我们可以在用户文件中对它重新进行实现,此处我们定义了一个八位的无符号整形变量Voice_Data,来接收语音模块识别后,模块通过串口回传给单片机的对应数据。
void setup_uart_interrupt() 调用中断接收函数,开启串口中断。
voice_check()函数用于处理语音识别后,模块通过串口回传给单片机的对应数据,然后对单片机进行相应的操作,实现对应的语音控制。语音识别后返回的数据可以通过模块自带的软件来进行自定义。
#include "voice.h"extern UART_HandleTypeDef huart4;uint8_t Voice_Data;void Voice_Send(char *str)
{unsigned int k=0;while(*(str + k) != '\0'){HAL_UART_Transmit(&huart4, (uint8_t *)(str + k), 1, 10);k++; }
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == UART4) // 确保是期望的UART实例{HAL_UART_Receive_IT(huart, &Voice_Data, 1);printf("Voice: %d\r\n", Voice_Data);}
}void Voice_Check()
{switch (Voice_Data){case 0x01 :/* 开灯 */Voice_Data = 0;Open_LED();break;case 0x02 :/* 关灯 */Voice_Data = 0;Close_LED(); break;case 0x03 :/* 开蜂鸣器 */Voice_Data = 0;BEEP_OUT;break;case 0x04 :/* 关蜂鸣器 */Voice_Data = 0;BEEP_STOP;break;case 0x05:/* 开门 */Voice_Data = 0;Open_Door();break; case 0x06 :/* 关门 */Voice_Data = 0;Close_Door();break; default : Voice_Data = 0; break;}
}void setup_uart_interrupt()
{HAL_UART_Receive_IT(&huart4, &Voice_Data, 1);
}
voice.h文件中对函数进行声明,方便供其他文件进行调用。
#ifndef _VOICE_H_
#define _VOICE_H_#include "main.h"void Voice_Check();
void Voice_Send(char *str);
void setup_uart_interrupt();
#endif
在main函数中对我们的代码进行验证,即可得到前言中的实验效果。
int main(void)
{setup_uart_interrupt() while (1){ Voice_Check();HAL_Delay(1000);}
}