技术文档

基于单片机的语音识别 基于MCU设计的语音识别系统

小编 2024-10-06 技术文档 23 0

基于MCU设计的语音识别系统

0 引言

传统的人机交互依靠复杂的键盘或按钮来实现,随着科技的发展,一些新型的人机交互方式也随之诞生,带给人们全新的体验。基于语音识别的人机交互方式是目前热门的技术之一。但是语音识别功能算法复杂、计算量大,一般在计算机上实现,即使是嵌入式方面,多数方案也需要运算能力强的 ARM 或 DSP,并且外扩 RAM、FLASH 等资源,增加了硬件成本,这些特点无疑限制了语音识别技术的应用,尤其是嵌入式领域。

本系统采用的主控 MCU为 Atmel 公司的 ATMEGA128,语音识别功能则采用 ICRoute 公司的单芯片 LD3320。LD3320 内部集成优化过的语音识别算法,无需外部 FLASH,RAM 资源,可以很好地完成非特定人的语音识别任务。

1 整体方案设计

1.1 语音识别原理

在计算机系统中,语音信号本身的不确定性、动态性和连续性是语音识别的难点。主流的语音识别技术是基于统计模式识别的基本理论,原理如图 1 所示。

2.1 控制器电路

控制器选用 Atmel 公司生产的 ATMEGA128 芯片,采用先进的 RISC 结构,内置 128 KB FLASH,4 KB SRAM,4 KB E2PROM 等丰富资源。该芯片是业界高性能、低功耗的 8 位微处理器,并在 8 位单片机市场有着广泛应用。

2.2 LD3320 语音识别电路

LD3320 芯片是一款“语音识别”专用芯片。该芯片集成了语音识别处理器和一些外部电路,包括 A/D、D/A 转换器、麦克风接口、声音输出接口等,而且可以播放 MP3。不需要外接任何的辅助芯片如 FLASH,RAM 等,直接集成到产品中即可以实现语音识别、声控、人机对话功能。

图 3 为 LD3320 电路原理图,与 MCU 通信采用 SPI 总线方式,时钟不能超过 1.5MHz。

麦克风工作电路如图 4 所示,音频输出只需将扬声器连接到 SPOP 和 SPON 即可。使用 SPI 总线方式时,LD3320 的 MD 要设为高电平,SPIS 设为低电平。SPI 总线的引脚有 SDI,SDO,SDCK 以及 SCS。INTB 为中断端口,当有识别结果或 MP3 数据不足时,会触发中断,通知 MCU 处理。RSTB 引脚是 LD3320 复位端,低电平有效。LED1,LED2 作为上电指示灯。

3 软件系统设计

软件设计主要有两部分,分别为移植 LD3320 官方代码和编写语音识别应用程序。

3.1 移植 LD3320 源代码

LD3320 源代码是基于 51 单片机实现的,SPI 部分采用的是软件模拟方式,但在播放 MP3 数据时会有停顿现象,原因是 51 单片机主频较低,导致 SPI 速率很慢,不能及时更新 MP3 数据。移植到 ATMEGA128 需要修改底层寄存器读写函数、中断函数等。底层驱动在 Reg_RW.c 文件中,首先在 Reg_RW.h 使用 HARD_PARA_PORT 宏定义,以支持硬件 SPI。然后在 Reg_RW.c 文件中找到 HARD_PARA_PORT 对应条件宏的代码段,保留 AVR 的 SPI 接口代码。

3.2 应用程序实现

在代码中预先设定几个单词:“你好”,“播放音乐”,“打开”。当用户说“播放音乐”时,MCU 控制 LD3320 播放一段音乐,如果是其他词语,则在串口中打印识别结果,然后再次转换到语音识别状态。

3.2.1 MP3 播放代码

LD3320 支持 MP3 数据播放,播放声音的操作顺序为:

通用初始化→MP3 播放用初始化→调节播放音量→开始播放。

将 MP3 数据顺序放入数据寄存器,芯片播放完一定数量的数据时会发出中断请求,在中断函数中连续送入声音数据,直到声音数据结束。MP3 播放函数实现代码如下:

由于 MCU 容量限制,选取测试的 MP3 文件不能太大。首先在计算机上将 MP3 文件的二进制数据转为标准 C 数组格式文件,然后将该文件加入工程中。源代码中 MP3 文件存储在外扩的 SPI FLASH 中,工程中需要注释和移除全部相关代码。MP3 数据读取函数是 LD_ReloadMp3Data,只需将读取的 SPI FLASH 数据部分改成以数组数据读取的方式即可。

3.2.2 语音识别程序

LD3320 语音识别芯片完成的操作顺序为:通用初始化→ASR 初始化→添加关键词→开启语音识别。在源代码中的 RunASR函数已经实现了上面的过程,直接调用即可开启语音识别功能。

RunASR函数代码如下:

用户说完话后,LD3320 通过打分的方式,将关键词列表中特征最相似的一个作为输出。然后 LD3320 会产生一个中断信号,此时 MCU 跳入中断函数读取 C5 寄存器的值,该值即为识别结果,得到结果后,用户可以根据数值来实现一些功能,比如读取到 1,说明是“播放音乐”,那么可以调用前面的 PlaySound函数来播放音乐。

语音识别控制的关键点在于语音识别的准确率。表 1 给出了测试结果,当然也可以在识别列表中加入更多的关键词来做测试。通过测试结果可以看出,LD3320 的识别率在 95%上,能够满足用户需求。

4 结语

本文讨论了基于 AVR 单片机的语音识别系统设计的可行性,并给出了设计方案。通过多次测试结果表明,本系统具有电路运行稳定,语音识别率高,成本低等优点。同时借助于 LD3320 的 MP3 播放功能,该系统具有一定的交互性和娱乐性。移植性方面,系统通过简单的修改,可以很方便地将 LD3320 驱动程序移植到各种嵌入式系统中。随着人们对人工智能功能的需求,语音识别技术将越来越受到人们的关注,相信不久的将来,语音识别将会拥有更广阔的应用。

单片机语音播报怎么做?语音模块原理及程序编写思路

我最欢就是做带语音播报的产品,写程序的过程太枯燥了。

有些产品一开发就是几个月,整个过程都跟冷冰冰的LED、蜂鸣器、按键、LCD屏打交道难免有些寂寞。

加上语音就不同了,录制好一个好听的妹子声音,不但可以提升整个产品的逼格,自己也满满的成就感。

今天就来聊聊带语音的产品怎么做。

实际产品中,用单片机播放语音方案有很多种,唯一没有开发板那种,因为成本各方面都不满足产品需求。

另外就是加一个语音芯片,如果利润高的产品会优先使用这种,一个几块钱还能接受。

还有就做软解码的,就是把语音文件解码成喇叭能够识别的PWM和DAC数据,这种技术难度最大,对工程师编程水平是一个考验。

虽然难度大,但是成本低,不需要额外增加语音芯片,老板的最爱,反正工程师掉点头发对公司又没影响。

软解码大概在6,7年前做电子狗的时候玩过一次,大概原理就是把语音文件合并成bin文件,烧录到外置的flash里面,做好每条语音的地址映射。

用单片机读取Flash的数据并解码,然后转换成PWM或者DAC经过功放输出到喇叭。

这种一般要有个写上位机的配合,以前市面上没有在把语音文件合并成bin文件的工具,现在好像有了。

时间相隔太久,很多细节记不清楚了,后续如果还能找到资料再跟大家分享。

今天无际单片机编程给大家讲后面我做过的一种方法:用语音芯片

这是语音芯片的一些介绍:

我们需要关注的就是,这个芯片对语音长度的支持分别有55s、25s、85s,如果产品语音少还是挺合适的。

这种芯片如果语音少的直接用芯片内部的Flash,如果语音多了就需要外挂一个Flash来存储语音数据。

一般每个产品的语音都是不一样的,那怎么把我们想要的语音通过这个语音芯片播放出来呢?

想实现这个功能要经过以下几个步骤:

通过软件把语音文案转成mp3格式语音文件,类似的软件有很多,比如说科大讯飞。把语音文件提供给芯片方,让他们帮你定制。拿到样品后就是焊接到自己板子上,然后根据芯片规格书写控制时序程序,每条语音都对应了一个地址,只要把地址数据写入芯片,芯片就会自动播放指定语音。

整个过程是不是非常简单?

除了播放语音功能以外,还有一些附加功能,比如说静音,音量调节、循环播放等等。

下面来看下芯片的引脚定义

一般使用3根线来跟单片机通讯。

PA0/SDA: 数据线

PA1/SCL: 时钟线

PA2: 忙碌线,当有语音播报的时候,该引脚为低电平。

芯片的控制时序如下:

不难发现,数据开始之前SCL需要先产生5ms的低电平同步头,然后数据在SCL线的上升沿被读取,一共读取8位,也就是1个字节。

如果你不会写这个时序也没关系,芯片原厂都有提供例程。

相关问答

单片机语音识别 算法代码?

单片机语音识别算法的代码相对复杂,需要使用适合的语音识别算法库和单片机开发工具。一个简单的示例代码如下:```c#include单片机语音识别算法的代码相对复杂...

怎么用 单片机 提取 语音 特征参数?

单片机提取语音特征参数的过程通常包括预处理、分帧、加窗、傅里叶变换和Mel滤波器组。预处理阶段消除语音信号中的环境噪声和非语音信号。分帧将语音信号按...

su03t 语音 怎么和arduino 单片机 相连的?

要将SU03T语音模块与Arduino单片机相连,可以按照以下步骤进行操作:1.首先,将Arduino与SU03T模块连接的串行通信引脚匹配好。通常,Arduino的RX引脚连接到SU0...

su03t 语音 怎么和 单片机 相连的?

1.将su03t语音模块的VCC、GND、TX、RX引脚分别连接到单片机的电源、地、串口发送引脚、串口接收引脚。2.设置单片机的串口通讯参数,如波特率、数据位、校验...

单片机 如何控制喇叭发 语音 ?

方法是单片机的IO口接蜂鸣器的负端,蜂鸣器的正端接电源Vcc,IO口输出低电平时蜂鸣器导通,输出高电平时蜂鸣器截止。是否发声要看所选蜂鸣器的类型。如果是无...

单片机 C 语音 不用硬件乘除法怎么实现?

单片机C语言编程硬件乘除法运行后无法取数,编译器报错,有没有别的办法可以实现单片机C语言编程硬件乘除法运行后无法取数,编译器报错,有没有别的办法可以...

单片机语音 模块控制选什么好?

语音芯片选型语音芯片选型安防系统、会议记录系统、录音玩具等产品都要求具备录音功能,这类型产品的开发都会用到录音语音芯片,市场上有录音功能的芯片主要...

语音识别 技术如何入门?

作为硬件工程师,有做过智能语音音箱方面的相关经历和语音识别的硬件测试,下面我来分析一下。语音识别技术的实现,主要三部分:1.硬件部分硬件的实现主要是...

嵌入式和 单片机 有哪些联系和区别?

嵌入式系统和单片机都是实现特定功能的计算机系统,它们之间有以下联系与区别:联系:1.均为计算机系统:嵌入式系统和单片机均由处理器、存储...嵌入式系统和...

离线语音控制芯片上的 语音 命令词汇能不能自定义成各种不同的语言,包括各种方言?

需要查看在何种平台的语音控制芯片,如果是单片机平台,除非你专门请设计公司针对你的需求出设计方案,不然目前的语音识别芯片或者模块,应该是做不到各种不同语...

猜你喜欢