` 本帖最后由 hivince 于 2020-10-19 10:42 编辑
试用ISD9160有一段时间了,由于工作也比较忙,所以断断续续的进行。
先说下试用感受,ISD9160相比市面见得多的LD3320A来说,多了语音反馈功能,这样交互性会更好些。
对于语音识别效果来说,这两款感觉差别不大。LD3320A的资料容易找些,编程自由度大些,因为是非特定语音识别,可以使用拼音方式进行编程识别。ISD9160需要原厂的支持,进行定制语音识别,虽然麻烦些,但是可以进行误别训练,应该是可以训练得更加提高识别精度。
下面说说我试用的项目,使用ISD9160进行语音交互,用于设置灯光的不同场景模式,语音识别使用ISD9160,灯光场景控制使用其它的 单片机,使用串口对接,ISD9160识别到语音场景控制后,通过串口发送场景命令,然后单片机进行灯光控制。这里主要介绍语音识别部分,要不然给跑题啦!
先介绍下识别部分的源代码程序:
- while (1)
- {
-
- if ((i32ID = DoVR_sep((uint32_t)pchm_lppbyModel[0], (uint32_t)pchm_lppbyModel[1], 0, 1000, 0, NULL)) < 0) //timeout时间600*10ms=6s
- {
- break;
- }
- else if(i32ID > 0 && VR_ENABLE==1)
- {
- if((1 == i32ID)||(2 == i32ID)||(3 == i32ID)||(4 == i32ID)) //wakeup 唤醒 小光/阿光/好光时代
- {
- g_vrstate = 1;
- uartsend = 0;
- timeout_quiet=0;
- DrvGPIO_ClrBit(GPA,7); //点亮唤醒指示灯
- //LedTurnOn(); //上电默认开灯
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command1,CMD_LENGTH); //UART0 Send
- PlayAdpcm((uint32_t)lppbyPrompt[0], TRUE); //Play Voice +getRamdonNumber(3)
- }
- else if(g_vrstate) //other
- {
- //LedVRCmd(i32ID);
- timeout_quiet=1;
- switch(i32ID) //功能指令
- {
- case 5: //睡眠模式
- DrvGPIO_ClrBit(GPB,1);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,1);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command2,CMD_LENGTH); //UART0 Send
- // PlayAdpcm((uint32_t)lppbyPrompt[3], TRUE); //Play Voice
- break;
- case 6: //睡觉
- DrvGPIO_ClrBit(GPB,1);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,1);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command3,CMD_LENGTH); //UART0 Send
- PlayAdpcm((uint32_t)lppbyPrompt[1], TRUE); //Play Voice
- break;
- case 7: //起床模式
- DrvGPIO_ClrBit(GPB,2);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,2);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command4,CMD_LENGTH); //UART0 Send
- PlayAdpcm((uint32_t)lppbyPrompt[2], TRUE); //Play Voice
- break;
- case 8: //起床
- DrvGPIO_ClrBit(GPB,2);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,2);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command5,CMD_LENGTH); //UART0 Send
- PlayAdpcm((uint32_t)lppbyPrompt[3], TRUE); //Play Voice
- break;
- case 9: //阅读模式
- DrvGPIO_ClrBit(GPB,3);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,3);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command6,CMD_LENGTH); //UART0 Send
- PlayAdpcm((uint32_t)lppbyPrompt[4], TRUE); //Play Voice
- break;
- case 10: //看书
- DrvGPIO_ClrBit(GPB,3);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,3);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command7,CMD_LENGTH); //UART0 Send
- PlayAdpcm((uint32_t)lppbyPrompt[5], TRUE); //Play Voice
- break;
- case 11: //浪漫模式
- DrvGPIO_ClrBit(GPB,4);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,4);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command8,CMD_LENGTH); //UART0 Send
- PlayAdpcm((uint32_t)lppbyPrompt[6], TRUE); //Play Voice
- break;
- case 12: //休息模式
- DrvGPIO_ClrBit(GPB,4);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,4);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command9,CMD_LENGTH); //UART0 Send
- PlayAdpcm((uint32_t)lppbyPrompt[7], TRUE); //Play Voice
- break;
- case 13: //夜灯
- DrvGPIO_ClrBit(GPB,5);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,5);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command10,CMD_LENGTH); //UART0 Send
- // PlayAdpcm((uint32_t)lppbyPrompt[11], TRUE); //Play Voice
- break;
- case 14: //打开灯
- DrvGPIO_ClrBit(GPB,6);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,6);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command11,CMD_LENGTH); //UART0 Send
- PlayAdpcm((uint32_t)lppbyPrompt[8], TRUE); //Play Voice
- break;
- case 15: //日常模式
- DrvGPIO_ClrBit(GPB,6);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,6);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command12,CMD_LENGTH); //UART0 Send
- PlayAdpcm((uint32_t)lppbyPrompt[9], TRUE); //Play Voice
- break;
- case 16: //关灯
- DrvGPIO_ClrBit(GPB,1);
- SysTimerDelay(50);
- DrvGPIO_SetBit(GPB,1);
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command13,CMD_LENGTH); //UART0 Send
- // PlayAdpcm((uint32_t)lppbyPrompt[13], TRUE); //Play Voice
- break;
- }
- }
- }
- else if(VR_ENABLE==1) //timeout,回到未唤醒状态
- {
- if(g_vrstate == 1)
- {
- DrvGPIO_SetBit(GPA,7); //关闭唤醒指示灯
- //LedTurnOff(); //上电默认开灯
- DrvUART_Write(UART_PORT0,(uint8_t *)VR_Command17,CMD_LENGTH); //UART0 Send
- // if(timeout_quiet==0)
- // PlayAdpcm((uint32_t)lppbyPrompt[18], TRUE); //Play Voice
- g_vrstate= 0;
- }
- }
- }
复制代码
以上代码,通过识别到的语音序号,进行播放对应序号的语音文件,进行语音回复,另外向串口发送对应的控制指令,程序很简单。
下面说下烧录需要的文件与设置。
烧录程序,需要使用提供的烧录工具软件“Nuvoton NuMicro ICP Programming Tool”及硬件“Nu-Link"。
软件设置与导入文件见下图!
设置好了导入对应文件,再点”开始“进行等待完成就可以了。
下面说说对应的文件:
APROM:编译出来的代码,使用自己的编译软件编译。
数据FLASH:语音指令文件,需要找原厂申请制作。
外部FLASH:语音反馈的文件,这可以自己录音,或者用文字转语音的软件生成,然后自己转换成BIN文件。
重点说下可以自己做的语音反馈的文件的制作方法:
1、自己录音或通过文字语音软件生成"WAV"格式的音频文件。
2、按顺序将名字命成"00.wav"名字是两位数字从00开始,后缀是.wav 。
3、放入文件夹内,同里文件夹还有三个文件,直接复制过来的,见下图。
4、点击bat这个文件,等待生成“ all.bin”这个文件,用于烧录。
下面是此项目的可烧录代码与效果演示的视频
`
0
|
|
|
|