rv1109&rv1126移植sherpa-onnx 实现TTS功能
主要问题是rv1126&1109使用的gcc是gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf ,
不支持c++-14,使用arm的交叉编译工具包编译出来的可执行程序由于gcc版本不一致,不能运行,针对这个问题的解决方法,
是在高版本的arm-gcc上编译,然后运行在低版本gcc编译的系统上;
1、下载gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz
wget -q https://huggingface.co/csukuangfj/sherpa-ncnn-toolchains/resolve/main/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz # For users from China # 中国国内用户,如果访问不了 huggingface, 请使用 # wget -q https://hf-mirror.com/csukuangfj/sherpa-ncnn-toolchains/resolve/main/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz
tar xf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz
2、修改build-arm-linux-gnueabihf.sh 脚本;
直接在根路径下创建三个链接文件到gcc-arm-10.3-2021.07-x86_64-arm-none-linux-
alientek@ubuntu:~/rv1106/sherpa-onnx$ ls -l arm-linux-gnueabihf-* lrwxrwxrwx 1 alientek alientek 114 4月 9 11:14 arm-linux-gnueabihf-ar -> /home/alientek/rv1106/arm_gcc/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-ar lrwxrwxrwx 1 alientek alientek 115 4月 9 11:11 arm-linux-gnueabihf-g++ -> /home/alientek/rv1106/arm_gcc/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++ lrwxrwxrwx 1 alientek alientek 115 4月 9 11:11 arm-linux-gnueabihf-gcc -> /home/alientek/rv1106/arm_gcc/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc alientek@ubuntu:~/rv1106/sherpa-onnx$
删除build-arm-linux-gnueabihf.sh 脚本中搜索arm-linux-gnueabihf-gcc的部分脚本;
set -ex export PATH=$PWD:$PATH dir=build-arm-linux-gnueabihf mkdir -p $dir cd $dir
3、修改toolchain/arm-linux-gnueabihf.toolchain.cmake 脚本,指定可执行程序运行加载的gcc-lib库路径。
set(CMAKE_C_FLAGS "-Wl,-rpath='/my/lib',-dynamic-linker='/my/lib/ld-linux.so.2' -march=armv7-a -mfloat-abi=hard -mfpu=neon") set(CMAKE_CXX_FLAGS "-Wl,-rpath='/my/lib',-dynamic-linker='/my/lib/ld-linux.so.2' -march=armv7-a -mfloat-abi=hard -mfpu=neon")
rpath
全名run-time search path,是elf文件中一个字段,它指定了可执行文件执行时搜索so文件的第一优先位置,
一般编译器默认将该字段设为空。elf文件中还有一个类似的字段runpath,其作用与rpath类似,但搜索优先级稍低。
搜索优先级:
rpath > LD_LIBRARY_PATH > runpath > ldconfig缓存 > 默认的/lib,/usr/lib等
参考:https://blog.csdn.net/bandaoyu/article/details/121476940
4、将可执行程序拷贝到1109开发板上;
(1)、将gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/lib
和gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/lib底下的so文件
打包拷贝到开发板的/my/lib路径;
为了简单,将/my/lib修改为777的权限,chmod 777 /my/lib -R ,否则执行sherpa-onnx-offline-tts会报Permission denied。
(2)、将sherpa-onnx-offline-tts也拷贝到开发板上。
5、下载模型,运行
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/vits-icefall-zh-aishell3.tar.bz2
tar xvf vits-icefall-zh-aishell3.tar.bz2
rm vits-icefall-zh-aishell3.tar.bz2
[root@owlvtech:~/rv_1126_ncnn]# ./sherpa-onnx-offline-tts \ > --vits-model=./vits-icefall-zh-aishell3/model.onnx \ > --vits-lexicon=./vits-icefall-zh-aishell3/lexicon.txt \ > --vits-tokens=./vits-icefall-zh-aishell3/tokens.txt \ > --tts-rule-fsts=./vits-icefall-zh-aishell3/phone.fst,./vits-icefall-zh-aishe \ > --sid=10 \ > --output-filename=./rule-10-0.wav \ > "WIFI配置完成" /home/alientek/rv1106/sherpa-onnx/sherpa-onnx/csrc/parse-options.cc:Read:361 ./szh-aishell3/model.onnx --vits-lexicon=./vits-icefall-zh-aishell3/lexicon.txt --vtts-rule-fsts=./vits-icefall-zh-aishell3/phone.fst,./vits-icefall-zh-aishell3/da10 --output-filename=./rule-10-0.wav 'WIFI配置完成' /home/alientek/rv1106/sherpa-onnx/sherpa-onnx/csrc/lexicon.cc:ConvertTextToToken sample=15104, progress=1.000000 Elapsed seconds: 5.777 s Audio duration: 1.888 s Real-time factor (RTF): 5.777/1.888 = 3.060 The text is: WIFI配置完成. Speaker ID: 10 Saved to ./rule-10-0.wav successfully!
在rv1106上运行sherpa-onnx-offline-tts时,会提示not found.需要将toolchain的CFLAG增加一个static属性,这样子就能运行了。
# ./sherpa-onnx-offline-tts \ > --vits-model=/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/mod el.onnx \ > --vits-lexicon=/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/l exicon.txt \ > --vits-tokens=/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/to kens.txt \ > --tts-rule-fsts=/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/ phone.fst,/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/date.fst,/ nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/number.fst \ > --sid=10 \ > --output-filename=./rule-10-0.wav \ > "配置完成" /home/alientek/rv1106/sherpa-onnx/sherpa-onnx/csrc/parse-options.cc:Read:361 ./sherpa-onnx-offline-tts --vits-model=/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/model.onnx --vits-lexicon=/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/lexicon.txt --vits-tokens=/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/tokens.txt --tts-rule-fsts=/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/phone.fst,/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/date.fst,/nfs/app_rv1106/sherpa-ncnn/rv1126/vits-icefall-zh-aishell3/number.fst --sid=10 --output-filename=./rule-10-0.wav '配置完成' Error in cpuinfo: failed to parse file /sys/devices/system/cpu/kernel_max: "-1 " is not an unsigned number sample=15616, progress=1.000000 Elapsed seconds: 6.913 s Audio duration: 1.952 s Real-time factor (RTF): 6.913/1.952 = 3.541 The text is: 配置完成. Speaker ID: 10 Saved to ./rule-10-0.wav successfully! #
其他问题汇总:
1、在Linux上执行程序遇到Permission denied的解决办法
出现这个问题的原因是由于权限不够。解决办法就是改变可执行文件的权限。
对于单个的可执行文件使用命令:chmod 777 file-name
若需要将一个目录下的所有可执行文件的权限都升级,可使用命令:chmod -R 777 directory-name
2、libtest.a: could not read symbols: Archive has no index; run ranlib to add one的原因和解决方案
涉及到多个.a文件合并为一个.a的处理。
.a 文件的结构和.tar文件就没有什么区别。 x 命令解出来, a 命令添加, t命令列表
假设A.a, B.a C.a 在/usr/local/lib目录下
mkdir /tmp/libABC
cd /tmp/libABC
ar x /usr/local/lib/A.a
ar x /usr/local/lib/B.a
ar x /usr/local/lib/C.a
ar cru libABC.a *.o
ranlib libABC.a
3、#tar zxvf /bbs.tar.zip -C /zzz/bbs
//把根目录下的bbs.tar.zip解压到/zzz/bbs下,前提要保证存在/zzz/bbs这个目录
这个和cp命令有点不同,cp命令如果不存在这个目录就会自动创建这个目录!
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com