STM32F103+语音识别模块HBR640
STM32F103+语音识别识别模块HBR640先来看结果演示:用声音控制烧水壶烧水和关闭链接:SinaVisitorSystemHBR640实物图HBR640框架结构图:串口工具:上位机串口协议:官方给的STM32F4的样例,太过涉及芯片本身特定库函数的调用了,变量和宏定义太多。后面由于工程紧急,且要使用与官方历程不同的芯片实现适应性功能裁剪,没有时间先理解官方繁琐的变量和宏定义变换,再一一对应自己所用芯片就的相同功能修改。
所以自己照着不是很复杂的通信协议写了一个模块历程。我曾经在网上搜索这个模块,发现根本没有它的资料,所以我就写了一个命令集齐全的,且对本身芯片型号控制资源依赖少的程序模块出来和大家分享。
工程目录:
main()函数:
voidmain(){intnum=0;hbr640_init();while(1){num=Continuous_Recognition(2);if(num==4){num=0;Play_Voice(0x00,0x00);//叮当-》你好//Play_Voice_Stop();//停止播放//delay_ms(500);soundBee(1);//长响一下delay_ms(300);num=0;Continuous_Recognition(1);}elseif(num==1){num=0;Play_Voice(0x01,0x00);//烧水-》来个节目吧//Play_Voice_Stop();//停止播放//delay_ms(900);soundBee(0);//短响两下delay_ms(300);num=0;Continuous_Recognition(1);}elseif(num==6){num=0;Play_Voice(0x02,0x00);//关闭-》讲个笑话吧//Play_Voice_Stop();//停止播放//delay_ms(900);//短响2下soundBee(0);delay_ms(500);soundBee(0);delay_ms(300);num=0;Continuous_Recognition(1);}delay_ms(100);}以前发的SendData()有问题,修改如下:
//修改后voidUART_Send_Message_hbr(u8*Data,u8lenth){while(lenth--){USART_SendData(USART2,*Data);while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);Data++;RX_data_flag=0;}}//之前的voidSendData(unsignedchardate1,unsignedchardate2,unsignedchardate3)//发送单个字节{delay_us(100);USART_SendData(USART2,date1);ACCLOG("USART_SendData_date1=%0X ",date1);while((USART2->SR&0X40)==0);//等待前面的数据发送完成delay_us(100);USART_SendData(USART2,date2);ACCLOG("USART_SendData_date2=%0X ",date2);while((USART2->SR&0X40)==0);//等待前面的数据发送完成delay_us(100);USART_SendData(USART2,date3);ACCLOG("USART_SendData_date3=%0X ",date3);while((USART2->SR&0X40)==0);//等待前面的数据发送完成RX_data_flag=0;}HBR640.c文件
/*******************************************************************************功能:HBR640TIME:2018年6月3日NAME:魏波1.函数名称:hbr640_init;函数功能:初始化hbr6402.函数名称:ReadData;函数功能:mode=1:接收hbr640传回的三组数据并与入口进行比对校验3.函数名称:SendData;函数功能:date1date2date3分别向hbr640发送一个字节的命令信息4.函数名称:Microphone_Sensitivity;函数功能:设置hbr640的麦克风灵敏度强度级数5.函数名称:Noise_Limit;函数功能:设置hbr640的麦克风噪声门限设置6.函数名称:Recognition_Group;函数功能:设置需要识别的语音组7.函数名称:Some_working_640;函数功能:在Once_Recognition或Continuous_Recognition之一的mode2调用它,起到循环接收640数据的作用。8.函数名称:Once_Recognition;函数功能:启动一次识别模式,并且设置识别处理的最大时间9.函数名称:Continuous_Recognition;函数功能:启动连续识别模式10.函数名称:Exit_Recognition;函数功能:退出识别,等待命令11.函数名称:hbr640_Sleep;函数功能:进入休眠模式12.函数名称:Continuous_Recognition;函数功能:提取候选结果13.函数名称:Play_Voice;函数功能:设置播放语音,并设置播放语音的组序号14.函数名称:Play_Voice_Stop;函数功能:设置停止播放语音15.函数名称:Volume_Config;函数功能:设置播放语音的音量*********************************************************************************/#include"sys.h"#include"hbr640.h"#include"usart2.h"//#include"usart.h"#include"delay.h"/*改:芯片延时函数*//*******************************************************************************功能:是否开启DEBUG模式开启:#define_DEBUG_1关闭:#define_DEBUG_0*********************************************************************************/#define_DEBUG_1#if_DEBUG_#definePRINTF(...)printf(__VA_ARGS__)#else#definePRINTF(...)#endifexternunsignedcharRecognition_data[3];unsignedcharUSART2_RX_data[3];//储存接收的3个数据unsignedcharRX_data_flag=0;//接收3个数据成功标志/*********************************************************************************函数名称:BEEP_Init函数功能:初始化BEEP入口参数:beep_time响的时长返回值:void*********************************************************************************/voidBEEP_OPEN(intbeep_time){BEEP_Init();GPIO_SetBits(GPIOB,GPIO_Pin_5);//开delay_ms(beep_time);GPIO_ResetBits(GPIOB,GPIO_Pin_5);//关return;}/*********************************************************************************函数名称:hbr640_init函数功能:初始化hbr640入口参数:BaudRatehbr640所用到的串口的波特率值返回值:1模块存在初始化成功0没有检测到模块初始化失败*********************************************************************************/unsignedcharhbr640_init(unsignedintBaudRate)//默认为115200需要设置请在语音命令生成软件设置{USART2_Init(BaudRate);/*改:芯片串口初始化*/SendData(0xA0,0xA0,0xA0);//初始化语音模块命令//delay_ms(500);if(ReadData(0x50,0x50,0x20,1))//检查hbr640是否存在,0x20是芯片版本号(每个模块的版本号不同){//Microphone_Sensitivity(0x2F,0x0C);//设置麦克风灵敏度强度上下限//Noise_Limit(0x16,0x1c);//设置麦克风噪声门限设置Volume_Config(0x03);//设置放音音量if(Recognition_Group(0x01,0x00))//设置需要识别的语音组{Continuous_Recognition(1);//启动连续识别模式,mode=1初始化Recognition_flag=1;//初始化完成,开启识别结果储存}return1;}return0;}/*********************************************************************************函数名称:ReadData函数功能:mode=1:接收hbr640传回的三组数据并与入口进行比对校验mode=2:将接收数据暂存入RxDataTemp数组中入口参数:date1date2date3说明书的接收命令集mode=1:用于接收命令不变的情况mode=2:用于接收命令变的情况返回值:1与入口参数相同0与入口参数不同*********************************************************************************/unsignedcharRxDataTemp[3]={0,0,0};unsignedcharReadData(unsignedchardate1,unsignedchardate2,unsignedchardate3,unsignedcharmode){u32sum=0;//PRINTF("mode=%0X ",mode);//PRINTF("ReadData_RX_data_flag=%0X ",RX_data_flag);while(!RX_data_flag)//等待模块回应,RX_data_flag=0;接收3个数据成功标志{sum++;if(sum>80000)break;}if(mode==1){PRINTF("USART2_RX_data[0]=%0X ",USART2_RX_data[0]);PRINTF("USART2_RX_data[1]=%0X ",USART2_RX_data[1]);PRINTF("USART2_RX_data[2]=%0X ",USART2_RX_data[2]);if(sumSR&0X40)==0);//等待前面的数据发送完成delay_us(50);USART_SendData(USART2,date3);PRINTF("USART_SendData_date3=%0X ",date3);while((USART2->SR&0X40)==0);//等待前面的数据发送完成RX_data_flag=0;}/*********************************************************************************函数名称:Microphone_Sensitivity函数功能:设置hbr640的麦克风灵敏度入口参数:Strength_Series_Low麦克风灵敏度下限trength_Series_Hight麦克风灵敏度上限返回值:无*********************************************************************************/voidMicrophone_Sensitivity(unsignedintStrength_Series_Low,unsignedintStrength_Series_Hight){if(Strength_Series_Low!=0x2F&&Strength_Series_Hight!=0X0B)//默认值:Strength_Series_Low=0x2F;Strength_Series_Hight=0X0B{if(Strength_Series_Low>0x3F)//麦克风灵敏度下限范围0x00至0x3f(十进制是0~77){Strength_Series_Low=0x3F;}if(Strength_Series_Hight>0x0f)//麦克风灵敏度上限范围0x00至0x0f(十进制是0~15){Strength_Series_Hight=0x0F;}SendData(0xA1,Strength_Series_Low,Strength_Series_Hight);}}/*********************************************************************************函数名称:Noise_Limit函数功能:设置hbr640的麦克风噪声门限和语音音量门限入口参数:Strength_Series_Low麦克风噪声下限Strength_Series_Hight麦克风噪声上限返回值:无*********************************************************************************/voidNoise_Limit(unsignedintStrength_Series_Low,unsignedintStrength_Series_Hight){if(Strength_Series_Low!=0x16&&Strength_Series_Hight!=0X19)//默认值:Strength_Series_Low=0x16;Strength_Series_Hight=0X19{//噪声下限范围0x16至0x28(十进制是22~40)if(Strength_Series_Low>0x28){Strength_Series_Low=0x28;}elseif(Strength_Series_Low0x30){Strength_Series_Hight=0x30;}elseif(Strength_Series_Hight从机,0xA20xLL,0xHH}}/*********************************************************************************函数名称:Recognition_Group函数功能:设置需要识别的语音组入口参数:Strength_Series_Hight(0x**)Strength_Series_Low(0x**)组成0xHHLL的识别组数序号返回值:1设置成功0设置失败*********************************************************************************/unsignedcharRecognition_Group(unsignedintStrength_Series_Low,unsignedintStrength_Series_Hight)//0xHHLL为需要设定识别的组数序号{if(Strength_Series_Low0x64){Strength_Series_Hight=0x64;//hbr640的识别组数范围0x01至0x64(十进制是1~100,最多识别100条)}SendData(0xA9,Strength_Series_Low,Strength_Series_Hight);//配置识别组:0xA90xLL,0xHH,主机-->从机,ReadData(0,0,0,2);//mode=2:将接收数据暂存入RxDataTemp数组中//PRINTF("->%d%d%d",RxDataTemp[0],RxDataTemp[1],RxDataTemp[2]);//配置识别组:0x590xll,0xhh,从机-->主机,if(RxDataTemp[0]==0x59&&RxDataTemp[1]==Strength_Series_Low&&RxDataTemp[2]==Strength_Series_Hight){return1;}return0;}/*********************************************************************************函数名称:Some_working_640函数功能:在Once_Recognition或Continuous_Recognition之一的mode2调用它,起到循环接收640数据的作用入口参数:无返回值:无*********************************************************************************/voidSome_working_640(void){//检测语音播放是否结束,播放完成返回0x790x010x00if(Recognition_data[0]==0x79&&Recognition_data[1]==0x01&&Recognition_data[2]==0x00){Play_Voice_flag=0;//播放结束标记Continuous_Recognition(1);//启动连续识别模式,mode=1初始化mode=2循环检测识别结果}//Candidate_Result();提取候选结果}/*********************************************************************************函数名称:Once_Recognition函数功能:启动一次识别模式,并且设置识别处理的最大时间入口参数:Recognition_Time设置识别最大时间mode=1初始化mode=2循环检测识别结果返回值:!0设置成功,并返回该组语音的识别结果的序号0设置失败*********************************************************************************/unsignedintOnce_Recognition(unsignedcharRecognition_Time,unsignedcharmode)//0x00(不超时)秒内进行识别{unsignedintresult=0;if(mode==1){SendData(0xAA,Recognition_Time,0x00);}if(mode==2){if(Recognition_flag==10){//Some_working_640();//循环接收640数据的作用if(RxDataTemp[0]==0x5a)//返回值:0x5a0x110xhh从机->主机{/*超时、有语音输入但无正确结果的处理*///0x7fff表示超时,0xffff表示有语音输入但无正确结果if((Recognition_data[1]==0xff&&Recognition_data[2]==0xff)||(Recognition_data[1]==0xff&&Recognition_data[2]==0x7f)){Recognition_data[0]=0;Recognition_data[1]=0;Recognition_data[2]=0;Recognition_flag=1;return0;}result=Recognition_data[1]+(Recognition_data[2]SR&0X40)==0);//等待前面的数据发送完成delay_us(50);USART_SendData(USART2,0x00);while((USART2->SR&0X40)==0);//等待前面的数据发送完成}if(mode==2){if(Recognition_flag==10){//PRINTF("-》%d%d%d",Recognition_data[0],Recognition_data[1],Recognition_data[2]);Some_working_640();//mode2调用它,起到循环接收640数据的作用if(Recognition_data[0]==0x5b&&Recognition_data[1]==0xff&&Recognition_data[2]==0xff)//0xffff表示有语音输入但无正确结果{Recognition_data[0]=0;Recognition_data[1]=0;Recognition_data[2]=0;Recognition_flag=1;return0;}if(Recognition_data[0]==0x5b){result=Recognition_data[1]+(Recognition_data[2]SR&0X40)==0);//等待前面的数据发送完成return1;}return0;}/*********************************************************************************函数名称:Continuous_Recognition函数功能:提取候选结果入口参数:result(0至7级)其值越小优先级越高,识别相似度越高mode=1初始化mode=2循环检测识别结果返回值:!0设置成功,并返回该组语音的识别候选结果的序号0设置失败*********************************************************************************/unsignedintCandidate_Result(unsignedcharresult,unsignedcharmode){if(mode==1){if(result>7){result=7;}SendData(0xAF,result,0x00);}if(mode==2)if(RxDataTemp[0]==0x5f){if((RxDataTemp[1]==0xff&&RxDataTemp[2]==0xff))//0xffff表示无候选词{return0;}returnRxDataTemp[1]+(RxDataTemp[2]可以没有//初始化串口对应IO口TX-PA2RX-PA3GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStrue);GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;GPIO_Init(GPIOA,&GPIO_InitStrue);//初始化串口模式状态USART_InitStrue.USART_BaudRate=My_BaudRate;//波特率USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//发送接收模式都使用USART_InitStrue.USART_Parity=USART_Parity_No;//没有奇偶校验USART_InitStrue.USART_StopBits=USART_StopBits_1;//一位停止位USART_InitStrue.USART_WordLength=USART_WordLength_8b;//每次发送数据宽度为8位USART_Init(USART2,&USART_InitStrue);USART_Cmd(USART2,ENABLE);//使能串口USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启接收中断//初始化中断优先级NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStrue);}//BEEPvoidBEEP_Init(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB,PE端口时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//LED0-->PB.5端口配置GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHzGPIO_Init(GPIOB,&GPIO_InitStructure);//根据设定参数初始化GPIOB.5//GPIO_SetBits(GPIOB,GPIO_Pin_5);//PB.5输出高GPIO_ResetBits(GPIOB,GPIO_Pin_5);//输出0,关闭蜂鸣器输出}charn=0;/********************************************************************************FunctionName:USART2_IRQHandler*Description:ThisfunctionhandlesUSART2exception.*Input:*Output:*Return:*******************************************************************************/voidUSART2_IRQHandler(void){unsignedcharRX_data_flag=0;charn=0;if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET){unsignedcharkey=1;if(!RX_data_flag)//MCU发送命令完成后RX_data_flag置0{if(RX_data_countLD3320语音识别模块:LDV7模块使用详解
喜欢请关注微信公众号:嵌入式从0到1
公众号内容面向在校大学生、电子爱好者、嵌入式工程师;
涉及电子制作、模块使用、单片机技术、物联网相关知识分享;
软硬件全栈工程师,玩模块,学硬件,带你从0走到1
LD3320是非特定人(不用针对指定人)语音识别芯片,即语音声控芯片。最多可以识别50条预先内置的指令。 工作模式:LD3320(LDV7)语音模块可以工作在以下三种模式:普通模式:直接说话,模块直接识别;按键模式:按键触发开始ASR进程;口令模式:需要一级唤醒词(口令);推荐使用口令模式,这样避免嘈杂环境下误动作。 应用场景:1、家居智能控制2、智能小车DIY设计3、毕业设计创新功能4、个人DIY设计5、语音控制嵌入式产品设计 我购买的LDV7语音识别模块,内置单片机,LD3320语音识别芯片的驱动是靠模块上自带的STC11L08单片机驱动的,我们可以修改模块自带工程的Demo程序,修改里面的关键词,然后将识别的结果通过串口打印出来,我们使用另外一个MCU与该模块进行串口通信,解析收到的串口指令,进而做响应的指令动作。 例如我们说口令:当前时间(dangqianshijian)》》模块识别之后,串口输出:PrintCom("{"VoiceCommandCode":2}");》》MCU接收串口信息之后,对该串口指令进行解析(可以使用cJSON解析此字符串);》》然后通过TTS文字转语音模块播放当前时间,即完成本次语音识别控制过程。 识别原理:就是你说一句话,然后模块用拼音去和你的发音做比较,在关键词中找出哪些预设值的词语与发音的接近程度大于多少的(假定50%),然后再从一堆大于(50%)里面输出一个最接近的。 这里就会造成一个问题,容易造成误识别太多。如果你只有一个关键词:时间然后你说了一句:‘时刻’,他识别到‘时’这个发音,所以有50%以上的相似,但是候选词中没有‘时刻’这个比他更接近的关键词,所以他就会输出‘时间’的结果。这样子他就是错误了。如果你设置一些拟声词,有可能随随便便就触发了。 解决方案:在设定好要识别的关键词语后,为了进一步降低误识别率,可以再添加一些其他的任意词汇进识别列表,用来吸收错误识别,从而达到降低误识别率的目的。我们把这样一些关键词语称之为“垃圾关键词语”。 比如,某个应用场景中,需要识别的关键词语是4条,“前进”,“后退”,“开门”,“关门”。在把这4个关键词语设置进LD3320后,可以再另外设置10~30个词语进LD3320,比如“前门”,“后门”,“阿阿阿”,“呜呜”等等。所以最好把一些拟声词或者容易混淆的词语设置为垃圾关键词,即,识别后不进行输出。 只有识别结果是4个关键词语之内的,才认为识别有效。如果识别结果是“垃圾关键词语”,则说明是其他的声音导致的误识别,产品应该重新开始一次识别过程。这样,可以非常有效地降低误识别率。极大地提高终端用户的主观使用体验。 移植过程: 1、向LD模块中添加关键词 /************************************************************************功能描述:向LD模块添加关键词入口参数:none返回值:flag:1->添加成功其他说明:用户修改. 1、根据如下格式添加拼音关键词,同时注意修改sRecog和pCode数组的长度 和对应变了k的循环次数设置。拼音串和识别码是一一对应的。 2、开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中 关于垃圾词语吸收错误的用法,来提供识别效果。 3、”duogongnengbaoshi“为口令,故在每次识别时,必须先发一级口令“多功能报时”**************************************************************************/uint8LD_AsrAddFixed(){ uint8k,flag; uint8nAsrAddLength; #defineDATE_A8 /*数组二维数值*/ #defineDATE_B21 /*数组一维数值*/ uint8codesRecog[DATE_A][DATE_B]={ "duogongnengbaoshi", "xianzaijidianle", "dangqianshijian", "xianzaishike", "baoshi", "dangqianwendu", "dangqianshidu", "wenshiduduoshao" }; /*添加关键词,用户修改*/ uint8codepCode[DATE_A]={ CODE_CMD, CODE_XZJDL, CODE_DQSJ, CODE_XZSK, CODE_BS, CODE_DQWD, CODE_DQSD, CODE_WSDDS }; /*添加识别码,用户修改*/ flag=1; for(k=0;kvalueint==0) { printf("收到一级口令智能报时... "); } elseif(item_obj->valueint==1) { printf("“现在几点了”命令识别成功 "); m_nCurrentVoicePlayTimes++; while(U5152_BSY){} if(m_nCurrentVoicePlayTimes%2==0) { sprintf((char*)dtbuf,"[v5][s5][m3]当前时间为%02d时%02d分%02d秒 ",NowHour,NowMinute,NowSecond); } else { sprintf((char*)dtbuf,"[v5][s5][m51]当前时间为%02d时%02d分%02d秒 ",NowHour,NowMinute,NowSecond); } printf((char*)dtbuf); XFS_FrameInfo((char*)dtbuf); delay_ms(10);while(U5152_BSY){delay_ms(500);printf("while(U5152_BSY) ");} } elseif(item_obj->valueint==2) { printf("“当前时间”命令识别成功 "); m_nCurrentVoicePlayTimes++; while(U5152_BSY){} if(m_nCurrentVoicePlayTimes%2==0) { sprintf((char*)dtbuf,"[v5][s5][m3]当前时间为%02d时%02d分%02d秒 ",NowHour,NowMinute,NowSecond); } else { sprintf((char*)dtbuf,"[v5][s5][m51]当前时间为%02d时%02d分%02d秒 ",NowHour,NowMinute,NowSecond); } printf((char*)dtbuf); XFS_FrameInfo((char*)dtbuf); delay_ms(10);while(U5152_BSY){delay_ms(500);printf("while(U5152_BSY) ");} } elseif(item_obj->valueint==3) { printf("“现在时刻”命令识别成功 "); m_nCurrentVoicePlayTimes++; while(U5152_BSY){} if(m_nCurrentVoicePlayTimes%2==0) { sprintf((char*)dtbuf,"[v5][s5][m3]当前时间为%02d时%02d分%02d秒 ",NowHour,NowMinute,NowSecond); } else { sprintf((char*)dtbuf,"[v5][s5][m51]当前时间为%02d时%02d分%02d秒 ",NowHour,NowMinute,NowSecond); } printf((char*)dtbuf); XFS_FrameInfo((char*)dtbuf); delay_ms(10);while(U5152_BSY){delay_ms(500);printf("while(U5152_BSY) ");} } elseif(item_obj->valueint==4) { printf("“关灯”命令识别成功 "); } elseif(item_obj->valueint==5) { printf("“当前温度”命令识别成功 "); m_nCurrentVoicePlayTimes++; while(U5152_BSY){} if(m_nCurrentVoicePlayTimes%2==0) { sprintf((char*)dtbuf,"[v5][s5][m3]当前温度为%.1f摄氏度 ",DHT11Temp); } else { sprintf((char*)dtbuf,"[v5][s5][m51]当前温度为%.1f摄氏度 ",DHT11Temp); } printf((char*)dtbuf); XFS_FrameInfo((char*)dtbuf); delay_ms(10);while(U5152_BSY){delay_ms(500);printf("while(U5152_BSY) ");} } elseif(item_obj->valueint==6) { printf("“当前湿度”命令识别成功 "); m_nCurrentVoicePlayTimes++; while(U5152_BSY){} if(m_nCurrentVoicePlayTimes%2==0) { sprintf((char*)dtbuf,"[v5][s5][m3]当前湿度为百分之%.1f ",DHT11Hum); } else { sprintf((char*)dtbuf,"[v5][s5][m51]当前湿度为百分之%.1f ",DHT11Hum); } printf((char*)dtbuf); XFS_FrameInfo((char*)dtbuf); delay_ms(10);while(U5152_BSY){delay_ms(500);printf("while(U5152_BSY) ");} } elseif(item_obj->valueint==7) { printf("“温湿度多少”命令识别成功 "); m_nCurrentVoicePlayTimes++; while(U5152_BSY){} if(m_nCurrentVoicePlayTimes%2==0) { sprintf((char*)dtbuf,"[v5][s5][m3]温度为%.1f度,湿度为%.1f ",DHT11Temp,DHT11Hum); } else { sprintf((char*)dtbuf,"[v5][s5][m51]温度为%.1f度,湿度为%.1f ",DHT11Temp,DHT11Hum); } printf((char*)dtbuf); XFS_FrameInfo((char*)dtbuf); delay_ms(10);while(U5152_BSY){delay_ms(500);printf("while(U5152_BSY) ");} } } item_obj=item_obj->next; printf("while(item_obj) "); } } cJSON_Delete(receive_json); USART5_RX_STA=0; memset(USART5_RX_BUF,0,sizeof(USART5_RX_BUF)); //清空数组 }LDV7模块固件下载: 1、打开编译后的.hex文件 2、选对串口号,芯片型号后,选择“下载/编程”按钮,然后给STC单片机上电或者复位。 3、发出语音,测试语音识别结果 {"VoiceCommandCode":0}收到{"VoiceCommandCode":1}“现在几点了”命令识别成功{"VoiceCommandCode":0}收到{"VoiceCommandCode":2}“当前时间”命令识别成功{"VoiceCommandCode":0}收到{"VoiceCommandCode":3}“现在时刻”命令识别成功{"VoiceCommandCode":0}收到{"VoiceCommandCode":4}“报时”命令识别成功{"VoiceCommandCode":0}收到{"VoiceCommandCode":5}“当前温度”命令识别成功{"VoiceCommandCode":0}收到{"VoiceCommandCode":6}“当前湿度”命令识别成功{"VoiceCommandCode":0}收到{"VoiceCommandCode":7}“温湿度多少”命令识别成功{"VoiceCommandCode":0}收到{"VoiceCommandCode":7}“温湿度多少”命令识别成功
然后其他与LDV7模块相连的MCU只要解析接收到的串口数据即可。
从六月份开始,每个月会制作一个毕业设计难度的DIY作品,
前期作品以模块组合的形式搭建,降低门槛,方便大家一起跟着做;
DIY过程只在微信公众号中分享,大家没关注的,赶紧关注哈。
每个月时间大致安排:
上个月25号,公布DIY作品名称;
每月1日公布作品功能点及所需要的功能模块链接;
每月10日前绘制完模块配合的线路板;
每月15日之前硬件搭建完毕,之后按模块撰写代码,调试,随时公众号更新进展;
每月月底开源整个作品的源码和PCB工程文件。
题目选取原则:
公众号每个月20日发起投票,25号截止,票数最多的作为下个月的DIY内容;
投票的备选项大家可以后台留言给我,我会选出五种留言最多的作为选项;
每个月的DIY内容尽量与上个月分享的文章有一定的相关度,起到温故知新的作用。
有什么想法或者建议,留言给我哈。
语音识别 自然语言处理
参考:《中文信息处理发展报告2016》
什么是语音识别?
语音识别(AutomaticSpeechRecognition,ASR):利用计算机实现从语音到文字自动转换的任务。
语音识别的技术有哪些?
语音识别技术=早期基于信号处理和模式识别+机器学习+深度学习+数值分析+高性能计算+自然语言处理
语音识别技术的发展可以说是有一定的历史背景,上世纪80年代,语音识别研究的重点已经开始逐渐转向大词汇量、非特定人连续语音识别。到了90年代以后,语音识别并没有什么重大突破,直到大数据与深度神经网络时代的到来,语音识别技术才取得了突飞猛进的进展。
语音识别的相关领域有哪些?
语音识别关联领域=自然语言理解+自然语言生成+语音合成
语音识别的社会价值在哪里?
语音信号是典型的局部稳态时间序列,而日常所见的大量信号都属于这种局部稳态时间序列信号,如视频,雷达信号,金融资产价格,经济数据等。这些信号的共同特点是在抽象的时间序列中包含大量不同层次的信息,可以用相似的模型进行分析。
历史上,语音信号的研究成果在若干领域起到启发作用,如语音信号处理中的隐马尔科夫模型在金融分析,机械控制等领域都得到广泛的应用。近年来,深度神经网络在语音识别领域的巨大成功直接促进了各种深度学习模型在自然语言处理,图形图像处理,知识推理等众多领域的发展应用,取得了一个有一个令人惊叹的成果。
怎么构建语音识别系统?
语音识别系统构建总体包括两个部分:训练和识别。
训练通常来讲都是离线完成的,将海量的未知语音通过话筒变成信号之后加在识别系统的输入端,经过处理后再根据语音特点建立模型,对输入的信号进行分析,并提取信号中的特征,在此基础上建立语音识别所需的模板。
识别则通常是在线完成的,对用户实时语音进行自动识别。这个过程又基本可以分为“前端”和“后端”两个模块。前端主要的作用就是进行端点检测、降噪、特征提取等。后端的主要作用是利用训练好的“声音模型”和“语音模型”对用户的语音特征向量进行统计模式识别,得到其中包含的文字信息。
语音识别技术中的关键问题是什么?
语音特征抽取语音识别的一个主要困难在于语音信号的复杂性和多变性。一段看似简单的语音信号,其中包含了说话人、发音内容、信道特征、口音方言等大量信息。不仅如此,这些底层信息互相组合在一起,又表达了如情绪变化、语法语义、暗示内涵等丰富的高层信息。如此众多的信息中,仅有少量是和语音识别相关的,这些信息被淹没在大量其它信息中,因此充满了变动性。语音特征抽取即是在原始语音信号中提取出与语音识别最相关的信息,滤除其它无关信息。
语音特征抽取的原则是:尽量保留对发音内容的区分性,同时提高对其它信息变量的鲁棒性。历史上研究者通过各种物理学、生理学、心理学等模型构造出各种精巧的语音特征抽取方法,近年来的研究倾向于通过数据驱动学习适合某一应用场景的语音特征。
模型构建
语音识别中的建模包括声学建模和语言建模。声学建模是对声音信号(语音特征)的特性进行抽象化。自上世纪70年代中期以来,声学模型基本上以统计模型为主,特别是隐马尔科夫模型/高斯混合模型(HMM/GMM)结构。最近几年,深度神经网络(DNN)和各种异构神经网络成为声学模型的主流结构。
声学模型需要解决如下几个基本问题:如何描述语音信号的短时平稳性;
如何描述语音信号在某一平稳瞬态的静态特性,即特征分布规律;
如何应用语法语义等高层信息;
如何对模型进行优化,即模型训练。
同时,在实际应用中,还需要解决众多应用问题,例如:
如何从一个领域快速自适应到另一个领域;
如何对噪音、信道等非语音内容进行补偿;
如何利用少量数据建模;
如何提高对语音内容的区分性;
如何利用半标注或无标注数据,等等。语言建模是对语言中的词语搭配关系进行归纳,抽象成概率模型。这一模型在解码过程中对解码空间形成约束,不仅减小计算量,而且可以提高解码精度。传统语言模型多基于 N元文法(n-gram),近年来基于递归神经网络(RNN)的语言模型发展很快,在某些识别任务中取得了比n-gram模型更好的结果。
语言模型要解决的主要问题是如何对低频词进行平滑。不论是n-gram模型还是RNN模型,低频词很难积累足够的统计量,因而无法得到较好的概率估计。平滑方法借用高频词或相似词的统计量,提高对低频词概率估计的准确性。除此之外,语言建模研究还包括:
如何对字母、字、词、短语、主题等多层次语言单元进行多层次建模
如何对应用领域进行快速自适应;
如何提高训练效率,特别是对神经网络模型来说,提高效率尤为重要;
如何有效利用大量噪声数据,等等。
解码
解码是利用语音模型和语言模型中积累的知识,对语音信号序列进行推理,从而得到相应语音内容的过程。早期的解码器一般为动态解码,即在开始解码前,将各种知识源以独立模块形式加载到内存中,动态构造解码图。现代语音识别系统多采用静态解码,即将各种知识源统一表达成有限状态转移机(FST),并将各层次的FST嵌套组合在一起,形成解码图。解码时,一般采用Viterbi算法在解码图中进行路径搜索。为加快搜索速度,一般对搜索路径进行剪枝,保留最有希望的路径,即束搜索(beamsearch)。
对解码器的研究包括但不限于如下内容:
如何加快解码速度,特别是在应用神经网络语言模型进行一遍解码时;
如何实现静态解码图的动态更新,如加入新词;
如何利用高层语义信息;
如何估计解码结果的信任度;
如何实现多语言和混合语言解码;
如何对多个解码器的解码结果进行融合。
市面上常用的语音识别模块主要包含哪些组件
原标题:市面上常用的语音识别模块主要包含哪些组件?语音识别模块又被称为语音识别系统,通俗点说具有识别功能的语音芯片组块,它广泛应用于各行各业,高品质经久耐用的语音模块在赋予电子产品智能化的同时最大限度的为人们提供方便的服务。那么,市面上常用的语音识别模块包含哪些组件?!今天一起和九芯电子小编了解一下。
1、功放模块
为了能够听到更好的语音我们需要功放模块的帮助,语音模块除了可以收集各种各样的语音外还需要通过功放来让大众所听到,这样才能够很好将语音功放出来让人们听到,其中的功放模块也是非常重要的一部分,有了它才能够让模块更加完整组成一个接收与播放都灵活自如的语音模块。
2、控制器
语音模块第作为便利我们生活一项新兴事物,它其中比不可少多种控制器与传输器,只有这样才能够很好的为我们提供便捷服务。语音模块其中包含的控制器是来控制模块的多项功能的,其中有开启功能与关闭功能,还有许多分支小功能都是由控制器来调控完成,它在整个语音模块当中起着不可忽视的作用。
3、识别系统
通过传送语音让接收方能够快速辨识语音内容来接收相应信息是语音模块的主要作用,因此其中的识别系统也是可以调控语音模块的一个重要组成部分,我们可以从语音模块中识别声音的类型或是由哪一个人提供的声音都离开识别系统的作用,识别系统在语音模块当中是一种引领转化的系统功能。
综上所述,除了识别系统、控制器以及功放模块等三个基本元素外,一些语音识别模块还包括多媒体播放器,如扬声器,以帮助播放传输;这也是为什么越来越多的人会选择适合自己的语音识别模块来规划生活,这样可以最大限度地减少资金的投入,并以合理的价格获得高质量的语音识别模块。返回搜狐,查看更多
责任编辑: