基于语音识别的智能垃圾分类系统设计
2021-05-20胡振山江振青吕海燕
胡振山 江振青 吕海燕
(临沂大学,山东 临沂 276000)
0 前言
随着城市的高速发展,生活水平和消费水平的提高,饮食行业的迅速发展,城市生活垃圾的产量不断增加,同时垃圾的成分也越来越复杂。 垃圾产生的污染问题也日益严重。 垃圾在腐化过程中,产生氨、甲烷和硫化氢等有害气体,形成恶臭,严重污染大气。 所以, 垃圾的处理正日益成为困扰人们的严重问题。我们希望通过这个系统帮助人们正确地进行垃圾分类、可回收物的细分,可以提高可回收物的利用率。
语音技术发展到今天,其精度尤其是中小词汇量非特定人声语音识别的精度已达98%。 随着大规模集成电路的发展,复杂的语音识别系统也完全可以制成专用芯片,大量生产。 可以预测近五年到十年内,语音识别的应用范围将更加广泛。 各种各样的产品将出现在市场上[1]。
本文设计并制作了一个语音识别智能垃圾分类垃圾桶,可以根据用户说出的垃圾名称进行智能垃圾分类的系统。
1 器件选取
本设计拟采用STM32 单片机作为主控芯片,结合LD3320 实现语音识别模块智能识别垃圾种类。
采用STM32F013ZET6 芯片作为主控芯片, 该芯片属于arm 内核的一个版本, 比传统的51 单片机高级。 程序都是采用模块化编程,接口相对简单,自身带很多功能,工作速度也快。 该芯片采用的CPU(中央处理器)是 ARM 的 32 位 Cortex-M3,拥有片上 128 k 的闪存,还有20 k 的RAM(随机存取存储器)。并支持各种外设,如定时器,ADC(模拟数字转换器),SPI,USB,IIC 和 UART。 使得它在简单的电路上就能执行信号采集和数据滤波。
采用LD3320 实现语音识别功能,LD3320 是非特定人(不用针对指定人)语音识别芯片,即语音声控芯片。 最多可以识别50 条预先内置的指令。 LD3320 作为一款基于SI-ASR(非特定人语音识别)技术的语音识别/声控芯片,集成了一系列与其功能相关的外部电路, 包括模拟数字转换器 (ADC), 数字模拟转换器(DAC)、麦克风剪口和声音输出接口等,使得LD3320能够在没有任何外接辅助FLASH (闪存)、RAM 芯片的情况下直线语音识别/声控/人机对话等功能。 且LD3320 在工作时,无须进行预先的训练和录音,语音识别准确率达到了95 %,是一款优秀的非特定性语音识别芯片[2]。
2 系统设计
2.1 整体方案设计
整个系统设计思路为系统上电后,语音识别模块开始识别模式,在接收到命令关键词后通过串口通信将数据发送到主控系统(STM32),主控系统接收到数据后根据不同的数据打开对应的垃圾桶(舵机)。 系统整体流程图如图1 所示。
图1 系统整体流程
2.2 单片机程序设计
2.2.1 Keil5 软件的简介
Keil 是美国Keil Software 公司出品的51 系列兼容单片机C 语言软件开发系统。 Keil 提供了包括C 编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境将这些部分组合到一起。 在开发大型软件时更能体现高级语言的优势。 与汇编相比,C 语言在功能上、 结构性、可读性、可维护性上有明显的优势,因而易学易用。
2.2.2 数据通信
在本设计中,语音识别模块通过STC11L08XE 单片机对LD3320 进行数据采集, 通过程序将识别的结果转换成16 进制的数据, 通过串口将其发送到STM32,STM32 通过分析接收的数据做出相应的反应,具体表现为打开相应的垃圾桶(用舵机模拟)。 通信使用3 根线完成,分别是地线、发送、接收。 由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。 其他线用于握手,但不是必需的。 串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。 对于两个进行通信的端口,这些参数必须匹配。
2.2.3 语音识别模块的实现
LD3320 语音识别芯片采用的就是自动语音识别技术(ASR)技术,通过麦克风将语音输入LD3320 芯片,在芯片内部进行频谱分析并提取特征,达到语音识别的功能,同时LD3320 还可以通过关键词列表进行语音识别。 在此只需要把识别的关键词语以字符串的形式传送进芯片, 即可以在下次识别中立即生效。 在 MCU (本文中选用语音识别模块的MCU 是STC10L08XE 单片机)的编程中,简单地通过设置芯片的寄存器,把诸如“ni hao”这样的识别关键词语的内容动态地传入芯片中, 芯片就可以识别所设定的关键词语了。 每个关键词语可以是单字、词组、短句或者任何的中文发音的组合。 基于LD3320 的语音识别系统可以随着使用流程,在运行时动态地更改关键词语列表的内容,这样可以用一个系统支持多种不同的场景,同时也不需要用户做任何的录音训练。 整体流程如图2 所示。
图2 语音识别的实现流程
2.2.4 程序开发
首先,确定输入输出端口(I/O 口)地址的分配,根据系统的输入输出的要求,分配I/O 地址,这里包括串口的I/O 口, 控制舵机所用的定时器为脉冲宽度调制(PWM)输出口。
其次,确定程序结构,程序采用模块化编程的设计方法,整个程序包括 main,usart,tim,LDChip 四个对象块。 通过HAL 库函数开发,相对于寄存器的开发方式更加简便,使程序大大简化,降低了开发的难度。 整体程序运行流程框图如图3 所示。
图3 系统运行流程
应用模块化编程的方法,使程序更加清晰,方便修改或者移植,在本设计中,需要对以下四个部分进行设置:
(1)采用串口通信将主控STM32 和语音识别模块进行数据通信。 对于STM32 单片机的串口使用,首先进行初始化,将STM32 和STC10L08XE 单片机的串口波特率都设置成9600,字长设置为8 位,设置一位停止位,不设置奇偶校验位,将其进行函数封装,波特率可根据实际要求进行修改。在本设计中,采用USART3和语音识别部分进行数据通信,USART1 通过printf函数进行输出打印以方便监控程序的运行情况。
(2)tim 定时器具有输出 PWM 信号的功能, 采用舵机来模拟垃圾桶的开关,舵机转动的角度需要固定占空比的PWM 信号,高电平脉冲的时间0.5 ms,舵机转到 0°,1ms 对应 45°,1.5 ms 对 应 90°,2 ms 对 应135°,2.5 ms 对应 180°,只能在 0.5~2.5 ms 调节,转动0°到180 °任意角度,只要控制PWM 波的高电平占空比就要可以达到自己想要的转动角度。
控制垃圾桶打开只需将舵机转动90°, 所以需要脉冲宽度为1.5 ms 的信号。 在此要对定时器的PWM功能进行一个初始化,包括对分频系数,计数模式,自动装载值,比较值,输出比较极性进行配置。 通用定时器可以同时产生多达4 路的PWM 输出, 满足同时驱动4 路舵机的要求, 所以需要使能相应定时器时钟,PWM 的输出信号频率是由自动重装寄存器(ARR)的值决定,占空比由比较寄存器(CCR)的值决定。 由于PWM 输出通道是对应着STM32F1 芯片的I/O 口,所以也需要使能对应的端口时钟, 并将对应I/O 口配置为复用输出功能。
(3)LDChip 里的函数负责封装语音识别的相关函数,语音识别用初始化(包括通用初始化)→写入识别列表→开始识别,并准备好中断响应函数,打开中断允许位。 列表的规则是,每个识别条目对应一个特定的编号(1 个字节),不同的识别条目的编号可以相同,而且不用连续。 本芯片最多支持50 个识别条目,每个识别条目是标准普通话的汉语拼音(小写),每 2 个字(汉语拼音) 之间用一个空格间隔。 开发时配置读取0xB2 寄存器的函数, 如果在以后的自动语音识别技术(ASR)命令函数前不能够读取到正确 Idle 状态,说明芯片内部可能出错了。 经拷机测试,当使用的电源电压/电流出现不稳定有较大波动时,有小概率会出现这种情况。 出现这种情况时,复位LD3320 芯片,重新启动设置芯片即可。
(4)main 函数作为本设计中的主程序, 在本函数中将串口,定时器PWM 部分进行初始化,通过while函数使串口始终保持等待接收状态,同时对接收的数据进行处理, 根据不同的数据对定时器各路PWM 信号的占空比进行设置,达到打开对应舵机的效果。
3 结果测试
系统程序的验证,ST-LINK 仿真器的作用是用以实现硬件仿真的硬件。 仿真器可以实现替代单片机对程序的运行进行控制,例如单步,全速,查看资源断点等。 程序完成后,通过硬件对整个程序分步验证,可以发现程序中错误的地方以及不完善的地方, 加以改进。 通过语音识别模块的程序可知,由于要把垃圾分类分四类,所以根据设置的发送数据可知,当说出的垃圾为有害垃圾时,STM32 接收的数据为0x01, 会打开1 号垃圾桶,当说出其他垃圾名称时,也会发送不同的数据,打开对应的垃圾桶,见表1。 后通过串口监控发现,功能正常,如图4 所示。
表1 不同类型垃圾所发送的数据
图4 串口监控
4 结论
本系统设计了一款通过语音识别进行垃圾分类的辅助性垃圾桶,可以帮助人们更方便地进行垃圾分类,更好地进行垃圾回收处理。 通过本设计可以看出,语音识别技术的确可以更加方便地进行垃圾分类处理,在今后的生活中必将发挥越来越大的功能,语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术。 通过语音识别进行垃圾分类,将大大提高普通居民垃圾分类的效率,提高居民的积极性,大大促进国家垃圾分类政策的落实。