基于STM32的有限词条语音识别与对话模块

基于STM32的有限词条语音识别与对话模块

  • 一、模块整体设计思路
  • 二、器件选型与方案确定
    • 1、器件选型
      • (1)语音识别模块
      • (2)词条存储模块
      • (3)语音提示模块
      • (4)主控芯片
    • 2、方案确定
  • 三、IO资源分配与模块介绍
    • 1、模块资源分配
    • 2、模块介绍
  • 四、调试步骤
    • 第一步:初始程序
    • 第二部:硬件SPI实现通信
    • 第三步:单独对W25Q128进行读写测试
    • 第四步:单独对语音合成模块SYN6288进行测试
    • 第五步:语音识别与语音合成程序合并测试
    • 第六步:单菜单整体调试
    • 第七步:实现菜单的切换与返回操作
    • 第八步:程序简化
    • 第九步:测试发现问题并改进
  • 五、总结
    • 1、遗留问题
      • 1、W25Q128词条批量写入问题
      • 2、主程序对W25Q数据读出后为什么没有直接进行写入,而是要在while(1)的循环中不停写入
    • 2、新思路-CI1102(80词条)/CI1103(300词条)附说明文档
      • 特点:
      • 说明:
      • 芯片单价:
  • 参考文献与下载

一、模块整体设计思路

基于STM32的有限词条语音识别与对话模块_第1张图片

前期设计思路

二、器件选型与方案确定

1、器件选型

(1)语音识别模块

语音识别采用LD3320A语音识别芯片, LD3320是一款非特定语音识别芯片,使用前不需要语音识别训练就能够识别不同的群体,能同时识别普通话和方言。LD3320能够准确快速识别不同实验对象发出的相同的语音命令,使其的适用范围更加广泛。
LD3320具有可动态编辑的关键词语列表,只要在程序初始化时将需要识别的内容以拼音的形式写入LD3320,即可进行语音的识别 。举一个简单示例:在使用过程中,微处理器把诸如“wang zi”的拼音串按一定格式要求写入LD3320芯片的关键词列表中,当LD3320模块识别的语音内容与该关键词列表中的内容相同时便会输出相应的词条号。
LD3320的关键词列表的容量为50,在某一时刻,LD3320识别的语音内容就与这50条关键词进行对比,将最合适的结果所对应的词条号通过SPI串口通信输出给STM32F103处理器。此外,LD3320没有预置外部存储器的扩展接口,实现了真正的单芯片语音识别,因此大大消减了成本费用 。

(2)词条存储模块

因为LD3320A一次只能进行50条词条的存储,如果要进行大容量语音识别只能采取词条的分级管理,这样就涉及到词条的存储。考虑到词条分级管理所需要的存储空间大小,采用W25Q64作为词条存储设备最为合适。与U盘和SD卡存储相比,W25Q只需要通过SPI口连接至主控芯片即可,不需要类似U盘或SD卡特定的处理芯片,这样大大减少成本。

(3)语音提示模块

语音提示模块采用比较简单的TTS芯片,与廉价的MP3播放芯片相比,TTS芯片不需要去考虑音频文件的存储问题与环境干扰问题。从成本方面去分析,最主要的便是音频文件的存储,经测试1s的音频文件占用29kb大小,这样考虑到词条的三级管理是需要2403条语音提示,这样所需存储空间为66MB,这超过W25Q最大存储容量,所以需要U盘与SD卡参与,这样成本远超普通的TTS语音合成芯片。
TTS语音合成芯片常用的型号有科大讯飞的XFS5152CE、SYN6288、SYN6658等,综合考虑成本与实现该项目所需的功能,最终选型SYN6288。

(4)主控芯片

综合上述模块的选型与整体模块架构,在本项目中MCU需要具备:2个SPI接口,2个USART接口,通过MCU选型软件选择价格低廉的48脚主控芯片STM32F103C8T6作为项目MCU。

2、方案确定

基于STM32的有限词条语音识别与对话模块_第2张图片

方案定稿

三、IO资源分配与模块介绍

1、模块资源分配

引脚号 引脚名称 功能 连接模块 连接模块
3 PC14 外部RTC晶振 32.768KHz晶振 OSC32IN
4 PC15 外部RTC晶振 32.768KHz晶振 OSC32OUT
5 OSC_IN 外部晶振 8M晶振 XLAT-IN
6 OSC_OUT 外部晶振 8M晶振 XLAT-OUT
7 NRST 复位 复位电路 NRST
12 PA2 USART2_TX 语音合成模块 SYN6288-RxD
13 PA3 USART2_RX 语音合成模块 SYN6288-TxD
14 PA4 SPI1_NSS W25Q64的接口座 W25Q128-CS-B
15 PA5 SPI1_SCK W25Q64的接口座 W25Q128-CLK-B
16 PA6 SPI1_MISO W25Q64的接口座 W25Q128-DO-B
17 PA7 SPI1_MOSI W25Q64的接口座 W25Q128-DI-B
18 PB0 IO 刻字机串口流控制(USART1) IO
20 PB2 BOOT1 接地
25 PB12 SPI2_NSS LD3320A模块 LD CS
26 PB13 SPI2_SCK LD3320A模块 LD SDCK
27 PB14 SPI2_MISO LD3320A模块 LD SDO
28 PB15 SPI2_MOSI LD3320A模块 LD SDI
30 PA9 USART1_TX 端口连接刻字机主板 OUT-TxD
31 PA10 USART1_RX 端口连接刻字机主板 OUT-RxD
34 PA13 JTCK_SWDAT SWD烧录接口 SWIO
37 PA14 JTCK_SWCLK SWD烧录接口 SWCLK
44 BOOT0 BOOT0 接地
45 PB8 IO 接语音模块复位 LD IRQ
46 PB9 IO 接语音模块中断信号 LD RST

2、模块介绍

基于STM32的有限词条语音识别与对话模块_第3张图片

模块正面效果图 基于STM32的有限词条语音识别与对话模块_第4张图片

模块反面效果图

四、调试步骤

第一步:初始程序

初始程序基于语音模块的毕业设计去考虑,完全从毕业设计的程序出发。初始程序具备了50个词条的指令识别,以及识别之后的串口打印与OLED屏显示识别结果。MCU与语音模块采用了模拟SPI总线通信。

第二部:硬件SPI实现通信

在原始程序的基础上,将模拟SPI通信更改为硬件SPI通信,使用了MCU的SPI2通信接口,在保留原有功能的基础上进行了程序的移植。

第三步:单独对W25Q128进行读写测试

W25Q128与MCU连接采用了硬件SPI通信,使用的时SPI2接口。该程序实现了对W25Q128扇区擦除、数据写入与读出并进行两次数据比对。注意:通过串口1打印显示的时候会发现部分中文汉字数据乱码,这是只要点击十六进制显示并取消按十六进制显示,串口的中文汉字便会显示正常。

第四步:单独对语音合成模块SYN6288进行测试

SYN6288语音模块使用起来比较简单,直接通过串口2发送相关指令与待合成命令即可,SYN6288连接喇叭便会发出待合成语音命令。

第五步:语音识别与语音合成程序合并测试

在硬件SPI完成语音识别的基础上,在每一个识别结果下单独加入语音合成命令取代原有的串口打印与OLED屏显示,完成了一个简单的语音交互功能。

第六步:单菜单整体调试

这一步就是对之前整体功能的调试操作,事先通过单独程序完成对W25Q128数据写入,之后整体程序先读出W25Q128的内容并进行数据处理分类。分成了待识别的拼音数组、待合成的语音数组、待发送的指令数组以及待使用的扇区地址数组。之后便按照W25Q128读出内容进行语音识别与语音的合成操作。

第七步:实现菜单的切换与返回操作

这一步便是实现大量指令识别的基础。由于LD3320A一次只能进行50个词条的识别,要实现大量指令识别只能按菜单分批次写入,这就需要菜单切换与返回操作。

第八步:程序简化

为了实现大量指令的识别以及菜单的分级管理,必须对原有程序的用户处理函数进行简化操作,去掉switch选择并进行数据统一操作(去掉了扇区地址的数组),对这个操作的理解需要先理解用户程序的编写思路。

第九步:测试发现问题并改进

五、总结

1、遗留问题

1、W25Q128词条批量写入问题

前期W25Q128,后期因为用不到16M的容量,最终确定选用8M的W25Q64,程序更改只要更改FlashID即可,W25Q128的FlashID为0xEF4018,W25Q64的FlashID为0xEF4017。
前期W25Q128词条写入一次只写入一个扇区的内容,当然写入的内容要小于扇区容量,一般词条测试是否和要求的。

现在词条写入思路是:设定扇区地址并在相应扇区地址写入相应的内容(必须一一对应,主程序依靠其一一对应实现程序简化去掉了原有扇区地址数组),如果想要对调试菜单的内容进行写入,只需呀将红框标出的FLASH_WriteAddress改为0x001000,并将下面红框中的内容进行替换即可。这样虽然简单,但是总共50组词条写入,就要进行这样操作50次,我们为什么不进行一次操作完成呢?
我的尝试一:直接将50组数据定义在程序(如Order_Buffer[50][4096])中进行操作,这样写完一组只要进行相应标志位的更改便可以继续进行下一组数据写入。想法虽好,但是实际操作中发现程序无法对如此大的数据进行处理(芯片的空间不足)。要么刚换主芯片,选取容量大一点,要么数据内容从外部分批读入然后分批写入。
我的尝试二:将50组数据以txt文档的形式保存在U盘中,这样就可以通过U盘读取数据进而写入到W25Q64中。首先读取U盘的.txt文件并通过串口打印显示查看读取的结果是否正确,当然一组数据显示是没有问题,但是50组数据同时传输过来显示乱码比较严重(由于杜洋开发板U盘读取电路与JTAG电路引脚冲突,无法运行在线调试程序)。于是我该用正点原子407开发板的USB HOST的相关程序进行调试,发现数据完整性无法保持,之后我由于时间关系没有进一步去进行程序改进以及原因查明。

2、主程序对W25Q数据读出后为什么没有直接进行写入,而是要在while(1)的循环中不停写入

2、新思路-CI1102(80词条)/CI1103(300词条)附说明文档

特点:

单芯片集成语音识别与CPU;

说明:

CI1102 是一颗专用于语音处理的人工智能芯片,可广泛应用于家电、家居、照明、音箱、玩具、穿戴设备、汽车等产品领域,实现语音交互及控制。CI1102 内置自主研发的脑神经网络处理器 BNPU,支持本地语音识别,和内置的CPU 核结合可以做各类智能语音方案应用。
CI1102内置高性能低功耗Audio Codec 模块和硬件音频处理模块,可以外接麦克风实现单芯片远场降噪或者回声消除等功能。同时该芯片还集成多路 UART、I2C、SPI、PWM、GPIO等外围控制接口,可以开发低成本的单芯片智 能语音离线识别方案。

芯片单价:

15左右(1个);13左右(100个·)

参考文献与下载

本文 原文 link.
芯片数据资料:
W25Q128 link.
SYN6288 link.
LD3320 link.
原理图及PCB:link.
最终程序:link.

你可能感兴趣的:(嵌入式,语音识别,人工智能)