基于ESP32的人工智能语音教具

1. 背景

2017年7月,国务院印发的《新一代人工智能发展规划》明确提出:要广泛开展人工智能科普活动。实施全民智能教育项目,在中小学阶段设置人工智能相关课程,逐步推广编程教育,鼓励社会力量参与寓教于乐的编程教学软件、游戏的开发和推广。项目立足于STEAM教育和创客教育,从青少年的人工智能课程出发,提出基于ESP32的人工智能语音教具。

2. 创新点

1)多合一系统
将语音识别、语音合成、文字对话、语音对话及自然语言处理融合到一起,成为一个多功能系统。
2)功能强大
取代市场上存在的只能识别少数语料的离线语音识别模块和语音合成效果较差的语音合成模块,将实现大部分口语聊天中语音的识别和流畅的人声合成。
3)硬件部分小巧
分成嵌入式部分与云端服务器两部分,嵌入式部分通过无线通讯与服务器相连,即用户只需使用嵌入式部分即可实现全部功能。
4)图像化界面编程
用图形化界面编程取代代码编程,更适合于青少年的人工智能教育。

3. 总体设计

3.1 功能分析

如下图所示,基于ESP32的人工智能语音教具由模式选择区块和功能区块组成,其中功能区块包括语音识别功能区块、语音合成功能区块、文字对话功能区块、语音对话功能区块和自然语言处理功能区块。对于该系统的输入有两种,一种是模式输入,另一种是语音或文字输入。模式输入经由模式选择区块后设置功能区块的功能,语音或文字输入经由特定的功能区块处理,产生对应的结果输出,由语音识别功能区块产生语音对应的文字,语音合成功能区块产生文字对应的语音,文字对话功能区块由输入文字A 产生输出文字B,语音对话功能区块有输入语音A 产生输出语音B,自然语言处理功能区块对输入的文字进行处理得到输出文字。

3.2 结构分析

如下图所示,基于ESP32的人工智能语音教具包括微控制器与无线通讯模块、语音录制与播放模块、外置FLASH 模块和集成服务器组成。
1)主控器与微控制器与无线通讯模块之间通过异步串行通信口(UART)通讯,通讯内容包括模式选择指令和文字数据,实现微控制器与无线通讯模块模式的选择和文字数据的接收与发送。
2)微控制器与无线通讯模块与集成服务器使用传输控制协议(TCP)进行通讯,通讯内容包括模式选择指令、语音数据和文字数据,实现集成服务器模式的选择、语音数据和文字数据的接收与发送。
3)微控制器与无线通讯模块与语音录制与播放模块使用集成电路内置音频总线(I2S)进行通讯,通讯内容为语音数据,实现语音的录制与播放。
4)外置FLASH 芯片与微控制器与无线通讯模块通过串行外设接口(SPI)通讯,通讯内容为语音数据,实现语音数据的存储与读取。
在这里插入图片描述

4. 硬件方案设计

4.1 微控制器与无线通讯模块选择

微控制器与无线通讯芯片,可以使用两个芯片即微控制器芯片与无线通讯芯片的组合,也可以使用带有无线通讯功能的微控制器芯片。该芯片需要处理多个任务,由于需要语音识别、语音合成、文字对话、语音对话和自然语言处理等多个功能,且涉及到语音数据的储存与读取、接收与发送,应考虑足够容量的FLASH 和运行RAM,且保证足够的速率。由3.2 结构分析可知,微控制器与无线通讯模块需要具有UART/TCP(无线通讯)/I2S/SPI等功能,且还需普通IO口外接LED灯来显示当前状态。本项目为满足性能要求,多个交互与处理任务需求、内存需求、外设需求、价格和功耗等因素,选取了乐鑫信息科技有限公司的一款32 位芯片模组,型号为ESP-WROOM-32。
ESP-WROOM-32 内置两个低功耗 Xtensa®32-bit LX6 MCU,时钟频率的调节范围为80 MHz 到240 MHz。其片上存储包括用于程序启动和内核功能调用的448KB 的ROM,用于数据和指令存储的520 KB 的静态随机存储器(SRAM);片外储存器最多支持4 个16 MBytes 的外部QSPI Flash 和SRAM。详见其官网数据手册

4.2 语音录制与播放模块选择

语音录制与播放模块在微控制器与无线通讯模块控制下,进行语音的录制或者语音的播放。
1)依据奈奎斯特采样定理,当采样频率大于信号中最高频率的2 倍时,采样之后的数字信号完整地保留了原始信号中的信息。人类平时语音的频率在8000Hz 下,录制语音时需要方便设置采样频率为16000Hz。
2)由于我们采取I2S 接口传输音频数据,需要语音录制与播放芯片支持I2S通讯。
3)播放语音时,为方便调试,语音录制与播放芯片需要同时支持有源音响和小功率无源喇叭。
根据上述三点要求,本项目选取了WM8978 芯片,满足上述要求。
实际电路实现根据官网数据手册提供应用电路图和调试时使用的模组的电路图调整而来,其中I2S 与I2C 的接口与微控制器与无线通讯模块相连,尤其注意I2C 接口上拉。

4.3 外置FLASH模块选择

由于设置的采样频率为16000Hz,若采样位数设置为16 位,采用单通道,根据数据量(字节/秒)= (采样频率(Hz)× 采样位数(bit) × 声道数)/ 8≈3KB/s。故4MB 的FLASH 足够,并且对于ESP32 模组的单个最大外接FLASH 为16M。故,选取4MB 的W25Q32 芯片。

5. 软件方案设计

5.1总体设计

在这里插入图片描述

  • 主控器采用图形化编程实现主控功能,作为教具主控部分,可重复编程。
  • 嵌入式部分按模块结构分为通讯部分和逻辑部分。通讯部分为微控制器与无线通讯模块通过I2S 与语音录制和播放模块通讯、微控制器与无线通讯模块通过UART 与主控器通讯、微控制器与无线通讯模块通过SPI 与外置FLASH 模块通讯和微控制器与无线通讯模块通过TCP 与云端集成服务器通讯四部分,逻辑部分为数据的处理。程序设计将针对具体的实现过程来进行。
  • 服务器部分代码包括语音识别、语音合成、文字对话、语音对话、自然语言处理五者的功能实现代码。

5.2 嵌入式部分

在这里插入图片描述
嵌入式部分程序流程图如上图所示,经由系统初始化,创建LED 灯显示Wi-Fi 连接状态的任务后,进行Wi-Fi 连接及配网过程,Wi-Fi 连接成功后进行TCP 连接云端服务器,TCP 连接成功后创建触发事件,创建主处理任务,创建出错处理任务。本项目使用ESP32 模组作为微控制器与无线通讯模块,故采用官方提供的集成开发环境,使用C 语言进行编程,在Windows 下使用MSYS2 环境进行编译与下载。

5.2.1 系统初始化

在这里插入图片描述
系统初始化,分为串口初始化、语音录制与播放初始化、片外FLASH 初始化和按钮与LED 的IO 口初始化。

  • 串口初始化内容为,通过配置uart_config_t 结构体来设置串口,其中包括设置串口波特率为115200、设置串口端口、设置串口接收与发送缓存大小为100Bytes 等。
  • 语音录制与播放初始化内容为,配置wm8978 芯片的一系列寄存器,使其满足采样频率为16000Hz,采样通道为单通道,设置无源喇叭音量为最大(这里使用无源喇叭,而不是有源音箱)等;并设置wm8978 和微控制器与无线通讯芯片连接的对应端口。
  • 片外FLASH 初始化内容为,通过配置spi_bus_config_t 结构体来配置SPI通讯,包括设置W25Q32 和微控制器与无线通讯芯片连接的对应端口,时钟频率设置为10MHz,主设备的通信模式为mode 0 等。
  • 按钮与LED 和按钮的IO 口初始化内容为,通过配置gpio_config_t 结构体来配置对应IO 口,设置按钮对应的IO 口为上拉电阻输入,LED 灯为悬浮输出。

5.2.2 Wi-Fi连接与微信配网

Wi-Fi 连接与微信配网过程分为3 步:
1)读取掉电保存单元里的Wi-Fi 保存标志值,若其等于某个设定值,读取掉电保存单元里的Wi-Fi 账号与密码,并设置与连接;若不等于改设定值,设置Wi-Fi 初试账号为“abc”,密码为“123456789”,并以此进行Wi-Fi 连接
2)若连接成功,将账号密码存入ESP32 模组的掉电保存单元,在掉电保存单位里设置Wi-Fi 保存标志值为设定值,置网络连接标志位为1,并结束Wi-Fi连接过程;若连接失败,清零Wi-Fi 保存标志值,进入第3)步;
3)扫描对应二维码,进入微信配网,填入设备可连接的Wi-Fi 账号与密码,进行连接,回到第2)步。

5.2.3 LED显示网络连接状态的任务

LED 灯显示网络连接状态的任务分为2 步:
1)循环读取网络连接标志值
2)若网络连接标志值为0 时,即没有连接上Wi-Fi,较快地闪烁LED;若网络连接标志值为1,即已经连接上Wi-Fi,较慢的闪烁LED;若网络连接标志值为2,即已经与对应服务器建立TCP 连接,此时长亮LED,并删除该任务。

5.2.4 触发事件任务

在这里插入图片描述
触发事件任务,分为TCP 接收任务、UART 接收任务和按钮任务三个。

  • TCP 接收任务创建,当TCP 接收到集成服务器传来的数据时,置TCP 数据标志位(tcp_flag)为1,并储存接收到的数据。
  • UART 接收任务创建,当UART 接收到主控器传来的数据时,置UART 数据标志位(uart_flag)为1,并储存接收到的数据。
  • 按钮任务创建,当按钮按下(经过防抖处理)时,置按钮标志位(key_flag)为1,松开时清零。

5.2.5 主处理任务

主处理任务包括语音识别、语音合成、文字对话、语音对话及自然语音处理功能的处理,开始某一模式后,由过程状态机进行切换,过程状态均分为就绪态0、工作态1、工作态2。过程执行读取触发事件的状态位时,会进行相应的处理,并清零。故,跟功能相关的主要处理过程将全部放在主处理任务中进行,并用面向过程的思路进行编程。

语音识别模式为例,语音识别模式状态转移图如下图所示:
i)初试状态为就绪态0:当按钮标志位为0 时,进入uart 处理函数;若uart 接收到模式指令则进入模式切换,若uart 没有接受到模式指令则回到就绪态0。
ii)当按钮标志位为1 时,就绪态0 变为工作态1。
iii)工作态1:此时若按钮标志位为1,则微控制器与无线通讯模块录制与通过TCP 发送语音给云端集成服务器 。
iv)当按钮标志位为0 时,工作态1 变为工作态2。
v)工作态2:此时若TCP 数据标志位为1,则进入tcp 处理函数,处理结束后回到入就绪态0;若TCP 数据标志位为0,回到工作态2。

  • 这里的uart 处理函数为uart 模式处理函数,内容为:当uart 数据标志位为1 时,判断uart 缓存数据是否是模式指令,若uart 缓存数据是模式指令,置模式标志位并进入模式切换;若uart 缓存数据不是模式指令,清模式标志位和uart 数据标志位。
  • 这里的tcp 处理函数为tcp 文字处理函数,内容为:当tcp 数据标志位为1时,判断tcp 缓存数据是否是文字内容,若tcp 缓存数据是文字内容,通过uart发送该文字给主控器,清tcp 数据标志位,若tcp 缓存数据不是文字内容,清tcp 数据标志位。
    在这里插入图片描述

5.2.6 出错处理任务

在主处理任务中使用状态机进行过程的切换,但是由于网络通讯堵塞和其他数据出错的问题可能存在,会导致程序停留在某一状态,无法执行下面的程序或是重新开始。故,这里新建一个出错处理任务,每一模式下的总过程设定最长执行时间,当该模式下的超过最长时间时,强制清零所有标志,此时该模块在不复位的情况下可继续工作。

5.3 服务器部分

服务器部分可以采用两种方案,一种是使用较为完善的语音平台提供的SDK和API 来实现,另一种是自己的语音识别、语音合成和文本对话的系统。本项目以前者作为实现,也提供了接入后者的接口。
服务器部分使用Eclipse 集成开发环境,选用Java 实现,将生成的WAR 包部署到放到阿里云服务器的Tomcat 中。服务器部分分为语音识别实现、语音合成实现、文字对话实现、语音识别实现和自然语言处理实现五个部分。

5.3.1 语音识别实现与语音合成实现

语音识别与语音合成实现类似,这里以语音识别实现为例说明,分为下面4 个步骤
1)接收微控制器与无线通讯模块的数据和微控制器与无线通讯模块建立TCP 连接后,初始化接收标志位为true,并建立run 方法每次接收一个字节,储存在byte 数组中,直到500ms 未接收到数据时,将接收标志位设置false。
2)进入语音模式
当接收标志位为false,且接收到语音识别的模式指令,进入语音识别模式,并将接收标志位置为true。
3)获取语音识别结果
在进入语音识别模式后,当接收标志位为false,且通过1)的方式接收到一定字节的语音数据。
4)将获取的语音识别结果的文本内容以自己拟定的固定格式通过TCP 连接发给微控制器与无线通讯模块,将接收标志位置为true。

5.3.2 语音对话实现

在这里插入图片描述
如上图所示,语音对话的实现是,一段语音通过语音识别实现的结果,再通过文字对话实现,再通过语音合成实现,生成另一段语音的结果,故在实现上,只需将三者组合起来。

5.3.3 自然语言处理实现

本项目对于自然语言处理的实现主要针对中文,这里的自然语言处理主要采用Word2Vec 的方法,只选取了其中一种应用实现。将通过机器学习训练好的中文词语的Word2Vec 向量表导入到服务器中。自然语言处理实现分为4 个步骤。
1)接收微控制器与无线通讯模块的数据。
2)进入自然语言处理模式。
3)获取自然语言处理结果。
对于参数(a, b, c)获得期望获得d 的意义是:a 与b 相对,那么c 与d相对,即
在这里插入图片描述
其中的d 就是期望获得的结果。其中通过TCP 接收来自微控制器与无线通讯
模块的参数(a, b, c)为三个词语,而词语可以通过Word2Vec 向量表得到对
应的一定维数的向量,通过
d = c −(a −b)
得到d,根据余弦距离计算得到最近的向量,其对应的词语即我们所需要的输出。
4)发送自然语言处理结果给微控制器与无线通讯模块。

6 实验

主控器是在Arduino UNO 开发板的基础上二次开发的一个控制器,其使用RJ11 接口代替杜邦线来进行端口的连接。主控器的软件系统采用由北京师范大学教育学部创客教育实验室傅骞教授团队基于Google 的Blockly 图形化编程框架开发的免费开源的图形化Arduino 编程软件Mixly,在其基础上二次使用JavaScript语言二次开发了所需的功能模块,模块样式及其功能说明如下图所示。实验将通过对主控器的图像化编程来实现对基于ESP32的人工智能语言教具的控制。
在这里插入图片描述

6.1 语音识别实验

在这里插入图片描述
测试结果:通过现场测试,在环境比较安静时,效果较好,如不同的人说“早上好”、“早啊”等包含“早”字的中文普通话时,LED 灯能够顺利亮起,说“关灯”、“请关灯吧”等包含“关灯”两个字的中文普通话时,LED 能够顺利关闭。在有噪声时,识别效果不好,如边上有人在交谈、或者有电视放出声音等环境,说出带有“早”或“关灯”的关键词则会出现无法控制LED 等的亮灭。

6.2 语音合成实验

在这里插入图片描述
测试结果:平均每隔5 秒钟听到“请输入语音合成内容”的人声。

6.3 语音对话实验

在这里插入图片描述
测试结果:按下按钮时开始说话,松开时结束说话,稍等约2 秒钟即可听到基于ESP32的人工智能语音教具针对刚才的说话的回应普通话语音。

6.4 文字对话实验

在这里插入图片描述
测试结果:可实现文字对话。

7. 不足与改进

1)本项目主要采用了较为完善的语音平台提供的SDK 和API 来实现功能,虽说也提供了自主实现功能的接口,但在现在的实现结果上,过于依赖别人的技术。在能力与资源允许的情况下,应探索自主实现的技术。
2)在硬件方面采用按钮按下的触发,来进行录制语音并发送,过于机械化。可通过特定的语音唤醒来改进。
3)在安静环境中的语音识别较好,但是对于噪声环境下的识别效果不好,需要在噪声处理改善。

展开阅读全文

没有更多推荐了,返回首页