rv1106&rv1109&rv1126移植sherpa-onnx 实现离线TTS功能

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命令如果不存在这个目录就会自动创建这个目录!

呱牛笔记



本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com

请先登录后发表评论
  • 最新评论
  • 总共0条评论