用EKHO-9.0来实现TTS功能

想要在嵌入式linux中,来实现文本转语音的功能,因手上没实际的嵌入式linux,故只能用前一篇所说的buildroot来构建一个类似嵌入式linux的PC端的迷你linux,实现方法完全使用嵌入式linux相同的方法。

ekho即余音,是开源的TTS软件,这是传统的TTS软件,发音机械,但对中文支持很好,让它读古诗文,读现代小说,均能正确断句,发音清晰,还支持男声,女声可选。piper是另一款TTS软件,基于AI发声,发声自然,但可惜对中文支持不好,在断句时经常比现断句错误。另外就是国内的老牌厂商讯飞提供的商用版TTS,发声自然,几乎和真人无异。还有字节跳动提供的AI加成的Seed-TTS,那发音效果有目共睹。可惜这些都是收费的。目前,免费的可用于嵌入式linux的,基本就只有ekho了。

以前移植过EKHO-8.7,这次想用EKHO-9.0在实现TTS功能。

之前有用基于musl的Alpine来编译,最终失败,放弃。这次用glibc来编译,查询了豆包,这次豆包表现的很好。在它指引下,一步步的均顺利完成。

记录一下全过程

交叉工具链绝对路径

CROSS_GCC=/opt/x86_64-buildroot-linux-gnu_sdk-buildroot/bin/x86_64-buildroot-linux-gnu-gcc

CROSS_GXX=/opt/x86_64-buildroot-linux-gnu_sdk-buildroot/bin/x86_64-buildroot-linux-gnu-g++

HOST_TRIPLE=x86_64-buildroot-linux-gnu

依赖库统一安装目录(编译用头文件/库,不要删)

DEP_PREFIX=/home/lij/ekho_build/_dep_install

ekho最终打包输出目录(可删除重生成)

EKHO_PREFIX=/home/lij/ekho_build/_ekho_install

源码根目录

BUILD_ROOT=/home/lij/ekho_build

mkdir -p ${DEP_PREFIX}

步骤 1:编译 libsndfile(libsndfile-1.2.2.tar.xz)

bash

运行

cd ${BUILD_ROOT}/libsndfile-1.2.2

./configure \

CC=${CROSS_GCC} \

CXX=${CROSS_GXX} \

--host=${HOST_TRIPLE} \

--prefix=${DEP_PREFIX}

make -j$(nproc)

make install

步骤2 : 编译sonic(sonic_0.2.0.orig.tar.gz)

CROSS_GCC=/opt/x86_64-buildroot-linux-gnu_sdk-buildroot/bin/x86_64-buildroot-linux-gnu-gcc

DEP_PREFIX=/home/lij/ekho_build/_dep_install

make CC={CROSS_GCC} PREFIX={DEP_PREFIX}

make install PREFIX=${DEP_PREFIX}

步骤3:编译 espeak-ng(espeak-ng-1.51.tar.xz)

设环境变量

CROSS_GCC=/opt/x86_64-buildroot-linux-gnu_sdk-buildroot/bin/x86_64-buildroot-linux-gnu-gcc

CROSS_GXX=/opt/x86_64-buildroot-linux-gnu_sdk-buildroot/bin/x86_64-buildroot-linux-gnu-g++

HOST_TRIPLE=x86_64-buildroot-linux-gnu

DEP_PREFIX=/home/lij/ekho_build/_dep_install

./configure \

CC=${CROSS_GCC} \

CXX=${CROSS_GXX} \

--host=${HOST_TRIPLE} \

--prefix=${DEP_PREFIX}

make -j$(nproc)

make install

步骤4.编译opencc(opencc-1.1.9.tar.gz)

CROSS_GCC=/opt/x86_64-buildroot-linux-gnu_sdk-buildroot/bin/x86_64-buildroot-linux-gnu-gcc

CROSS_GXX=/opt/x86_64-buildroot-linux-gnu_sdk-buildroot/bin/x86_64-buildroot-linux-gnu-g++

HOST_TRIPLE=x86_64-buildroot-linux-gnu

DEP_PREFIX=/home/lij/ekho_build/_dep_install

cmake -DCMAKE_INSTALL_PREFIX=${DEP_PREFIX} \

-DCMAKE_C_COMPILER=${CROSS_GCC} \

-DCMAKE_CXX_COMPILER=${CROSS_GXX} \

-DCMAKE_SYSTEM_NAME=Linux \

-DCMAKE_SYSTEM_PROCESSOR=x86_64 \

-DBUILD_SHARED_LIBS=ON \

-DBUILD_TESTING=OFF

make -j$(nproc)

make install

步骤5:使用uftcpp(utfcpp-3.2.4)

UTF-8 汉字字符串分割、文本遍历,是中文断句、数字 / 字母识别的底层依赖,不需编译,ekho真接调用源码

创建头文件存放目录

mkdir -p ${_dep_install}/include/utfcpp

复制全部头文件

cp utf8.h ${_dep_install}/include/utfcpp/

cp -r utf8 ${_dep_install}/include/utfcpp/

6.编ekho 9.0

cd /home/lij/ekho_build/ekho-9.0

cp ../utfcpp-3.2.4/source/utf8.h src/

cp -r ../utfcpp-3.2.4/source/utf8 src/

export CROSS_GCC=/opt/x86_64-buildroot-linux-gnu_sdk-buildroot/bin/x86_64-buildroot-linux-gnu-gcc

export CROSS_GXX=/opt/x86_64-buildroot-linux-gnu_sdk-buildroot/bin/x86_64-buildroot-linux-gnu-g++

export HOST_TRIPLE=x86_64-buildroot-linux-gnu

export DEP_PREFIX=/home/lij/ekho_build/_dep_install

export EKHO_PREFIX=/home/lij/ekho_build/_ekho_install

让编译器优先读取交叉编译的头文件与库

export PKG_CONFIG_PATH=${DEP_PREFIX}/lib/pkgconfig

export CFLAGS="-I${DEP_PREFIX}/include"

export CXXFLAGS="-I${DEP_PREFIX}/include"

export LDFLAGS="-L${DEP_PREFIX}/lib"

./configure \

CC=${CROSS_GCC} \

CXX=${CROSS_GXX} \

--host=${HOST_TRIPLE} \

--prefix=${EKHO_PREFIX} \

--without-libpinyin \

--without-pulseaudio

make -j$(nproc)

make install

编译好的ekho安装到开发板上

我是利用nfs挂载的方法来安装的

先是宿主机的操作

把生成的ekho相同的东西拷贝

cp -r /home/lij/ekho_build/_ekho_install/bin /home/nfs/

cp -r /home/lij/ekho_build/_ekho_install/share /home/nfs/

将生成的依赖库拷贝

cp -r /home/lij/ekho_build/_dep_install/lib /home/nfs/

复制 espeak-ng 音色数据(解决 phontab 缺失报错)

cp -r /home/lij/ekho_build/_dep_install/share/espeak-ng-data /home/nfs/share/

在开发板上的操作

挂载nfs到/mnt上。

复制可执行程序

cp -r /mnt/bin/* /usr/bin/

复制所有动态依赖库

cp -r /mnt/lib/* /usr/lib/

复制ekho拼音词典 + espeak音色文件

cp -r /mnt/share/* /usr/share/

配置开机自动加载环境变量(永久生效)

echo "export LD_LIBRARY_PATH=/usr/lib" >> /etc/profile

echo "export EKHO_DATA_PATH=/usr/share/ekho-data" >> /etc/profile

echo "export ESPEAK_DATA_PATH=/usr/share/espeak-ng-data" >> /etc/profile

echo 'amixer sset Master 127 unmute' >> /etc/profile

echo 'amixer sset "Auto-Mute Mode" Disabled' >> /etc/profile

立即加载,无需重启,测试用的。以后就不用了

source /etc/profile

这里,如一切正常用ekho生成语音吧

ekho "葡萄美酒夜光杯,欲饮琵琶马上催。醉卧沙场君莫笑,古来征战几人回。" -o poem.wav

再直接执行aplay poem.wav即可听到那机械的美妙声音。

注:在构建成功buildroot后,在buildroot的源目录下,执行make sdk,即可在/output/images下看到生成了一个压缩包。我是把这个压缩包解压到了/opt下。并没有设置系统环境变量,所以在编译ekho时,都是直接写绝对路径的。实际上,我还顺便在buildroot的宿主机,vbox的ubuntu上,安装一个qt5.14,利用它的给提供了一个标准C++的编写和编译软件,QT5的Qtcreator真是一个编写标准C++程序的利器。

在这里,为方便大家,我把宿主机的镜像(ubuntu_24_04_VBox.rar)和buildroot迷你linux的镜像(Buildroot-x86_64.rar)放到网盘上,方便大家使用参考,另外,我把编译ekho所需的源码全部打包(有部分源码没用到),也放在网盘上,供大家下载。

链接: https://pan.baidu.com/s/1bu4s1kC2EwcseEJQCGCyyw 提取码: 1234

nfs 挂载命令。用ssh登录后,或在终端中输入mount -t nfs 192.168.1.113:/home/nfs /mnt -o nolock

相关推荐
滴水之功1 个月前
Yocto 编译 Raspberry Pi 4B
yocto·嵌入式linux
螺丝钉的扭矩一瞬间产生高能蛋白2 个月前
QT的C++接口基础用法
c++·qt·嵌入式软件·嵌入式linux·linux应用
Bruce_kaizy2 个月前
c++ linux环境编程——从应用层到linux内核深入了解文件io的调用机制(爆肝)
linux·c++·c·嵌入式linux·文件io
Joseph Cooper2 个月前
Linux Power Management 子系统:从 suspend/resume 到 Runtime PM、PM QoS
linux·驱动开发·linux kernel·嵌入式linux·电源管理
Z文的博客2 个月前
【避坑实录】Qt 4.8.6 + Paho MQTT C客户端 + OpenSSL静态链接的血泪史
c语言·开发语言·qt·嵌入式linux
charlie1145141913 个月前
嵌入式Linux模块学习——insmod 底层全流程解剖:从用户命令到内核内存
linux·c·嵌入式linux
Z文的博客3 个月前
嵌入式 ARM 设备交叉编译 mosquitto 2.0.20 (完整 TLS 支持) 详细教程 TRAE全程辅助,没敲一行代码
qt·mqtt·嵌入式·ai编程·mosquitto·嵌入式linux·trae
三万棵雪松3 个月前
【Linux 物联网网关主控系统-Web部分(四)】
linux·前端·物联网·嵌入式linux
三万棵雪松3 个月前
【Linux 物联网网关主控系统-Web部分(一)】
linux·前端·嵌入式linux