微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于语音识别的微博签到系统

基于语音识别的微博签到系统

时间:11-26 来源:互联网 点击:

线的方式来接收OV2640的图像数据。Y(2..9)为8位MSB(MostSignificant Bit,最高有效位模式)并行总线,SDIO、SCLK为SCCB接口,PCLK为像素时钟输出管脚(每个周期从并行总线上输出一个像素),VSYNC为列同步输出管脚(每帧图像发生一次跳变),HERF为行参考输出管脚(每个周期总线从并行总线上输出一行图像数据)。系统的硬件电路连接简图如图10。

图10系统硬件电路连接简图

系统上电后,MCU配置OV2640的工作方式,初始化LD3320,然后检查LD3320的状态,当LD3320的状态是“找到识别结果”,开启OV2640中断,在OV2640准备好图像后,VSYNC会被拉高一段时间,MCU通过PCLK上升沿中断按字节接收图像数据,接收数据完成,关闭OV2640中断。然后向新浪微博发送已经写进程序里的自己想说的话和接收到的图片。接下来将对主要的程序块做介绍。

程序介绍

在《为你的设备添加社交网络功能》中,已经详细介绍了OV2640的初始化配置程序,本篇文章就不再赘述,图像数据缓存程序与本文稍有不同,这里简单介绍图像数据缓存程序。本文对LD3320的写入词条列表,启动语音识别,中断处理程序,发送微博程序做主要介绍。

图像数据缓存程序(摘至stm32f10x_it.c):

void EXTI0_IRQHandler(void)

{

u8 temp;

EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI0线路挂起位

if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0)return;//HREF管脚为低

temp=(u8)((GPIOC->IDR)>>8 & 0x00ff);//读取一个字节图像数据

switch(jpg_flag)

{

case 0:

if(temp==0xff)//图像数据以0xff 0xd8开头

{

JPEGBuffer[0]=0xff;

jpg_flag=1;

}

break;

case 1:

if(temp==0xd8)

{

JPEGBuffer[1]=0xd8;

jpg_flag=2;

JPEGCnt=2;

}

else if(temp!=0xff)

jpg_flag=0;

break;

case 2:

JPEGBuffer[JPEGCnt++] =temp;//存储数据

if(temp==0xff)jpg_flag=3;

break;

case 3:

JPEGBuffer[JPEGCnt++]=temp;//图像数据以0xff0xd9结尾

if(temp==0xd9)

{

jpg_flag=4;

}

else if(temp!=0xff)

jpg_flag=2;

break;

case 4:

break;

}

}

在中断函数中通过以上程序即可正确读取每一帧图像的数据了。程序思想已经在拍摄照片流程图中体现。JPEGBuffer为一个全局的图像缓存区,在主函数中,检测到缓存区数据准备完毕后,就可以将图像发送给新浪微博了。

LD3320添加词条程序(摘至LD3320_main.c)

uint8 LD_AsrAddFixed(void)

{

uint8 k, flag;

uint8nAsrAddLength;

#define DATE_A4

#define DATE_B20

uint8sRecog[DATE_A][DATE_B] = {

"wenjuan",

"guocui",

"jierui",

"chenge"

};

uint8pCode[DATE_A] = {

CODE_wenjuan,

CODE_guocui,

CODE_jierui,

CODE_chenge

};

flag = 1;

for (k=0; k

{

if(LD_Check_ASRBusyFlag_b2() == 0)

{

flag= 0;

break;

}

LD_WriteReg(0xc1, pCode[k] );

LD_WriteReg(0xc3, 0 );

LD_WriteReg(0x08, 0x04);

LD3320_delay(1);

LD_WriteReg(0x08, 0x00);

LD3320_delay(1);

for (nAsrAddLength=0; nAsrAddLength

{

if (sRecog[k][nAsrAddLength] == 0)

break;

LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);

}

LD_WriteReg(0xb9, nAsrAddLength);

LD_WriteReg(0xb2, 0xff);

LD_WriteReg(0x37, 0x04);

LD_WriteReg(0x37, 0x04);

}

return flag;

}

列表的规则是,每个识别条目对应一个特定的编号(1个字节),不同的识别条目的编号可以相同,而且不用连续。本芯片最多支持50个识别条目,每个识别条目是标准普通话的汉语拼音(小写),每2个字(汉语拼音)之间用一个空格间隔。首先把识别条目的编号写入0xc1寄存器,其次,将字符串中的字符按顺序写入寄存器0x05,然后将字符串长度写入寄存器0xB9,向寄存器0xB2写入0xFF,向寄存器0x37写入0x04,通知DSP要添加一项识别句。

LD3320启动语音识别程序(摘至LD3320_main.c)

uint8 LD_AsrRun(void)

{

1LD_WriteReg(0x35,MIC_VOL);//ADC增益设置

2LD_WriteReg(0x1C,0x09);//ADC开关控制,写09H为保留命令字。

3LD_WriteReg(0xBD,0x20);//初始化控制寄存器,写入20H,保留命令字。

4LD_WriteReg(0x08, 0x01);//清除FIFO内容,第0位:写入1→清除FIFO_DATA。

LD3320_delay( 5);

5LD_WriteReg(0x08,0x00);

LD3320_delay( 5);

6if(LD_Check_ASRBusyFlag_b2()== 0)//检查b2寄存器是否为空闲

{

return 0;

}

LD_WriteReg(0xB2,0xff);

7LD_WriteReg(0x37, 0x06); //语音识别控制命令下发寄存器,写06H:通知DSP开始识别语音。

LD_WriteReg(0x37,0x06);

LD3320_delay( 5);

8LD_WriteReg(0x1C, 0x0b); // ADC开关控制写0BH麦克风输入ADC通道可用

LD_WriteReg(0x29, 0x10); //中断允许(可读写)第4位:同步中断允许,1表示允许;0表示不允许。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top