1. 缘起:为什么想让开发板开口说话
这篇文章将记录我让 Linux 开发板张口说话的全过程。此片文章是从宿舍桌面助手:从立项到完成的全过程学习记录-CSDN博客引申而来的,专门单开一篇用于记录测试语音播报功能从零开始的实践。
本文会从硬件准备、系统配置、语音合成方案选型,到最终跑通语音播报的完整链路,一步步还原我的实践过程,希望能给同样想折腾的朋友一些参考。
2. 硬件与系统准备
在开始之前,先交代一下我使用的硬件环境:
- 开发板:正点原子I.MX6UL-MINI。
出厂系统:基于Yocto项目构建的Freescale i.MX Release Distro 4.1.15-2.1.0。
这是一个为嵌入式设备高度定制的精简系统,因此没有
apt包管理器,也未预装gcc等开发工具。内核版本:Linux 4.1.15-g3dc0a4b。
架构:armv7l。
- 外设:USB声卡一个,小音箱一个
- 软件:MobaXterm操控终端(用其他串口助手也可以,只要能发命令就行),Ubuntu
3. 第一步:确认音频设备可用
让开发板开口说话的第一步,不是写代码,而是先确认音频输出通路是通的。我通过系统命令检查声卡状态,确认 USB 声卡是否被正确识别。
如图用声卡连接好小音箱和开发板
连接好串口,电源,用MobaXterm打开终端(可参考我的嵌入式 Linux 以太网学习笔记:从驱动到应用-CSDN博客)
上电,等待系统初始化完成
在终端中运行以下命令
cat /proc/asound/cards得到如图结果
这代表识别到了一个设备,序号是0,也可能是1,2,3等
如果能看到声卡设备输出,说明声卡驱动已经正常加载。接着用一条简单的命令测试喇叭是否出声。
测试前可以先运行命令alsamixer,查看音量,得到下图,可以按F6选择声卡设备再用方向键调节音量大小,改好后按ESC即可退出
执行代码以测试音频设备,运行后会听到“前,左,前,右”的英文,且得到下图结果
speaker-test -t wav -c 2 -r 48000 -D plughw:0,0 -l 1听到提示音,说明音频通路没问题,可以进入下一步。
4. 第二步:选择语音合成方案
音频通路打通后,接下来要解决的是「说什么」和「怎么说」的问题。我对比了几种常见的语音合成方案:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| espeak-ng | 体积小、离线可用、CPU 占用低 | 音质机械感强,中文效果一般 | 资源受限的嵌入式设备 |
| pico2wave | 离线、音质比 espeak 自然 | 中文支持有限,依赖特定库 | 需要离线播报的简单场景 |
| 云端 TTS(如百度、讯飞) | 音质自然、支持多种音色 | 需要联网、有延迟和费用 | 网络条件好的应用 |
考虑到开发板资源有限,且我希望完全离线运行,最终选择了espeak-ng作为主力方案。它足够轻量,在 I.MX6UL 这种主频不高的芯片上也能流畅运行。
首先在本机win系统上下好espeak的压缩包,也可直接在Ubuntu上下,我这Ubuntu不好访问GitHub就从win上下载了,地址是https://github.com/espeak-ng/espeak-ng/archive/refs/tags/1.51.1.tar.gz,也可留言私发,随后从win上传输给Ubuntu,我这直接从任务管理器里拖过去了,不管什么方法只要Ubuntu上能识别到即可
运行以下代码解压并进入解压后目录
cd ~/espeak-build tar -xzf espeak-ng-1.51.1.tar.gz cd espeak-ng-1.51.15. 第三步:交叉编译与移植
先准备必要的编译工具,
sudo apt update sudo apt install -y autoconf automake libtool pkg-config \ gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf配置交叉编译
./autogen.sh ./configure --host=arm-linux-gnueabihf --prefix=/usr \ --without-mbrola --without-sonic \ --with-pcaudiolib=no运行make -j4进行编译
打包编译好的文件
# 创建打包目录 mkdir -p ~/espeak-package/usr/bin mkdir -p ~/espeak-package/usr/share # 复制可执行文件和语音数据 cp src/espeak-ng ~/espeak-package/usr/bin/ cp -r espeak-ng-data/ ~/espeak-package/usr/share/ # 压缩打包 cd ~ tar -czf espeak-package.tar.gz espeak-package/使用网线连接开发板使用SSH连接开发板以查看目录,详见嵌入式 Linux 以太网学习笔记:从驱动到应用-CSDN博客
通过文件管理器将打包好的文件拖到root目录下
在终端中执行代码
# 进入根目录,因为我们的包解压后结构是 usr/bin 和 usr/share,需要放到 / 下 cd / tar -xzf ~/espeak-package.tar.gz解压后文件在同级目录下需要将espeak-ng放到指定目录下
如果路径与我的文件一样则可直接执行以下代码
# 复制可执行文件到 /usr/bin cp /home/root/espeak-package/usr/bin/espeak-ng /usr/bin/ # 复制语音数据到 /usr/share cp -r /home/root/espeak-package/usr/share/espeak-ng-data /usr/share/ # 添加执行权限 chmod +x /usr/bin/espeak-ng此时espeak-ng程序会被解压到/usr/bin/,数据文件到/usr/share/espeak-ng-data/
接下来就可以开始测试了,可以执行以下代码
espeak-ng -v zh "你好,开发板" --stdout | aplay -D plughw:0,0系统烧录完成后,在开发板上验证 espeak-ng 是否可用,测试中文播报效果。
如果喇叭里传出「你好,我是你的开发板」,恭喜,开发板已经成功开口说话了。
6. 第四步:用 Python 封装语音播报
7. 进阶:结合传感器做语音告警
8. 踩坑记录与注意事项
整个过程中我也遇到了一些问题,这里记录下来供大家参考: