从师弟那里获得了一块语音识别模块,查阅资料得知这是一款非特定语音识别芯片,有50个关键词条可以自定义,很cool的一个东西,摆脱了使用skainet只能“嗨,乐鑫”的苦恼。
要获取这种模块的资料,我目前所知的最简单的方法是逛淘宝,哈哈。只要在淘宝上找到对应的商品链接,那么商品详情里就会有它的详尽资料,运气好一点的话,还可以获取示例代码的度盘链接。
总之,以下就是我从淘宝获取到的资料。
绿深-LD3320模块 SPI接口版资料 :https://pan.baidu.com/s/1KYOiYo8Gh1ZJq5EP7CUiCA
提取码:1764
解压一看,内容还真不少,原理图、布局图、例程一应俱全。
我对stm32的开发比较熟悉,所以接下来依据stm32f1的例程作修改。
里面是一个io模拟spi通信控制ld3320的例程,修改应用起来也很简单,把它的引脚、延时、log都改成我们自己的就可以了。
首先,修改引脚的宏定义,根据自己的连线修改。
例程这边使用的是一个带参宏+位带操作的形式,我们直接把位带操作改成自己的api接口即可。
把delay的定义也换成我们自己的,由于上了操作系统,ms级别的延时直接使用osDelay即可。
至于串口通信就不赘述了,大家都有自己的库,导入+宏定义即可。
然后,擦腚,开机,午安大电牛,测试!
喜闻乐见的收获了一个ASR_ERROR。
或许是刚上电不太稳定,我们在case error里加入一行语句,让它在进入error后,重新启动初始化流程。
喜闻乐见的收获了一群ASR_ERROR。
不慌,这种时候,我们先确认主控和ld3320有没有连接上,直接体现就是寄存器能不能正常读写。
根据官方调试文档,向这三个寄存器写数据再读取。
然后,不管写了什么,读出来的全都是0xff,这是什么原因?
直接祭出逻辑分析仪dslogic,配置协议为spi,配置好通道后解析数据。
通过逻辑分析仪的显示界面,在MISO(master in slave out)里看到了写入寄存器的信息,MOSI则一直保持高电平…
靠,原来是线接反了。
调转sdo与sdi,上电,一次成功。
出于某些原因,我想将唤醒词设为Lucas,而ld3320仅支持标准普通话的识别,怎么办呢?
ICRoute官方贴心地为我们提供了一本“葵花宝典”,即《语音识别芯片LD3320高阶秘籍》,里面给了我们一个解决方案。
没错,就是咱们小学背英语单词使用的伎俩,用拼音去标注英文。
将唤醒词Lucas,配置为“lu ke si”,我们就可以用英文来唤醒它啦。
虽然成功实现了语音识别,但在使用模块的时候,还是发现了一些问题。
第一,如果将唤醒词设定为“lu ke si”,而在唤醒的时候没有把“si”这个音节明显地体现,就会导致识别不成功;又或者,将唤醒词设定为“lu ke”,而唤醒时又把“s”的尾音读得明显了一些,又会导致识别不成功。
怎么办呢?很简单,《高阶秘籍》里面为我们提供了解决方案:把每一个发音都录入即可。将几个可能的发音都对应到同一个id,只要关键词条目还够用,就可以获得更好的识别体验。
第二,这份代码仅仅是实现了识别功能,在响应速度上,还有很大的提升空间。