想要在嵌入式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