十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

PaddleSpeech TTS Arm Linux C++ Demo 实战指南:基于 Paddle Lite 的嵌入式中文语音合成部署

PaddleSpeech TTS Arm Linux C++ Demo 实战指南:基于 Paddle Lite 的嵌入式中文语音合成部署 人工智能语音音频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 仓库中的 TTSArmLinux Demo 是一套面向 ARM Linux 平台的端侧中文语音合成TTSC 推理示例它基于 Paddle Lite 推理引擎将文本前端、声学模型FastSpeech2与声码器Multi-Band MelGAN串联为完整的文本 → 音频流水线。本文以该 Demo 为骨架结合其源码、编译脚本与配置文件完整讲解从依赖安装、编译配置到运行推理的每一步并深入剖析其前端分句、音素 ID 转换与两段式神经网络推理的底层实现帮助读者在一台 ARM Linux 设备如树莓派、RK 系列开发板上快速落地一个可运行的中文语音合成程序。一、Demo 概览从 Android 到 ARM Linux 的移植demos/TTSArmLinux修改自同仓库的 TTSAndroid Demo所使用的模型也来自该 Android Demo。因此它天然继承了移动端推理的轻量化特点两个神经网络模型均被转换为 Paddle Lite 的.nb格式可在无 GPU、无 NPU 的纯 CPU 环境下运行。Demo 的核心链路如下输入文本中文→ 文本前端分词/繁转简/分句/音素映射→ FastSpeech2 声学模型 → Multi-Band MelGAN 声码器 → WAV 文件Demo 目录的关键文件一览均可从 demos/TTSArmLinux 找到文件作用config.sh编译与运行的核心配置架构 ABI、模型路径、Paddle Lite 库路径download.sh下载预编译 Paddle Lite 库与模型并建立词典软链接build.sh编译依赖并执行 CMake 构建产出paddlespeech_tts_demo可执行文件run.sh以front.conf与模型路径为参数启动推理程序front.conf文本前端配置结巴分词词典、音素映射表、繁简转换表clean.sh清理模型、库、构建产物与词典软链接src/main.cc推理主程序串联前端与后端src/Predictor.hpp声学模型 声码器的推理封装与 WAV 写出逻辑src/CMakeLists.txtCMake 构建脚本按 ABI 选择架构与编译参数提示Demo 顶层目录还引用了 TTSCppFrontend文本前端子工程其职责是文本 → 音素序列的转换是理解整个流水线的关键一环详见下文第六节。二、配置编译选项config.sh打开 config.sh 按需修改配置。默认编译 64 位版本如需编译 32 位版本把ARM_ABIarmv8改为ARM_ABIarmv7hf。# configuration ARM_ABIarmv8 #ARM_ABIarmv7hf MODELS_DIR${PWD}/models LIBS_DIR${PWD}/libs OUTPUT_DIR${PWD}/output PADDLE_LITE_DIR${LIBS_DIR}/inference_lite_lib.armlinux.${ARM_ABI}.gcc.with_extra.with_cv/cxx #PADDLE_LITE_DIR/path/to/Paddle-Lite/build.lite.linux.${ARM_ABI}.gcc/inference_lite_lib.armlinux.${ARM_ABI}/cxx ACOUSTIC_MODEL_PATH${MODELS_DIR}/cpu/fastspeech2_csmsc_arm.nb VOCODER_PATH${MODELS_DIR}/cpu/mb_melgan_csmsc_arm.nb FRONT_CONF${PWD}/front.conf各配置项说明ARM_ABI目标 CPU 架构。armv8对应 64 位AArch64armv7hf对应 32 位硬浮点ARMv7 NEON。该项同时决定了 CMake 中的编译参数与 Paddle Lite 库目录名。PADDLE_LITE_DIRPaddle Lite C 推理库的根目录。默认指向download.sh下载解压得到的预编译库若手动编译 Paddle Lite见第七节则改为对应的编译输出目录。ACOUSTIC_MODEL_PATH/VOCODER_PATH声学模型与声码器的.nb模型文件路径默认即download.sh解压后的位置models/cpu/下。FRONT_CONF文本前端配置文件路径对应 Demo 根目录的front.conf。MODELS_DIR/LIBS_DIR/OUTPUT_DIR模型、库、输出音频三个目录分别由download.sh与run.sh自动创建。三、安装编译依赖在目标主机上安装编译所需的基础工具# Ubuntu sudo apt install build-essential cmake pkg-config wget tar unzip # CentOS sudo yum groupinstall Development Tools sudo yum install cmake wget tar unzipbuild-essential或 CentOS 的 Development Tools 组提供 gcc/g 与 makecmake用于驱动 src/CMakeLists.txt 的构建wget、tar、unzip用于 download.sh 拉取并解压库与模型pkg-config供 CMake 查找系统库。如果发行版自带 CMake 版本过旧可自行安装更高版本的预编译 CMake。四、下载 Paddle Lite 库与模型Demo 使用的预编译二进制与安卓 Demo 版本使用相同版本的 Paddle Lite 推理库对应 Paddle-Lite 提交68b66fd35与模型fs2cnn_mbmelgan_cpu_v1.3.0。这一版本对齐非常关键——它保证了库与.nb模型在算子、内存布局上严格兼容。执行下载./download.sh从 download.sh 可以看到下载内容与校验信息资源说明MD5inference_lite_lib.armlinux.armv8.gcc.with_extra.with_cv.tar.gz64 位armv8Paddle Lite 预编译库39e0c6604f97c70f5d13c573d7e709b9inference_lite_lib.armlinux.armv7hf.gcc.with_extra.with_cv.tar.gz32 位armv7hfPaddle Lite 预编译库f5ceb509f0b610dafb8379889c5f36f8fs2cnn_mbmelgan_cpu_v1.3.0.tar.gzFastSpeech2 Multi-Band MelGAN 模型包93ef17d44b498aff3bea93e2c5c09a1e脚本会对每个文件做 MD5 校验文件已存在且校验通过则跳过下载否则重新下载并在解压后再次校验若 MD5 不匹配会明确提示文件可能损坏。下载完成后脚本还会执行两个附加动作建立词典软链接ln -s src/TTSCppFrontend/front_demo/dict $BASE_DIR/使front.conf中形如./dict/jieba/...的相对路径得以解析调用src/TTSCppFrontend/download.sh下载文本前端所需的结巴分词等词典文件同时负责拉取前端依赖的第三方库。注意armv8与armv7hf两个库都会被下载构建时由ARM_ABI决定实际使用哪一个clean.sh会删除libs、models、build与dict软链接需要时可一键清理后重新下载。五、编译 Demo./build.sh从 build.sh 可以看到构建分三步加载config.sh打印当前ARM_ABI与PADDLE_LITE_DIR调用./build-depends.sh $构建文本前端依赖结巴分词、limonp 等第三方库在build/目录执行cmake -DPADDLE_LITE_DIR${PADDLE_LITE_DIR} -DARM_ABI${ARM_ABI} ../src make -j$(nproc) # 若传入参数如 -j1则使用 make $src/CMakeLists.txt 中与架构相关的关键逻辑ARM_ABIarmv8时设置CMAKE_SYSTEM_PROCESSORaarch64并追加-marcharmv8-aARM_ABIarmv7hf时设置CMAKE_SYSTEM_PROCESSORarm并追加-marcharmv7-a -mfloat-abihard -mfpuneon-vfpv4通过include_directories(${PADDLE_LITE_DIR}/include)与link_directories(...)链接 Paddle Lite 头文件与库find_package(OpenMP REQUIRED)未找到 OpenMP 会直接报错终止——推理的并行加速依赖 OpenMP最终产物为paddlespeech_tts_demo链接paddle_light_api_sharedPaddle Lite 动态库与paddlespeech_tts_front文本前端静态库。关于兼容性预编译的二进制兼容 Ubuntu 16.04 到 20.04。如果编译或链接失败说明当前发行版与预编译库不兼容请尝试手动编译 Paddle Lite 库见第七节。六、运行 Demo命令与参数详解6.1 运行方式./run.sh ./run.sh --sentence 语音合成测试 ./run.sh --sentence 输出到指定的音频文件 --output_wav ./output/test.wav ./run.sh --helprun.sh 的本质是调用构建产物并传入前端配置与两个模型路径./build/paddlespeech_tts_demo \ --front_conf $FRONT_CONF \ --acoustic_model $ACOUSTIC_MODEL_PATH \ --vocoder $VOCODER_PATH \ $$会把用户追加的参数如--sentence透传给程序。未指定--output_wav时默认输出到./output/tts.wav。6.2 命令行参数来自 src/main.cc程序使用 gflags 解析参数完整参数表如下参数默认值说明--sentence你好欢迎使用语音合成服务待合成文本仅支持中文--front_conf./front.conf文本前端配置文件路径--acoustic_model./models/cpu/fastspeech2_csmsc_arm.nb声学模型.nb文件--vocoder./models/cpu/fastspeech2_csmsc_arm.nb声码器.nb文件--output_wav./output/tts.wav输出 WAV 文件路径--wav_bit_depth16WAV 位深1616-bit PCM或3232-bit IEEE float--wav_sample_rate24000WAV 采样率必须与声码器输出匹配--cpu_thread1CPU 线程数其中--wav_bit_depth直接决定运行时使用哪个模板特化的推理器为16时实例化Predictorint16_t为32时实例化Predictorfloat见 Predictor.hpp其他取值会打印Unsupported WAV bit depth并退出。6.3 文本前端配置front.conf运行前可修改 front.conf 中--phone2id_path为你自己声学模型的phone_id_map.txt从而适配自训练模型。完整配置内容如下# jieba conf --jieba_dict_path./dict/jieba/jieba.dict.utf8 --jieba_hmm_path./dict/jieba/hmm_model.utf8 --jieba_user_dict_path./dict/jieba/user.dict.utf8 --jieba_idf_path./dict/jieba/idf.utf8 --jieba_stop_word_path./dict/jieba/stop_words.utf8 # dict conf fastspeech2_0.4 --separate_tonefalse --word2phone_path./dict/fastspeech2_nosil_baker_ckpt_0.4/word2phone_fs2.dict --phone2id_path./dict/fastspeech2_nosil_baker_ckpt_0.4/phone_id_map.txt --tone2id_path./dict/fastspeech2_nosil_baker_ckpt_0.4/word2phone_fs2.dict # dict conf speedyspeech_0.5 #--separate_tonetrue #--word2phone_path./dict/speedyspeech_nosil_baker_ckpt_0.5/word2phone.dict #--phone2id_path./dict/speedyspeech_nosil_baker_ckpt_0.5/phone_id_map.txt #--tone2id_path./dict/speedyspeech_nosil_baker_ckpt_0.5/tone_id_map.txt # dict of tranditional_to_simplified --trand2simpd_path./dict/tranditional_to_simplified/trand2simp.txt参数分组理解jieba 分词组提供结巴分词的词典、HMM 模型、用户词典、IDF 与停用词表用于对中文句子分词fastspeech2_0.4 词典组--separate_tonefalse表示音调信息不单独建模FastSpeech2 模型默认不区分声调--word2phone_path提供词 → 音素映射--phone2id_path提供音素 → ID映射--tone2id_path在该配置下复用同一文件speedyspeech_0.5 词典组被注释掉的备选方案--separate_tonetrue表示声调独立建模需要额外的tone_id_map.txt。若改用 Speedyspeech 声学模型可取消注释并切换模型文件繁简转换组--trand2simpd_path指向繁转简对照表用于将繁体输入先转换为简体。6.4 运行限制目前只支持中文合成出现任何英文都会导致程序崩溃TTSCppFrontend README 也明确说明 any English word will crash the demo。输入文本应保持纯中文包括标点在内的英文符号都可能触发前端崩溃。七、源码级原理剖析7.1 主流程src/main.ccmain()的执行流程可以划分为前后两个阶段前端阶段文本 → 音素/声调 ID 序列实例化pppspeech::FrontEngineInterface并传入--front_conf路径初始化失败则退出将 UTF-8 句子转为宽字符串调用Trand2Simp完成繁体转简体调用SplitByPunc依据标点将整句切分为多个子句对每个子句依次执行SentenceNormalize文本归一化与GetSentenceIds得到phoneids与toneids两个 ID 数组日志输出每个子句的原始文本、归一化文本以及最终的音素 ID 序列。后端阶段音素 ID → 音频读取--wav_sample_rate、--cpu_thread固定使用PowerMode::LITE_POWER_HIGH电源模式调用Predictor::Init依次加载声学模型与声码器两个 Paddle Lite 模型将int型的音素 ID 数组转为int64_t后调用RunModel推理结束后打印耗时统计并把结果 WAV 写入--output_wav。7.2 两段式推理与 RTF 统计src/Predictor.hppPredictor是模板类WavDataType为int16_t或float对应两种 WAV 输出格式。其核心调用链为RunModel(phones) └─ GetAcousticModelOutput(phones) // FastSpeech2phones → 梅尔谱 [T, 80] └─ GetVocoderOutput(amOutput) // MelGAN梅尔谱 → 波形采样点 └─ VocoderOutputToWav(vocOutput) └─ SaveFloatWav(...) // 浮点采样 → WAV 数据关键实现细节模型加载通过MobileConfig配置set_model_from_file、set_threads(cpuThreadNum)、set_power_mode(cpuPowerMode)再用CreatePaddlePredictorMobileConfig创建推理器这正是 Paddle Lite 移动端/嵌入式场景的标准用法数据搬运声学模型的输出张量直接作为声码器的输入形状[?, 80]80 为梅尔频带数避免中间落盘WAV 头写入WavHeader结构体按 RIFF/WAVE 规范手工构造单声道--wav_bit_depth16时audio_format1PCM32时audio_format3IEEE float16-bit 缩放Predictorint16_t::SaveFloatWav先寻找最大采样绝对值下限 0.01 防止除零再整体缩放至32767.0f / maxSample以充分利用 16-bit 动态范围性能指标GetInferenceTime()返回推理耗时毫秒GetWavDuration()由采样点数与采样率换算GetRTF() 推理时间 / 音频时长是衡量端侧 TTS 实时性的核心指标RTF 1 表示合成速度快于播放速度。程序结束时会输出类似如下的日志Inference time: 123.45 ms, WAV size (without header): 96000 bytes, WAV duration: 2000 ms, RTF: 0.067.3 文本前端TTSCppFrontendTTSCppFrontend 是独立的文本转音素C 前端子工程支持以--sentence、--front_conf等参数独立运行run_front_demo.sh便于在接入声学模型前单独验证文本前端。它与 Android Demo 复用同一套结巴分词与音素映射逻辑保证了 Demo 在不同平台上合成效果一致。八、手动编译 Paddle Lite 库预编译二进制兼容 Ubuntu 16.04 到 20.04如果你的发行版与其不兼容可从源代码自行编译。8.1 版本约束务必注意只能保证 Paddle-Lite 提交68b66fd35与download.sh下载的模型兼容使用其他版本库时可能需要用对应版本的opt工具重新导出模型Paddle-Lite 2.12 与 TTS 不兼容无法导出或运行 TTS 模型必须使用更新的版本例如develop分支中的代码但develop分支代码可能与download.sh下载的模型不兼容Demo 运行起来可能会崩溃。因此最稳妥的做法是检出与预编译库完全相同的提交68b66fd35重新编译。8.2 安装编译依赖# Ubuntu sudo apt install build-essential cmake git python # CentOS sudo yum groupinstall Development Tools sudo yum install cmake git python8.3 编译 Paddle Lite 68b66fd35git clone https://github.com/PaddlePaddle/Paddle-Lite.git cd Paddle-Lite git checkout 68b66fd356c875c92167d311ad458e6093078449 ./lite/tools/build_linux.sh --with_extraON--with_extraON会额外编译 TTS 模型所需的算子。编译完成后打开 Demo 的 config.sh将PADDLE_LITE_DIR改为以下值注意把/path/to/替换为实际目录PADDLE_LITE_DIR/path/to/Paddle-Lite/build.lite.linux.${ARM_ABI}.gcc/inference_lite_lib.armlinux.${ARM_ABI}/cxx之后重新执行./build.sh即可用自编译库完成链接。九、常见问题与排查建议编译或链接失败多为发行版与预编译 Paddle Lite 库的 glibc/GCC ABI 不兼容按第八节手动编译对应版本的 Paddle Lite 库。运行崩溃且输入含英文前端仅支持中文检查--sentence是否为纯中文若使用自训练模型确认--phone2id_path指向正确的phone_id_map.txt且词典与模型匹配。合成音调/语速异常检查--wav_sample_rate是否与声码器输出采样率一致本 Demo 默认 24000Predictor.hpp 注释中列出的常见采样率包括 16000、24000、32000、44100、48000、96000。更换声学模型后 ID 对不上文本前端输出音素 ID 的映射来自front.conf中的词典组必须与模型的训练词典保持一致FastSpeech2 使用fastspeech2_nosil_baker_ckpt_0.4系列Speedyspeech 使用speedyspeech_nosil_baker_ckpt_0.5系列二者不可混用。至此读者已经可以在一台 ARM Linux 设备上完成依赖安装、库与模型下载、编译、运行的全流程并能依据源码理解文本前端 → 声学模型 → 声码器 → WAV的端侧合成原理为接入自训练模型或二次开发打下基础。赞分享人工智能语音音频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 TTS ARM Linux C Demo 实战基于 Paddle Lite 的离线中文语音合成端侧部署指南PaddleSpeech TTS ARM Linux C Demo 实战基于 Paddle Lite 的离线中文语音合成端侧部署指南 本指南围绕 demo人工智能语音音频Paddle Lite Linux(ARM) 部署实战目标检测 Demo 部署与 C/Python 接口推理详解Paddle Lite Linux ARM 部署实战目标检测 Demo 部署与 C/Python 接口推理详解 本文以 Paddle Lite 官方 Li人工智能推理引擎深度学习本地部署嵌入式如何用go2rtc搭建零延迟摄像头流媒体系统如何用go2rtc搭建零延迟摄像头流媒体系统 家里三台摄像头一台RTSP网络相机、一台USB摄像头、一台Tapo云台相机用各自的App各看各的浏览器一打开人工智能语音音频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表