基于stm32的语音识别设计(离线语音识别、DMA传输)

之所以写这篇,是因为在网上看到这个资料很少,所以自己写一下就当作是记录。这个模块的识别率亲测还是很高的,就是商家那边不提供开源,要的话只能定制就很。。。。但是作为一个小功能需求也就够了。但是要大批量的话还要做自己的产品就不建议了。毕竟没有二次开发的东西不实用。
硬件:snr6812、stm32f103、usb转ttl、杜邦线、喇叭
**实现功能:**通过识别关键词向串口发送对应内容
实现视频:
由于无法直接上传视频文件,所以放在了百度网盘里面,想知道实现的效果是怎么样的,可以自己下载视频去看看。
链接
提取码:a0bl
**采用通信:**串口通信
识别函数设计:

void Judgment_data(void){
//	判断指令在这里添加你的操作
	if((a1=='0')&& (a2=='4')){printf("语音控制已开启!
");}
	if((a1=='0')&& (a2=='5')){printf("灯已打开!
");}
	if((a1=='0')&& (a2=='6')){printf("灯已关闭
");}
	if((a1=='0')&& (a2=='7')){printf("收音机已打开!
");}
	if((a1=='0')&& (a2=='8')){printf("收音机已关闭!
");}
	if((a1=='8')&& (a2=='0')){printf("智能跟随模式已打开!
");}
	if((a1=='7')&& (a2=='0')){printf("智能跟随模式已关闭!
");}
	if((a1=='6')&& (a2=='0')){printf("已拨打第二个联系人!
");}
	if((a1=='5')&& (a2=='0')){printf("已拨打第一个联系人!
");}
	if((a1=='4')&& (a2=='0')){printf("已拨打第三个联系人!
");}
	if((a1=='3')&& (a2=='0')){printf("已挂掉电话!
");}
	if((a1=='2')&& (a2=='0')){printf("退下
");}
	if((a1=='9')&& (a2=='0')){printf("已全部打开
");}
	if((a1=='0')&& (a2=='0')){printf("已全部关闭
");}
	
}

DMA配置:

///USART2 DMA发送配置部分//	   		    
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHx:DMA通道CHx
//cpar:外设地址
//cmar:存储器地址    
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
{
	DMA_InitTypeDef DMA_InitStructure;
 	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	//使能DMA传输
  DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值
	DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设ADC基地址
	DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设
	DMA_InitStructure.DMA_BufferSize = 0;  //DMA通道的DMA缓存的大小
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级 
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
	DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器	
} 
//开启一次DMA传输
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len)
{
	DMA_Cmd(DMA_CHx, DISABLE );  //关闭 指示的通道        
	DMA_SetCurrDataCounter(DMA_CHx,len);//DMA通道的DMA缓存的大小	
	DMA_Cmd(DMA_CHx, ENABLE);           //开启DMA传输
}	   
/ 									 
稍后会上传工程文件。




一键三连呀!
原文地址:https://www.cnblogs.com/jee-cai/p/14095365.html