PaddleSpeech的TTSAndroid编译armv7版本

1.下载docker镜像

docker pull paddlepaddle/paddle-lite:2.0.0_beta

2.克隆代码

git clone https://github.com/PaddlePaddle/Paddle-Lite.git

3.运行容器

docker run -it --name paddlelite_docker  -v $PWD/Paddle-Lite:/Paddle-Lite  --net=host paddlepaddle/paddle-lite /bin/bash

4.编译opt工具

cd Paddle-Lite
./lite/tools/build.sh build_optimize_tool --with_extra=ON

5.下载模型

https://paddlespeech.bj.bcebos.com/Parakeet/released_models/fastspeech2/fastspeech2_cnndecoder_csmsc_static_1.0.0.ziphttps://paddlespeech.bj.bcebos.com/Parakeet/released_models/mb_melgan/mb_melgan_csmsc_static_0.1.1.zip

mb_melgan_csmsc_static_0.1.1.zip

fastspeech2_cnndecoder_csmsc_static_1.0.0.zip

6.模型转换

cd /Paddle-Lite/build.opt/lite/api
./opt --model_file=/Paddle-Lite/models/fastspeech2_cnndecoder_csmsc_static_1.0.0/fastspeech2_csmsc.pdmodel --param_file=/Paddle-Lite/models/fastspeech2_cnndecoder_csmsc_static_1.0.0/fastspeech2_csmsc.pdiparams --valid_targets=arm --optimize_out_type=naive_buffer --optimize_out=/Paddle-Lite/models/fastspeech2_csmsc_arm --quant_model=true --quant_type=QUANT_INT8 ./opt --model_file=/Paddle-Lite/models/mb_melgan_csmsc_static_0.1.1/mb_melgan_csmsc.pdmodel --param_file=/Paddle-Lite/models/mb_melgan_csmsc_static_0.1.1/mb_melgan_csmsc.pdiparams --valid_targets=arm --optimize_out_type=naive_buffer --optimize_out=/Paddle-Lite/models/mb_melgan_csmsc_arm --quant_model=true --quant_type=QUANT_INT8

mb_melgan_csmsc_arm.nb

fastspeech2_csmsc_arm.nb

7.编译预测动态库

a.修改代码Paddle-Lite/lite/kernels/arm/slice_compute.cc

inline std::vector<int64_t> get_new_data_from_tensorlist(const std::vector<lite::Tensor*>& list_new_data_tensor) {// get tensorstd::vector<int64_t> vec_new_data;for (size_t i = 0; i < list_new_data_tensor.size(); ++i) {auto tensor = list_new_data_tensor[i];LOG(WARNING) <<" tensor dims is :"<<tensor->dims();// CHECK_EQ(tensor->dims(), DDim({1})) << "shape of dim tensor should be [1]";if (tensor->precision() == PrecisionType::kInt32) {vec_new_data.push_back(static_cast<int64_t>(*tensor->data<int32_t>()));} else if (tensor->precision() == PrecisionType::kInt64) {vec_new_data.push_back(static_cast<int64_t>(*tensor->data<int64_t>()));} else {vec_new_data.push_back(static_cast<int64_t>(*tensor->data<int32_t>()));LOG(WARNING) << "slice StartsTensor or EndsTensor :The dtype of Tensor ""must be int32 ""or int64";}}return vec_new_data;
}

b.修改Paddle-Lite/lite/api/android/jni/native/tensor_jni.h,新增声明

/** Class:     com_baidu_paddle_lite_Tensor* Method:    nativeSetData* Signature: ([J)Z*/
JNIEXPORT jboolean JNICALL Java_com_baidu_paddle_lite_Tensor_nativeSetData___3J(JNIEnv *, jobject, jlongArray);

c.修改Paddle-Lite/lite/api/android/jni/native/tensor_jni.cc,新增实现

JNIEXPORT jboolean JNICALL Java_com_baidu_paddle_lite_Tensor_nativeSetData___3J(JNIEnv *env, jobject jtensor, jlongArray buf) {std::unique_ptr<Tensor> *tensor = get_writable_tensor_pointer(env, jtensor);if (tensor == nullptr || (*tensor == nullptr)) {return JNI_FALSE;}int64_t buf_size = (int64_t)env->GetArrayLength(buf);if (buf_size != product((*tensor)->shape())) {return JNI_FALSE;}int64_t *input = (*tensor)->mutable_data<int64_t>();env->GetLongArrayRegion(buf, 0, buf_size, input);return JNI_TRUE;
}

d.编译脚本

./lite/tools/build_android.sh --arch=armv7 --toolchain=gcc --android_stl=c++_static --with_java=ON --with_extra=ON

e.编译产物

libpaddle_lite_jni.so

8.调整Android工程代码

a.修改D:\02Code\code\PaddleSpeech-r1.4.1\demos\TTSAndroid\app\build.gradle

import java.security.MessageDigestapply plugin: 'com.android.application'android {compileSdkVersion 28defaultConfig {applicationId "com.baidu.paddle.lite.demo.tts"minSdkVersion 15targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"ndk {abiFilters 'armeabi-v7a'//, 'arm64-v8a'}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}dependencies {implementation fileTree(include: ['*.jar'], dir: 'libs')implementation 'com.android.support:appcompat-v7:28.0.0'implementation 'com.android.support.constraint:constraint-layout:1.1.3'implementation 'com.android.support:design:28.0.0'testImplementation 'junit:junit:4.12'androidTestImplementation 'com.android.support.test:runner:1.0.2'androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'implementation files('libs/PaddlePredictor.jar')
}

b.修改com/baidu/paddle/lite/demo/tts/Predictor.java及对应的调用地方,主要是数据类型由float改为long

public boolean runModel(long[] phones) {if (!isLoaded()) {return false;}Date start = new Date();Tensor am_output_handle = getAMOutput(phones, AMPredictor);wav = getVOCOutput(am_output_handle, VOCPredictor);Date end = new Date();inferenceTime = (end.getTime() - start.getTime());Log.d(TAG, "runModel: "+inferenceTime+"ms");return true;
}public Tensor getAMOutput(long[] phones, PaddlePredictor am_predictor) {Tensor phones_handle = am_predictor.getInput(0);long[] dims = {phones.length};phones_handle.resize(dims);phones_handle.setData(phones);am_predictor.run();Tensor am_output_handle = am_predictor.getOutput(0);// [?, 80]// long outputShape[] = am_output_handle.shape();float[] am_output_data = am_output_handle.getFloatData();return am_output_handle;}

c.工程结构
在这里插入图片描述
在这里插入图片描述

ndk需要于docker镜像一致,采用17.2
在这里插入图片描述

d.编译产出

TTSAndroid.apk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISP去噪(1)

#灵感# 因为理解的2DNR、3DNR 和当前调试平台标注的2DNR、3DNR 作用有很大差异&#xff0c;所以在网上广撒网&#xff0c;搜集知识。 目前收集出来一个这样的文章&#xff0c;有点像大学生的论文“取其精华&#xff0c;合成糟粕”。------权当一个记录册 目录 运动阈值&…

【华为鸿蒙系统学习】- HarmonyOS4.0开发工具和环境配置问题总结|自学篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 官方链接 HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 安装教程 &#xff08;…

[GFCTF 2021]文件查看器

文章目录 前置知识可调用对象数组对方法的调用GC回收机制phar修改签名 解题步骤 前置知识 可调用对象数组对方法的调用 我们先来看下面源码 <?phperror_reporting(0);class User{public $username;public $password;public function check(){if($this->username"…

flutter的ListView和SingleChildScrollView有什么区别?他们的使用场景有什么不一样?

文章目录 简介ListViewSingleChildScrollView使用场景的不同 简介 ListView和SingleChildScrollView都是在Flutter中用于处理滚动内容的组件&#xff0c;但它们有一些关键的区别。 ListView 多个子元素&#xff1a; ListView是一个滚动的可滚动组件&#xff0c;通常用于包含多…

接口管理——Swagger

Swagger是一个用于设计、构建和文档化API的工具集。它包括一系列工具&#xff0c;如Swagger Editor&#xff08;用于编辑Swagger规范&#xff09;、Swagger UI&#xff08;用于可视化API文档&#xff09;和Swagger Codegen&#xff08;用于根据API定义生成客户端库、server stu…

Web安全之XXE漏洞原理及实践学习

一、原理&#xff1a; XXE漏洞全称即XML外部实体注入漏洞。 攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)&#xff0c;导致可加载恶意外部文件&#xff0c;利用file协议造成文件读取、命令执行、内网端口扫描、攻击内网网站等…

第二百零三回 修改组件风格的另外一种方法

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了WebView组件相关的内容&#xff0c;本章回中将介绍如何在图标旁边添加小红点.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 在实际项目中有时候需要在图标旁边显示小红点&#xff0c;而且小红点内还有数…

云原生 | Docker 和容器技术的核心概念及应用实践

在当今快速发展的软件行业中&#xff0c;Docker 和容器技术已成为必不可少的工具。它们为应用的打包、分发和运行提供了革命性的方法。本文旨在深入解析 Docker 和容器技术的核心概念、工作原理及应用实践&#xff0c;为开发者提供全面的指南和实用示例。 容器技术概述 什么是…

OCRmyPDF让你能搜索扫描版PDF文档

什么是 OCRmyPDF &#xff1f; PDF 是存储和交换扫描文档的最佳格式。不幸的是&#xff0c;PDF 可能很难修改。OCRmyPDF 是一个 Python 应用程序和库&#xff0c;可以轻松地将图像处理和 OCR&#xff08;可识别、可搜索的文本&#xff09;应用于现有 PDF&#xff0c;通过向扫描…

奥比中光 Femto Bolt相机ROS配置

机械臂手眼标定详解 作者&#xff1a; Herman Ye Auromix 测试环境&#xff1a; Ubuntu20.04/22.04 、ROS1 Noetic/ROS2 Humble、X86 PC/Jetson Orin、Kinect DK/Femto Bolt 更新日期&#xff1a; 2023/12/12 注1&#xff1a; Auromix 是一个机器人爱好者开源组织。 注2&#…

环境安全之配置管理及配置安全设置指导

一、前言 IT运维过程中&#xff0c;配置的变更和管理是一件非常重要且必要的事&#xff0c;除了一般宏观层面的配置管理&#xff0c;还有应用配置参数的配置优化&#xff0c;本文手机整理常用应用组件配置项配置&#xff0c;尤其安全层面&#xff0c;以提供安全加固指导实践。…

Apache Kafka JNDI注入注入漏洞(CVE-2023-25194)

基于Vulhub搭建的环境 一、漏洞概述 Apache Kafka是一个开源分布式消息队列&#xff0c;Kafka clients是相对应的Java客户端。 在版本3.3.2及以前&#xff0c;Apache Kafka clients中存在一处JNDI注入漏洞。如果攻击者在连接的时候可以控制属性的值为&#xff0c;则可以发起…

uni-app获取response header响应头(h5/app/小程序三端)

h5、app获取方式&#xff1a;getResponseHeader(key) 示例&#xff1a;参考&#xff1a;HTML5 API Reference // 创建xhr实例&#xff1a; // #ifdef APP-VUE let xhr new plus.net.XMLHttpRequest(); // #endif // #ifdef H5 let xhr new window.XMLHttpRequest(); // #en…

【华为OD题库-088】数字最低位排序-Java

题目 给定一个非空数组(列表)&#xff0c;元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素&#xff0c;相对位置保持不变 当数组元素为负值时&#xff0c;十进制最低位等同于去除符号位后对应十进制值最低位 输入描述 给定一个非空数组…

Redis与MySQL双写一致性如何保证?

前言 四月份的时候&#xff0c;有位好朋友去美团面试。他说&#xff0c;被问到Redis与MySQL双写一致性如何保证&#xff1f;这道题其实就是在问缓存和数据库在双写场景下&#xff0c;一致性是如何保证的&#xff1f;本文将跟大家一起来探讨如何回答这个问题。 谈谈一致性 一致…

什么是UUID

UUID是通用唯一标识符&#xff08;Universally Unique Identifier&#xff09;的缩写&#xff0c;也叫GUID (Globally Unique Identifier)。它是一个由一串数字和字母组成的标识符&#xff0c;用于在计算机系统中唯一地标识实体&#xff08;如文件、对象、数据库记录等&#xf…

如何使用内网穿透实现iStoreOS软路由R4S公网远程访问局域网电脑桌面

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址…

JeecgBoot jmreport/queryFieldBySql RCE漏洞复现

0x01 产品简介 Jeecg Boot(或者称为 Jeecg-Boot)是一款基于代码生成器的开源企业级快速开发平台,专注于开发后台管理系统、企业信息管理系统(MIS)等应用。它提供了一系列工具和模板,帮助开发者快速构建和部署现代化的 Web 应用程序。 0x02 漏洞概述 Jeecg Boot jmrepo…

Linux0.11内核源码解析-string待更新

sting.h头文件包含了所有的字符串操作函数 strcpy字符串拷贝函数 cld 指令用于设置方向标志位&#xff0c;确保字符串复制是从前向后进行。 lodsb 指令用于将 src 指针指向的字符加载到 AL 寄存器中&#xff0c;并将 src 指针递增。 stosb 指令用于将 AL 寄存器中的字符存储到 …

【DL-TensorFlow遇错】TensorFlow中遇错合集

TensorFlow中遇错合集 一、AttributeError: module tensorflow has no attribute placeholder二、RuntimeError: tf.placeholder() is not compatible with eager execution. 一、AttributeError: module tensorflow has no attribute placeholder 错误原因 tensorflow版本问…