图4.5 SPI方式读时序
4.3寄存器功能简介 1.B5寄存器
B5寄存器在检测完语音数据段以后还会有噪音,连续监测到多长时间的背景噪音才确认是真正的语音结束,通常情况下的默认值是600毫秒,这个设定值也不能太小,否则用户在中间的小小的停顿也会被判定为录音结束; 2.35寄存器
修改麦克风音量的是35寄存器,它的数值一般设定在40H-58H之间,具体数值根据麦克风以及使用的环境来确定,本次程序使用的是43H;值越大代表MIC音量越大,识别启动越灵敏,但可能带来更多的误识别;值越小代表MIC音量越小,但是需要近距离说话才能启动识别功能,好处是对于外界的干扰没有反应。 3.FIFO寄存器
FIFO英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来就很容易。(*) LD3320芯片内部有2个FIFO,分别是: FIFO_EXTFIFO_DATA FIFO_DATA 主数据处理FIFO缓存器,ASR或者MP3的主数据区FIFO_EXT 语音识别添加关键词用FIFO缓存器。 4.B3寄存器
B3ASR: Vad Para 本函数为打开或关闭 “语音端点检测”功能。如果将该功能关闭,也就是参数设置为’0’,则所有的语音数据都会被用来执行语音识别的搜索运算。而如果将该功能打开,也就是参数设置为大于’0’的数值,则所有的语音数据都会先经过是“语音段”还是“静噪音段”的检测,只有语音段被用来执行语音识别的搜索运算。 Default: 0x12H 0 – 关闭语音段检测功能,数值范围: 1~80 – 打开语音段检测功能。数值越小越灵敏,但容易误判;数值越大越不灵敏,但误判的可能减少。建议数值的范围在10~40之间。原则是语音环境信噪比越大,可以采用越大一点的数值。调整本参数也会对识别距离产生影响,数值越小,越灵敏,距离越远。 5.B8寄存器
ASR:识别时间长度 最长识别时间长度设置为多少秒;缺省值是60秒。 在本时间长度内,如果检测到说话声音,语音识别模块将会给出识别结果;如果始终没有说话声音,将会返回0识别,见BA寄存器,并发出中断。定的B8寄存器的数值为2,表示无论如何每次识别开始的2秒时间内,必然会停止识别给出一个识别结果。当然这个数值设置的过小,会造成一些比较长的语音命令无法在特定的时间内完成,而引起错误的识别; 6.BA寄存器
中断辅助信息,(读或设为00) MP3:播放中断时, 第5位=1 表示播放器已发现MP3的结尾。 ASR:中断时,是语音识别有几个识别候选 Value: 1 – 4: N个识别候选 0或者大于4:没有识别候选。 7.BC寄存器
ASR:识别过程强制结束,在ASR进行过程中,可以设置本寄存器提前结束本次ASR过程;写07H,停止录音,但对已有声音进行识别运算,可能会有最优识别候选,返回BA=0-4; 写08H,强制停止ASR运算,返回BA=51H。
这两种设置都会使DSP送出中断,如同正常的识别结束。 4.4芯片关键字的设置
LD3320每次识别最多可设置50条关键词,每个识别句可以是词组、单词或者短句,长度不超过79个字节的拼音串或者十个汉字,从实际的角度出发,用户再说到八个字的时候就会出现停顿、打嗝、错字、漏字的情况,这些情况会严重影响到识别并导致识别错误,所以根据实际情况,关键词的设置不宜太长。识别引擎并不设定关键词的内容,可以是命令、歌曲名、人名、操作指令等任何的汉字字符串。但是ASR不能识别关键词中的一部内容,除非这部分自身也是一个关键词,也不识别与关键词列表中不相符的情况,比如后面添加“恩啊”之类的词语。
语音识别,识别的是语音,对于非特定语音来说,在描述关键词语时,是用音标标出需要识别的关键词语,对于目前LD3320支持的中文识别来说,就是用拼音来描述出关键词,所以只要是拼音可以拼出的拼音,都可以输入芯片作为关键词被识别的。
在设定好关键词之后,为了进一步降低误识别率,可以在识别列表中添加一些任意词汇,用来吸收错误识别,从而达到降低误识别率的目的,可以把这些关键词称之为“垃圾关键词”。比如本次设计中的关键词为“开灯”、“关灯”,我们把“广州”设置成了垃圾关键词,当输入广州时,系统会自动识别出不是关键词,需要重新输入。
LD3320是支持中文普通话的一款语音芯片,有些外文或者方言音无法用拼音拼写出来的,LD3320就不一定能够完成对应的外文或者方言的识别。 4.5语音开关源程序 4.5.1初始化程序
在开始执行操作命令之前要先对LD,ASR模块进行初始化:
功能描述: LD,ASR模块命令初始化void LD_Init_Common() {
LD_ReadReg(0x06); /*0x06 FIFO状态 第3位:1表示 FIFO_DATA已满,不能写第5位:1表示 FIFO_EXT已满,不能写。*/
LD_WriteReg(0x17, 0x35);/*写35H 对LD3320 进行软复位;写48H 可以激活 DSP;写4CH 可以使DSP 休眠,比较省电。*/ delay(10);
LD_ReadReg(0x06);
LD_WriteReg(0x89, 0x03); /*0x89 模拟电路控制 初始化时写 03H ; MP3 播放时写
FFH*/ delay(5);
LD_WriteReg(0xCF, 0x43); /*0xcf 内部省电模式设置 初始化时 写入 43H; MP3 初始化和 ASR初始化时写入 4FH*/ delay(5);
LD_WriteReg(0xCB, 0x02); /*0xcb ASR:读取 ASR结果(候补 4) */ /*PLL setting*/
LD_WriteReg(0x11, LD_PLL_11); /*0x11 时钟频率设置 1*/ LD_WriteReg(0x1E,0x00);
/*0x1e ADC 专用控制,应初始化为 00H *
LD_WriteReg(0x19, LD_PLL_ASR_19); /*0x19 时钟频率设置 2 LD_WriteReg(0x1B, LD_PLL_ASR_1B);/*0x1b 时钟频率设置 3*/ LD_WriteReg(0x1D, LD_PLL_ASR_1D); /*0x1d 时钟频率设置 4*/ delay(10);
LD_WriteReg(0xCD, 0x04);
/*0xcd DSP 休眠设置 初始化时写入 04H 允许DSP 休眠。*/
LD_WriteReg(0x17, 0x4c); /*0x17 写35H 对LD3320 进行软复位(Soft Reset);写48H 可以激活 DSP;;写4CH 可以使DSP 休眠,比较省电。*/
delay(5);
LD_WriteReg(0xB9, 0x00);
/*0xb9 ASR:当前添加识别句的字符串长度(拼音字符串) 初始
化时写入 00H,每添加一条识别句后要设定一次。*/
LD_WriteReg(0xCF, 0x4F); /*0xcf 内部省电模式设置 初始化时 写入 43H; MP3 初始化和 ASR初始化时写入 4FH*/
LD_WriteReg(0x6F, 0xFF); /*0x6f 对芯片进行初始化时设置为 0xFF */ 4.5.2用户自定义修改函数
LD3320的操作指令时可以被动态编辑的,所以用户可以任意的修改自己想要设定的指令
* 名 称:用户执行函数
* 功 能:识别成功后,执行动作可在此进行修改 * 入口参数: 无 * 出口参数:无 * 说 明:
********************************************************** void User_handle(uint8 dat) {
//UARTSendByte(dat);//串口识别码(十六进制) switch(dat) /*对结果执行相关操作,客户修改*/ {
case CODE_DMCS:/*命令“测试”*/
//
PrintCom(\“代码测试”命令识别成功\\r\\n\
break;
/*命令“全开”*/
case CODE_KFBYZ: //
PrintCom(\“开发板验证”命令识别成功\\r\\n\
break;
case CODE_KD: Key1 = 1;LED = 0;
/*命令“复位”*/
PrintCom(\“开灯”命令识别成功\\r\\n\break; case CODE_GD: Key1 = 0;LED = 1;
/*命令“复位”*/
PrintCom(\“关灯”命令识别成功\\r\\n\
break;
/*命令“复位”*/
case CODE_BJ: Key2=1;
PrintCom(\“开门”命令识别成功\\r\\n\
break;
/*命令“复位”*/
case CODE_SH: Key2=0;
PrintCom(\“关门”命令识别成功\\r\\n\break;
case CODE_GZ:
/*命令“复位”*/
PrintCom(\“广州”命令识别成功\\r\\n\break;
default:PrintCom(\请重新识别发口令\\r\\n\