ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PaddleSpeech TTSAndroid 语音合成 Android Demo 实战指南:基于 Paddle Lite 的端侧 TTS 部署

PaddleSpeech TTSAndroid 语音合成 Android Demo 实战指南:基于 Paddle Lite 的端侧 TTS 部署 人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载本指南围绕 PaddleSpeech 仓库中的demos/TTSAndroid语音合成 Android 示例工程系统讲解如何将 FastSpeech2 声学模型与 Multi Band MelGAN 声码器组合部署到 Android 手机端。你将掌握完整的环境准备与真机部署流程、Paddle Lite Java API 的推理调用方式、模型与预测库的替换更新方法以及通过 Settings 界面动态调整 CPU 线程数与功耗模式等实战技能。一、Demo 概览与技术架构TTSAndroid 是 PaddleSpeech 提供的 Android 端语音合成Text-to-Speech示例工程其核心特点是易用性与开放性兼备一方面开箱即用编译后即可在手机上合成语音另一方面预留了良好的扩展空间可以在 Demo 中替换自己训练好的模型。从源码结构看该 Demo 采用经典的两阶段语音合成链路与 PaddleSpeech 服务端 TTS 推理流程保持一致声学模型Acoustic Modelfastspeech2_csmsc_arm.nb输入音素序列phone id输出对应的 Mel 频谱声码器Vocodermb_melgan_csmsc_arm.nbMulti Band MelGAN将 Mel 频谱还原为可播放的 PCM 波形。两个模型均为经过 opt 工具转换后的Paddle Lite 端侧模型.nb格式运行时的推理框架是Paddle LiteJava 预测库PaddlePredictor.jar与libpaddle_lite_jni.so。整体调用链为音素 id → FastSpeech2 推理 → Mel 频谱 → MB MelGAN 推理 → 波形数据 → 写为 WAV 文件 →MediaPlayer播放。工程目录位于demos/TTSAndroid/其中 Android 工程主体在demos/TTSAndroid/app/下。二、环境准备运行该 Demo 前需要准备以下环境安装 Android Studio详细安装方法见 Android Studio 官网文档开发者可通过官方渠道获取。准备一部 Android 手机并开启 USB 调试模式。开启方法手机设置 - 查找开发者选项 - 打开开发者选项和 USB 调试模式。注意NDK 配置如果您的 Android Studio 尚未配置 NDK请根据 Android Studio 用户指南中的「安装及配置 NDK 和 CMake」内容预先配置好 NDK。您可以选择最新的 NDK 版本或者使用与 Paddle Lite 预测库版本一致的 NDK。本 Demo 的 Paddle Lite 预测库基于 ARMv8arm64-v8a架构编译建议使用支持该 ABI 的 NDK 版本工程源码中提示的示例路径为android-ndk-r20b。三、部署步骤用 Android Studio 打开demos/TTSAndroid工程demos/TTSAndroid/settings.gradle中已通过include :app声明 app 模块。手机连接电脑打开 USB 调试和文件传输模式并在 Android Studio 上连接自己的手机设备手机需要开启允许从 USB 安装软件权限。点击 Run 按钮自动编译 APP 并安装到手机。该过程会自动下载 Paddle Lite 预测库和模型需要联网。部署成功后即可看到APP 安装到手机APP 打开后可通过下拉框选择待合成的文本选择后自动合成点击按钮即可播放音频。NDK 配置错误的排查方法如果在导入项目、编译或者运行过程中遇到 NDK 配置错误的提示请打开File Project Structure SDK Location修改Android NDK location为本机配置的 NDK 所在路径。如果通过 Android Studio 的 SDK Tools 下载的 NDK见上文环境准备可以直接点击下拉框选择默认路径。另一种 NDK 配置方法在demos/TTSAndroid/local.properties文件中手动添加 NDK 路径配置例如nkd.dir/root/android-ndk-r20b。如果以上步骤仍旧无法解决 NDK 配置错误请尝试根据 Android Studio 官方文档中的「更新 Android Gradle 插件」章节更新 Android Gradle plugin 版本。四、工程结构与重点文件Demo 的代码结构分为 Gradle 构建配置、Java 源码、资源文件三大块其中以下几个文件是本 Demo 的重点关注内容文件作用相对仓库根目录的位置Predictor.java预测代码封装 Paddle Lite 推理逻辑demos/TTSAndroid/app/src/main/java/com/baidu/paddle/lite/demo/tts/Predictor.javafastspeech2_csmsc_arm.nbFastSpeech2-CNNDecoder 声学模型opt 工具转化后的 Paddle Lite 模型demos/TTSAndroid/app/src/main/assets/models/cpu/fastspeech2_csmsc_arm.nbmb_melgan_csmsc_arm.nbMulti Band MelGAN 声码器模型demos/TTSAndroid/app/src/main/assets/models/cpu/mb_melgan_csmsc_arm.nblibpaddle_lite_jni.soPaddle Lite Java 端 JNI 动态库arm64-v8ademos/TTSAndroid/app/src/main/jniLibs/arm64-v8a/libpaddle_lite_jni.soPaddlePredictor.jarPaddle Lite Java 预测库 jar 包demos/TTSAndroid/app/libs/PaddlePredictor.jarbuild.gradleGradle 编译脚本定义了自动下载 Paddle Lite 预测库和模型的过程demos/TTSAndroid/app/build.gradle如果要替换动态库 so 和 jar 文件则将新的动态库 so 更新到demos/TTSAndroid/app/src/main/jniLibs/arm64-v8a/目录下新的 jar 文件更新到demos/TTSAndroid/app/libs/目录下。如果需要手动更新模型和预测库可将 Gradle 脚本中的download*任务注释掉再将新的预测库与模型替换至相应目录下。4.1 Java 端模块划分模型存放下载好的模型解压后存放在demos/TTSAndroid/app/src/main/assets/models目录下。Java 包com.baidu.paddle.lite.demo.tts位于demos/TTSAndroid/app/src/main/java/com/baidu/paddle/lite/demo/tts目录下实现 APP 界面消息事件。MainActivity实现 APP 的创建、运行、释放功能重点关注onLoadModel和onRunModel两个函数实现 APP 界面值传递和推理处理public boolean onLoadModel() { return predictor.init(MainActivity.this, modelPath, AMmodelName, VOCmodelName, cpuThreadNum, cpuPowerMode); } public boolean onRunModel() { return predictor.isLoaded() predictor.runModel(phones); }SettingsActivity实现设置界面各个元素的更新与显示如模型地址、线程数、输入 shape 大小等。如果新增/删除界面的某个元素均在这个类中实现参数的默认值可在demos/TTSAndroid/app/src/main/res/values/strings.xml查看每个元素的 ID 和 value 对应demos/TTSAndroid/app/src/main/res/xml/settings.xml和demos/TTSAndroid/app/src/main/res/values/strings.xml文件中的值这部分内容不建议修改如果有新增属性可以按照此格式进行添加。Predictor使用 Java API 实现语音合成模型的预测功能重点关注init和runModel函数实现 Paddle Lite 端侧推理功能// 初始化函数完成预测器初始化 public boolean init(Context appCtx, String modelPath, String AMmodelName, String VOCmodelName, int cpuThreadNum, String cpuPowerMode); // 模型推理函数 public boolean runModel(float[] phones);五、构建脚本自动下载预测库与模型demos/TTSAndroid/app/build.gradle是本工程的关键构建脚本它定义了两个自动下载任务并在preBuild阶段自动执行因此首次编译时无需手动准备预测库和模型downloadAndExtractPaddleLiteLibs从https://paddlespeech.cdn.bcebos.com/demos/TTSAndroid/paddle_lite_libs_68b66fd3.tar.gz下载并解压 Paddle Lite 预测库将PaddlePredictor.jar复制到libs/将libpaddle_lite_jni.so复制到src/main/jniLibs/arm64-v8a/。脚本会对下载地址做 MD5 生成缓存名避免重复下载对应demos/TTSAndroid/app/build.gradle第 34-74 行。downloadAndExtractPaddleLiteModels从https://paddlespeech.cdn.bcebos.com/demos/TTSAndroid/fs2cnn_mbmelgan_cpu_v1.3.0.tar.gz下载声学模型 声码器压缩包解压到src/main/assets/models目录对应demos/TTSAndroid/app/build.gradle第 76-107 行。依赖声明方面工程通过implementation files(libs/PaddlePredictor.jar)引入本地 jar并使用implementation fileTree(include: [*.jar], dir: libs)扫描 libs 目录下的所有 jarUI 依赖com.android.support:appcompat-v7:28.0.0、constraint-layout:1.1.3与design:28.0.0编译 SDK 与 target SDK 均为 28minSdkVersion 15见demos/TTSAndroid/app/build.gradle第 5-32 行。六、代码讲解使用 Paddle Lite Java API 执行预测Android 示例基于 Java API 开发调用 Paddle Lite Java API 的核心流程可归纳为五步更详细的 API 描述可参考 Paddle Lite 官方 Java API 文档。结合Predictor.java源码具体实现如下6.1 模型加载与预测器创建Predictor.loadModel见demos/TTSAndroid/app/src/main/java/com/baidu/paddle/lite/demo/tts/Predictor.java第 42-79 行完成模型的加载与MobileConfig配置MobileConfig config new MobileConfig(); config.setModelFromFile(realPath File.separator modelName); config.setThreads(cpuThreadNum); config.setPowerMode(PowerMode.LITE_POWER_HIGH); return PaddlePredictor.createPaddlePredictor(config);值得关注的两个实现细节模型路径处理若modelPath不以/开头说明模型位于 assets 资源中代码会先通过Utils.copyDirectoryFromAssets将 assets 下的模型目录复制到应用缓存目录appCtx.getCacheDir()再加载缓存中的模型文件若以/开头则视为 SD 卡等自定义路径直接加载。这一设计保证了内置模型开箱即用、自定义模型灵活扩展。Power Mode 映射源码通过字符串匹配将界面传入的cpuPowerMode映射为PowerMode枚举支持LITE_POWER_HIGH、LITE_POWER_LOW、LITE_POWER_FULL、LITE_POWER_NO_BIND、LITE_POWER_RAND_HIGH、LITE_POWER_RAND_LOW六种模式未知模式会打印错误日志并返回null。init函数第 26-40 行会依次加载声学模型和声码器两个预测器AMPredictor与VOCPredictor任一加载失败即返回false全部成功后才将isLoaded置为true。6.2 两段式推理runModel第 90-100 行串联声学模型与声码器Tensor am_output_handle getAMOutput(phones, AMPredictor); wav getVOCOutput(am_output_handle, VOCPredictor);getAMOutput第 102-121 行将phones写入预测器输入 Tensorshape 为{phones.length}执行am_predictor.run()取回输出 Tensor。输出为[?, 80]形状的 Mel 频谱80 维为 CSMSC 语料库的 Mel 频带数。getVOCOutput第 123-137 行声码器输入 Tensor 的 shape 必须与声学模型输出 Tensor 的 shape 保持一致mel_handle.resize(input.shape())因此这里直接复用上游的 Tensor 维度。声码器输出为[? x 300, 1]的波形数据最终转为一维float[]返回。6.3 推理耗时统计runModel首尾使用Date记录时间差并保存到inferenceTime毫秒。主界面在推理完成后会打印Inference time与RTFReal-Time Factor实时率inferenceTime * sampleRate / (predictor.wav.length * 1000)见MainActivity.onRunModelSuccessed其中sampleRate 24000。RTF 是衡量 TTS 实时性能的核心指标RTF 1 表示合成速度高于实时播放速度。6.4 波形写文件与播放MainActivity使用Utils.rawToWave见demos/TTSAndroid/app/src/main/java/com/baidu/paddle/lite/demo/tts/Utils.java第 74-118 行将float[]波形数据按WAVE/PCM 16bit 单声道、24kHz 采样率的格式写出 WAV 文件保存在外部存储目录文件名为tts_output.wav随后通过MediaPlayer的prepareAsync异步准备并播放。FloatArray2ShortArray会先将波形按最大绝对值归一化再量化到 16bit short 范围避免削波失真。七、更新预测库如需升级或自编译 Paddle Lite 预测库可参考 Paddle Lite 源码编译文档编译 Android 预测库Paddle Lite 项目官方地址https://github.com/PaddlePaddle/Paddle-Lite。编译完成后按以下步骤替换定位编译产物最终产物位于build.lite.xxx.xxx.xxx下的inference_lite_lib.xxx.xxx目录。替换 java 库jar 包将生成的build.lite.android.xxx.gcc/inference_lite_lib.android.xxx/java/jar/PaddlePredictor.jar替换 Demo 中的demos/TTSAndroid/app/libs/PaddlePredictor.jar。替换 Java soarm64-v8a将生成的build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/java/so/libpaddle_lite_jni.so替换 Demo 中的demos/TTSAndroid/app/src/main/jniLibs/arm64-v8a/libpaddle_lite_jni.so。八、更新模型与输入8.1 更新模型将优化后的模型存放到目录demos/TTSAndroid/app/src/main/assets/models/cpu/下可以任意换成 released_model.md 中列出的*_pdlite_*.zip/*_arm.nb格式的声学模型和声码器。从 released_model.md 可以看到PaddleSpeech 官方提供了多组_pdlite_端侧模型包覆盖 FastSpeech2、SpeedySpeech 等声学模型与 Parallel WaveGAN、Multi Band MelGAN、HiFiGAN 等声码器对应 CSMSC、AISHELL-3、LJSpeech、VCTK 等语料。注意更换声学模型时需要对应修改demos/TTSAndroid/app/src/main/java/com/baidu/paddle/lite/demo/tts/MainActivity.java中的sentencesToChoose数组音素 id 序列与模型的phone_id_map.txt严格对应。如果模型名字与工程中默认模型名一致即均使用fastspeech2_csmsc_arm.nb与mb_melgan_csmsc_arm.nb且声学模型的phone_id_map.txt也一致则代码无需更新否则需要修改demos/TTSAndroid/app/src/main/java/com/baidu/paddle/lite/demo/tts/MainActivity.java中的AMmodelName和VOCmodelName常量。在MainActivity.java第 66-67 行可以看到默认值private final String AMmodelName fastspeech2_csmsc_arm.nb; private final String VOCmodelName mb_melgan_csmsc_arm.nb;如果更新模型的输入/输出 Tensor 个数、shape 和 Dtype 发生变化需要同步更新demos/TTSAndroid/app/src/main/java/com/baidu/paddle/lite/demo/tts/Predictor.java中的输入输出处理逻辑如phones_handle.resize(dims)的维度设置。8.2 更新输入文本前端说明本 Demo 不包含文本前端模块通过下拉框选择预先设置好的文本在代码中映射成对应的 phone_id。MainActivity.java第 69-91 行的sentencesToChoose数组即 10 条预置句子的音素 id 序列每条对应arrays.xml中text数组的一项例如第 009901 句昨日这名伤者与医生全部被警方依法刑事拘留。对应的音素序列为{261, 231, 175, 116, 179, 262, 44, 154, 126, 177, ...}。用户在 Spinner 下拉框选择句子后onItemSelected会取出对应序列并触发runModel()见MainActivity.java第 388-394 行。如需实现任意文本输入需自行引入文本前端模块将文本转换为音素 id 序列可参考C 中文前端lym0302/paddlespeech_tts_cppC 英文 g2pyazone/g2pE_mobilephone_id_map.txt可参考fastspeech2_cnndecoder_csmsc_pdlite_1.3.0.zip压缩包中随模型附带的文件。九、通过 Setting 界面更新语音合成参数9.1 Setting 界面参数介绍可通过 APP 上的 Settings 按钮实现语音合成 Demo 中参数的更新目前支持以下参数默认值可在demos/TTSAndroid/app/src/main/res/values/strings.xml查看Model Settings模型设置Choose pre-installed models选择预置模型目录Enable custom settings启用自定义设置开关默认关闭Model Path模型路径默认models/cpu。CPU settingCPU 设置power_mode 默认是LITE_POWER_HIGHthread_num 默认是 1。线程数与功耗模式的候选值定义在demos/TTSAndroid/app/src/main/res/values/arrays.xml中参数可选值CPU Thread Num1 / 2 / 4 / 8 线程CPU Power ModeLITE_POWER_HIGH仅大核、LITE_POWER_LOW仅小核、LITE_POWER_FULL全部核心、LITE_POWER_NO_BIND由系统决定、LITE_POWER_RAND_HIGH、LITE_POWER_RAND_LOWSettingsActivitydemos/TTSAndroid/app/src/main/java/com/baidu/paddle/lite/demo/tts/SettingsActivity.java负责这些参数的读取与 UI 联动当用户从预置模型下拉框选择模型时会自动使用该模型对应的默认参数见第 58-87 行reloadPreferenceAndUpdateUI选中 Enable custom settings 后Model Path、CPU Thread Num、CPU Power Mode 三个选项才变为可编辑状态。9.2 Setting 界面参数更新打开 APP点击右上角的:符号选择Settings...选项打开 setting 界面再将 setting 界面的Enable custom settings选中勾选然后更新部分参数假设更新线程数量将CPU Thread Num设置为 4更新后返回原界面APP 将自动重新加载模型MainActivity.onResume中通过 SharedPreferences 检测参数变化并触发loadModel()在下拉框中选择文本会进行合成合成结束后会打印 4 线程的耗时和结果。十、性能优化方法MainActivity中已内置 RTF 计算可直接观察线程数与功耗模式对合成速度的影响。如果觉得当前性能不符合需求想进一步提升模型性能可以参考 Paddle Lite 官方性能优化文档完成优化常见思路包括根据手机 CPU 大小核架构选择合适的 Power Mode如追求低延迟选择LITE_POWER_HIGH追求均衡功耗选择LITE_POWER_FULL或LITE_POWER_NO_BIND、适当提升线程数、以及结合demos/TTSAndroid/app/build.gradle中的构建参数进行针对性调优。十一、预编译 APK仓库为 TTSAndroid 提供了可直接安装体验的预编译版本2022-11-29-app-release.apk无需本地编译即可在 arm64-v8a 设备上快速体验完整流程。结语TTSAndroid 是理解PaddleSpeech 模型如何落地到移动端的最佳范例之一。它以 FastSpeech2 Multi Band MelGAN 两段式架构为核心依托 Paddle Lite 在 Android 上完成了从音素序列到可播放音频的完整推理链路同时通过 Gradle 自动下载、预置模型替换、Settings 动态调参等设计兼顾了开箱即用的易用性与二次开发的开放性。开发者只需修改模型文件与MainActivity、Predictor中的少量参数即可将 PaddleSpeech 官方发布的任意*_pdlite端侧 TTS 模型跑在自己的 Android 设备上。赞分享人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐PaddleSpeech 语音合成 Android Demo 实战基于 Paddle Lite Java API 的端侧 TTS 部署指南PaddleSpeech 语音合成 Android Demo 实战基于 Paddle Lite Java API 的端侧 TTS 部署指南 本文是 Paddl人工智能语音音频PaddleSpeech TTS ARM Linux C Demo 实战基于 Paddle Lite 的离线中文语音合成端侧部署指南PaddleSpeech TTS ARM Linux C Demo 实战基于 Paddle Lite 的离线中文语音合成端侧部署指南 本指南围绕 demo人工智能语音音频PaddleSpeech TTS Arm Linux C Demo 实战指南基于 Paddle Lite 的嵌入式中文语音合成部署PaddleSpeech TTS Arm Linux C Demo 实战指南基于 Paddle Lite 的嵌入式中文语音合成部署 PaddleSpeec人工智能语音音频NLP媒体生成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表