当前位置:首页 > 技术学院 > 技术前线
[导读]从地铁站的“下一站即将到达”,到快递柜的“请取走您的包裹”,从智能手环的“心率异常提醒”到厨房秤的“当前重量500克”,语音播报已经渗透到我们生活的方方面面,成为嵌入式设备、物联网产品、移动APP最常用的交互功能之一。

从地铁站的“下一站即将到达”,到快递柜的“请取走您的包裹”,从智能手环的“心率异常提醒”到厨房秤的“当前重量500克”,语音播报已经渗透到我们生活的方方面面,成为嵌入式设备、物联网产品、移动APP最常用的交互功能之一。很多开发者刚接触语音播报,会纠结是用硬件模块还是软件合成、怎么实现中文播报、怎么平衡成本和效果,今天我们就从方案选型到代码实现,把语音播报功能的实现逻辑讲清楚,不管是做嵌入式项目还是移动应用,看完都能找到适合自己的实现方案。

一、语音播报的两种核心方案:怎么选适合自己的?

目前实现语音播报主要有两种技术路线:预先录制语音切片+拼接播放,和在线/离线语音合成(TTS,Text To Speech),两种方案各有优劣,适合不同的场景,我们先把两种方案的特点说清楚,你就能快速选型。

1. 预先录制方案:简单可靠,成本极低

预先录制方案的逻辑非常简单:把你需要播报的内容提前录好声音文件,比如“温度”“二十五”“摄氏度”,每个词汇对应一个音频切片,存放在设备的Flash或者SD卡里面,当需要播报“当前温度二十五摄氏度”的时候,把对应切片按顺序拼起来,依次播放就可以了。

这种方案的优点非常明显:实现简单,不需要复杂的算法,不需要联网,单片机就能做,成本非常低,一个几块钱的语音芯片就能搞定;音质清晰稳定,提前录好的声音效果可以做到非常好,不会有合成语音的机械感。

缺点也很明显:扩展性差,如果需要新增播报内容,就得重新录音重新烧录固件,不能播报任意文本;如果需要播报的内容很多,比如要播报所有数字,音频切片占用的存储空间会变大,不过对于常见的固定场景,几十上百个切片也就几百KB,完全能接受。

适合场景:播报内容固定的场景,比如公交车报站、工业设备告警、小家电状态播报、电子秤播报,这些场景内容都是固定的,只有数字、少数词汇组合,用预先录制方案足够,成本最低,效果最好。

2. 语音合成(TTS)方案:支持任意文本,扩展性强

语音合成方案就是直接把任意文本转换成语音播放,不需要提前录音,只要给文本,就能生成对应的语音,分为在线TTS和离线TTS两种:

在线TTS:把文本发送给云端服务器,服务器合成好语音之后返回来,设备直接播放,优点是合成效果好,不需要设备端有大的算力,缺点是必须联网,没有网络就用不了。

离线TTS:把TTS算法模型放在本地设备上,不需要联网就能直接合成,优点是不依赖网络,响应快,隐私性好,缺点是对设备算力有一定要求,模型占用存储空间大,成本比在线和预制方案高。

TTS方案的优点是支持任意文本播报,想要播报什么直接给文本就行,不需要提前准备音频切片,扩展性极强,适合内容不固定的场景;缺点是合成语音多少会有机械感,离线TTS对硬件要求高,成本也更高。

适合场景:需要播报任意内容的场景,比如智能音箱、导航播报、新闻阅读、物联网设备的自定义告警,这些场景内容不固定,必须用TTS方案。

总结一下选型逻辑:如果你的播报内容固定,优先选预先录制方案,简单便宜效果好;内容不固定,需要支持任意文本,再选TTS方案,能联网选在线TTS,不能联网选离线TTS。

二、嵌入式设备语音播报的常见实现方式

大部分做嵌入式开发的朋友,都是做物联网硬件、智能家居设备,我们说说嵌入式场景最常用的几种实现方式,从低成本到高性能都有:

1. 专用语音播报芯片:低成本方案首选

对于只需要固定内容播报的场景,用专用语音芯片是最省心的,比如常见的WTN5、BY8000、ISD1820这些芯片,几块钱到十几块钱就能买到,直接把提前录好的语音下载到芯片里面,单片机通过UART或者IO口控制芯片播放指定编号的语音,芯片自己集成了DAC放大电路,直接接个喇叭就能出声,不需要额外处理,非常适合新手做项目。

我们以最常用的WTN5系列为例,最简单的接线只需要四根线:VCC接3.3V或者5V,GND接地,TX接单片机的RX,RX接单片机的TX,然后接一个8欧0.5瓦的喇叭就搞定了。控制逻辑也非常简单,只需要发一条指令0xAA 0x01 0x00 0xBB,就能播放编号1的语音,不需要复杂的代码,新手半天就能调通。

这种方案的成本最低,开发最快,适合小家电、电子秤、红外感应门铃这些低端产品,缺点就是不能改内容,要改内容就得重新烧录语音到芯片,适合产品定型之后内容不变的场景。

2. 预制切片+MP3芯片解码:灵活度更高的方案

如果需要播报的内容比较多,或者需要更新语音内容,可以用MP3芯片加存储的方案,比如常见的VS1053、DFPlayer Mini,这些芯片支持解码MP3格式的音频,把提前切好的MP3语音文件存在TF卡或者Flash里面,单片机控制芯片按顺序播放指定文件,就能实现拼接播报。

比如需要播报“123号订单”,只要依次播放“一”“百”“二”“十”“三”“号”“订”“单”对应的MP3文件就可以了。这种方案比专用语音芯片灵活,想要更新语音内容,只需要换TF卡里面的文件就行,不需要重新烧录芯片,而且MP3压缩率高,存储几百个语音切片只需要几MB的空间,成本也很低。

DFPlayer Mini模块十几块钱就能买到,支持串口控制,直接接单片机就能用,还自带功放,不需要额外放大电路,电子爱好者做项目非常方便,很多开源的语音时钟都是用这个方案。

3. 单片机直接播放WAV:极简方案

如果你的单片机资源够,不需要太好的音质,其实可以直接用单片机IO口直接输出PWM,低通滤波之后接喇叭就能播放WAV格式的语音,不需要额外的语音芯片,成本能做到最低。比如STM32F1系列单片机,Flash够大,能存几十秒的语音,直接把WAV文件转成数组放在Flash里面,定时器中断不断输出PWM就能播放,适合对成本非常敏感的小产品。

缺点就是音质一般,占用单片机资源,存储大文件不方便,只适合语音短、成本敏感的场景。

4. 嵌入式离线TTS:任意文本播报方案

如果需要支持任意文本播报,又不能联网,现在很多中高端的MCU已经能跑轻量型离线TTS了,比如百度的PaddleTTS、瑞芯微的离线TTS SDK,还有很多第三方的轻量离线TTS算法,能放在STM32、Apollo3这些MCU上面运行,模型大小几MB到几十MB,就能实现基本的中文语音合成,虽然效果不如云端,但满足普通播报需求足够了。

现在很多AIoT芯片比如ESP32-S3,算力足够跑轻量离线TTS,成本也不高,很多智能门锁、智能开关现在都用离线TTS实现任意内容播报,不需要联网就能用,体验比预制切片好很多。

三、移动APP和PC端语音播报实现方式

如果你是做移动APP或者微信小程序,实现语音播报就更简单了,现在各大平台都有现成的API,直接调用就行:

1. 微信小程序/公众号:现成API直接用

微信小程序本身就提供了内置的TTS APIwx.createInnerAudioContext()配合TTS,或者直接用tts.js第三方库,也可以调用微信云端的TTS接口,生成语音之后直接播放,几行代码就能实现。比如做一个快递查询小程序,查询完成之后直接播报结果,非常简单,不需要自己搭服务器。

2. Android/iOS APP:系统自带TTS引擎

Android和iOS系统本身都自带离线TTS引擎,不需要自己集成,直接调用系统API就能把文本转成语音播放:

Android端用TextToSpeech类,初始化之后直接调用speak()方法就能播报,支持中文,不需要联网,系统自带的语音效果也不错,不需要额外集成模型;

iOS端用AVSpeechSynthesizer类,同样几行代码就能实现,非常方便。

如果需要更好的合成效果,也可以调用百度、阿里、腾讯这些第三方的在线TTS接口,效果比系统自带的更好,只需要联网就行。

3. 网页端:Web Speech API直接用

网页端现在浏览器已经支持标准的Web Speech API,不需要后端,直接用JavaScript就能调用,window.speechSynthesis.speak(new SpeechSynthesisUtterance("你好,欢迎使用语音播报")),一行代码就能实现播报,非常方便,兼容性也很好,主流浏览器都支持。

四、代码实例:嵌入式端实现一个简单的数字语音播报

我们以最常用的51单片机+WTN5语音芯片为例,实现一个简单的温度播报功能,流程非常清晰:

提前准备语音切片:我们需要播报“当前温度”“X十X摄氏度”,提前录制好“当前温度”“零”到“九”“十”“摄氏度”这些语音,依次烧录到WTN5芯片里面,每个语音对应一个编号:1=当前温度,2=零,... 11=十,12=摄氏度。

接线:WTN5的VCC接5V,GND接GND,WTN5的TX接51单片机的RX(P3.0),WTN5的RX接51单片机的TX(P3.1),输出接一个8欧喇叭。

代码逻辑:当我们读取到温度是25摄氏度,需要播报的时候,先发送播放编号1(当前温度),然后拆分温度25为“二十”“五”,分别发送播放编号“二”“十”“五”,最后发送播放编号“摄氏度”,就完成了播报。

核心代码非常简单:

// 发送播放指令给WTN5

void play_voice(uint8_t num) {

uart_send_byte(0xAA); // 帧头

uart_send_byte(0x01); // 播放指令

uart_send_byte(num); // 语音编号

uart_send_byte(0xBB); // 帧尾

}

// 播报温度函数

void broadcast_temp(uint8_t temp) {

uint8_t ten = temp / 10; // 十位

uint8_t one = temp % 10; // 个位

play_voice(1); // 当前温度

delay_ms(500); // 等待播放完前一段

if(ten > 0) {

play_voice(2 + ten); // 十位数字

delay_ms(500);

play_voice(11); // 十

delay_ms(500);

}

if(one > 0 || (ten == 0 && one == 0)) {

play_voice(2 + one); // 个位数字

delay_ms(500);

}

play_voice(12); // 摄氏度

}

调用broadcast_temp(25)就能自动播报“当前温度二十五摄氏度”,逻辑非常简单,新手也能看懂。

如果用ESP32加在线TTS,代码更简单,只要把文本发给百度TTS接口,拿到音频数据,用I2S播放就行了,不到一百行代码就能实现任意文本播报。

五、开发语音播报常见问题与优化技巧

开发语音播报功能,经常遇到一些小问题,我们整理了几个常见问题和解决方法:

1. 拼接播报不流畅,有停顿感

预先录制切片拼接的时候,每个切片之间停顿太长就会不流畅,解决方法:第一,录音的时候每个切片不要留多余的空白在开头和结尾,用音频编辑软件剪掉空白;第二,控制芯片播放的时候,前一个播放完立刻启动下一个,不要加太长的延时,根据切片长度调整延时,就能让播报更流畅。如果要求高,也可以把多个切片提前拼成一个完整的音频再播放,效果更好。

2. 声音小、有杂音

很多新手接喇叭之后声音很小,还有杂音,大部分是因为没有功放或者阻抗不匹配:语音芯片一般都自带集成功放,只要接对应阻抗的喇叭就行,一般是8欧0.5瓦,不要接4欧或者16欧的,会导致声音小或者烧芯片;如果用单片机PWM输出,一定要加低通滤波把PWM的高频载波滤掉,否则会有明显的高频杂音。

3. 离线TTS占用空间太大

很多嵌入式设备Flash空间不够,放不了大的TTS模型,可以用参数裁剪的轻量模型,现在很多第三方TTS都提供裁剪版,几MB就能实现中文合成,满足普通播报需求足够;也可以用混合方案:常用词汇用预制切片,生僻词用TTS合成,平衡空间和效果。

4. 在线TTS延迟高

在线TTS需要联网传输文本和音频,会有几百毫秒到几秒的延迟,如果对延迟要求高,可以用流式TTS,边合成边播放,能大幅降低启动延迟;或者把常用内容存在本地缓存,需要播报的时候直接读本地缓存,不用每次请求云端。

语音播报不是什么复杂的黑科技,现在已经有非常成熟的方案,从几块钱的语音芯片到免费的云端TTS接口,不同需求都能找到对应的实现方式,核心就是选对方案:内容固定选预制,低成本开发快;内容不固定选TTS,能联网选在线,不能联网选离线,按照这个逻辑选,基本不会错。

对于新手来说,可以先从语音芯片方案入门,几块钱买个模块,半天就能做出一个能播报的温度时钟,快速上手理解整个流程,再慢慢尝试更复杂的TTS方案。现在语音合成技术越来越成熟,离线TTS的效果也越来越好,成本越来越低,未来会有更多的设备用上语音播报,让人机交互更方便。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

随着汽车成为人们日常生活中越来越重要的工具,用户需要安全、舒适、更智能的驾驶体验,智能驾驶舱的概念也逐渐出现。智能驾驶舱旨在通过支持包括语音和操作手势在内的多模式交互,尽可能提高用户体验和驾驶便利性。语音在现阶段的智能座...

关键字: 语音 车载语音

语音识别技术是一种人工智能领域的技术,它能够将人类的声音信号转化为文字。语音识别系统主要包括三个主要部分:预处理、特征提取和模式匹配。

关键字: 语音 语音识别

随着人工智能技术的快速发展,语音识别作为其中的一项重要技术,正逐渐在各个领域展现出巨大的潜力和应用前景。语音识别技术能够将人类的语音信息转换为文本,为智能家居、智能助手等领域带来了智能化、便捷化的体验。

关键字: 人工智能 语音 语音识别

语音芯片里语音识别系统被应用在更多需要代替人工服务或者识别指令的机器人中,实现更多的人机交互,在生活中带来更多的便利。语音识别系统的分类和结构跟otp语音芯片系统比起来也有所不同。

关键字: 语音识别 信号处理 语音

语音识别主要可以分为孤立词识别、连接词识别、连续语音识别、特定人语音识别和非特定人语音识别等几类。

关键字: 语音识别 语音 AI

人工智能语音识别技术,在现代社会中已开始广泛运用。这种先进技术使得人们可以通过声音指令控制家电、灯光、温度等物品。

关键字: 语音识别 人工智能 语音

信号处理:这是语音识别的基础,涉及将原始语音信号转换成可用于分析和识别的形式。模式识别:通过建立语音模式库,将输入的语音与已知的模式进行匹配,以实现语音识别。

关键字: 语音识别 信号处理 语音

语音识别相信大家并不陌生,近些年来语音识别技术的应用层出不穷,同时也更加智能。

关键字: 语音识别 语音 AI

未知语音经过话筒变换成电信号后加在识别系统的输入端,首先经过预处理,再根据人的语音特点建立语音模型,对输入的语音信号进行分析。

关键字: 语音识别 语音 模型

大多数紧急事件的发生具有时间不确定性从而造成应急通信也具有时间不确定性,使人们无法预知什么时候需要应急通信。

关键字: 应急通信 语音 图像
关闭