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

资讯详情

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

PaddleSpeech C++ 推理引擎(runtime)构建指南:环境准备、CMake 构建流程与常见编译错误排查

PaddleSpeech C++ 推理引擎(runtime)构建指南:环境准备、CMake 构建流程与常见编译错误排查 人工智能语音音频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 仓库runtime/目录的部署文档为骨架完整讲解如何在 Docker 环境中准备构建依赖、通过build.sh编译 C 推理引擎与示例程序、在 Android/iOS 平台交叉编译并针对文档 FAQ 中列出的五类典型错误No module named paddle、libpaddle.so加载失败、libgfortran缺失等给出基于源码的定位原理与可复制的解决方案。读完本文你可以独立完成从环境创建到运行u2pp_ol流式 ASR 示例的完整部署流程并能自行排查编译/运行期的链接问题。一、runtime 模块的定位与整体构建结构PaddleSpeech 的runtime/目录是纯 C 部署侧代码负责把 Python 训练得到的声学模型.pdmodel等编译为可在服务端和移动端运行的可执行程序。从源码结构看runtime/的核心组成如下runtime/CMakeLists.txt顶层 CMake 入口负责探测 Paddle 链接参数、拉取第三方库gflags、glog、pybind、FastDeploy、openfst 等并汇总构建选项runtime/engine/引擎源码其中engine/asr/包含解码器CTC 前缀束搜索、TLG 解码器、神经网络推理模块u2_nnet、u2_onnx_nnet、识别器recognizer与 WebSocket 服务端asr/server/websocket/engine/common/frontend/包含流式特征前端Fbank、CMVN、db_norm分贝归一化、音频组装器assembler等engine/kaldi/内置了 Kaldi 风格的矩阵、Lattice、FST 工具代码engine/audio_classification/与engine/vad/分别对应音频分类PANNs与 VAD 推理。各子模块按 CMake 开关独立参与编译runtime/examples/可运行的示例工程官方推荐u2pp_olu2 流式 ASR基于 aishell-1 测试集另有ds2_ol、vad/、android/、audio_classification/、custom_asr/、text_lm/等runtime/tools/构建辅助脚本包括venv.sh创建 Python 虚拟环境、setup_valgrind.sh源码安装 Valgrind、clang-format.shruntime/cmake/第三方库的 FetchContent 封装与构建摘要输出runtime/build.sh、runtime/build_android.sh、runtime/build_ios.shx86 Linux、Android、iOS 三套构建脚本。顶层CMakeLists.txt定义了引擎版本号PPS_VERSION 1.0.0见 runtime/CMakeLists.txt统一使用 C14、默认Release构建类型Ninja 生成器例外安装目录固定为build/*/installCMAKE_INSTALL_PREFIX见 runtime/CMakeLists.txt。构建完成后还会通过 CPack 打包为paddlespeech_libraryTGZ 源码包。engine/CMakeLists.txt展示了模块间的编译依赖关系kaldi与common无条件构建而asr、audio_classification、vad分别受WITH_ASR、WITH_CLS、WITH_VAD开关控制见 runtime/engine/CMakeLists.txt。这一点对交叉编译很关键——移动端构建通常只保留 VAD 模块。二、开发环境要求推荐 Dockerruntime/README.md给出的开发环境基线为组件版本/说明Python 3.8Docker 镜像registry.baidubce.com/paddlepaddle/paddle:2.2.2-gpu-cuda10.2-cudnn7操作系统Ubuntu 16.04.7 LTSgcc / g / gfortran8.2.0CMake3.16.0实际顶层工程要求cmake_minimum_required(VERSION 3.17)见 runtime/CMakeLists.txt文档明确建议所有构建在 PaddlePaddle 官方 Docker 镜像中验证通过推荐在 Docker 中进行开发与部署。启动容器的命令为docker run --privileged --nethost --ipchost -it --rm \ -v /path/to/paddlespeech:/workspace --namedev \ registry.baidubce.com/paddlepaddle/paddle:2.2.2-gpu-cuda10.2-cudnn7 /bin/bash几点需要注意--privileged参数在后续使用 Valgrind 时是必需的见第六节建议首次启动即带上工作目录挂载为/workspace与CMakeLists.txt中的路径注释保持一致构建脚本本身并不要求 GPUWITH_GPU选项默认为OFFruntime/CMakeLists.txt即 C 引擎默认按 CPU 推理编译。2.1 创建 Python 虚拟环境CMake 配置阶段需要调用 Python 解释器去查询已安装 PaddlePaddle 的头文件与库路径原理见下一节因此必须先创建虚拟环境并安装 Paddle。仓库中实际的创建脚本是 runtime/tools/venv.shbash tools/venv.sh # 等价于virtualenv -p python3.8 venv source venv/bin/activate该脚本用python3.8创建名为venv的虚拟环境已存在则跳过与文档中 “Python 3.8” 的要求对应。三、构建 C 引擎与示例build.sh 详解3.1 安装 PaddlePaddle文档提醒由于使用了 Paddle 的特定特性构建 C 引擎需要安装指定版本的paddlepaddle文档 FAQ 中给出的最低要求是paddlepaddle 2.4rc构建示例中安装 2.4.2source venv/bin/activate python -m pip install paddlepaddle2.4.2 -i https://mirror.baidu.com/pypi/simple ./build.sh3.2 build.sh 的参数逐项说明runtime/build.sh 的实际执行流程是“创建构建目录 → 配置 CMake → 并行编译”BUILD_TYPERelease # 可改为 Debug BUILD_SOOFF # -DBUILD_SHARED_LIBSOFF引擎编译为静态库/可执行程序 BUILD_ONNXON # u2 模型支持 ONNX Runtime BUILD_ASRON # 构建 ASR 引擎 BUILD_CLSON # 构建音频分类PANNs引擎 BUILD_VADON # 构建 VAD 引擎 PPS_DEBUGOFF # -DWITH_PPS_DEBUG开启后定义 PPS_DEBUG 宏 FASTDEPLOY_INSTALL_DIR # 指向已构建的 FastDeploy 安装目录留空则由 CMake 自行处理CMake 配置命令为runtime/build.shmkdir -p build/Linux/x86_64 cmake -B build/Linux/x86_64 \ -DCMAKE_BUILD_TYPERelease \ -DBUILD_SHARED_LIBSOFF \ -DWITH_ONNXON \ -DWITH_ASRON \ -DWITH_CLSON \ -DWITH_VADON \ -DFASTDEPLOY_INSTALL_DIR \ -DWITH_PPS_DEBUGOFF cmake --build build/Linux/x86_64 -j顶层 runtime/CMakeLists.txt 中可选项的完整集合为CMake 选项默认值含义BUILD_SHARED_LIBSON是否构建动态库build.sh中显式传 OFFWITH_PPS_DEBUGOFF定义PPS_DEBUG编译宏开启调试日志WITH_ASRON构建 ASR 引擎OFF 时跳过 Python3/pybind 探测WITH_CLSON构建音频分类引擎WITH_VADON构建 VAD 引擎WITH_GPUOFF神经网络推理是否启用 GPUWITH_PROFILINGOFF是否开启 C profilingWITH_TESTINGON是否下载并构建 gtest 单元测试WITH_ONNXOFFu2 是否支持 ONNX Runtimebuild.sh中传 ON并定义USE_ONNX宏配置完成后runtime/cmake/summary.cmake 会打印一份 “PaddleSpeech Building Summary”列出版本号、编译器、WITH_ASR/CLS/VAD、FASTDEPLOY_INSTALL_DIR及 Python 解释器等关键信息方便确认开关是否按预期生效。3.3 构建脚本如何自动探测 Paddle 库理解 FAQ 1 的前提runtime/CMakeLists.txt 在WITH_ASRON时通过execute_process执行三段内嵌 Python 代码来定位 PaddlePaddle 的产物import paddle后经paddle.sysconfig.get_include()得到头文件目录拼出链接参数PADDLE_LINK_FLAGS形如-L.../paddle/libs -L.../paddle/fluid -l:libpaddle.so -l:libdnnl.so.2 -l:libiomp5.so同样方式得到编译宏PADDLE_COMPILE_FLAGS-I.../paddle/include得到运行期LD_LIBRARY_PATH所需的PADDLE_LIB_DIRS。关键点在于这三步都以当前 PATH 中可用的python为前提。如果虚拟环境未激活、或 PaddlePaddle 未安装import paddle抛ModuleNotFoundErrorOUTPUT_VARIABLE拿到空串随后string(STRIP ...)就报出string sub-command STRIP requires two arguments错误——这正是 FAQ 第 1 条中CMakeLists.txt:119/CMakeLists.txt:131报错的根因行号随版本漂移当前仓库对应 runtime/CMakeLists.txt。解决方式就是文档给出的先激活venv并安装paddlepaddle 2.4rc再执行build.sh。四、交叉编译Android 与 iOS除 x86 Linux 外runtime/还提供了两套移动端构建脚本可作为参数化构建的参考范本。Androidruntime/build_android.sh通过 NDK r25b 的android.toolchain.cmake交叉编译关键参数为ANDROID_ABIarm64-v8a也支持armeabi-v7a、ANDROID_PLATFORMandroid-21API 21、ANDROID_STLc_shared、构建类型MinSizeRel。注意其中-DWITH_ASROFF -DWITH_CLSOFF -DWITH_VADON的组合——移动端仅构建 VAD 引擎且依赖指向本地 FastDeploy 的 Android 安装目录FASTDEPLOY_INSTALL_DIR。iOSruntime/build_ios.sh使用ios.toolchain.cmake目标平台OS64Apple Silicon、BUILD_IN_MACOSON该选项会额外定义OS_MACOSX宏见 runtime/CMakeLists.txt同样只构建 VAD 模块并链接 FastDeploy iOS arm64 产物脚本支持传参clean仅做构建产物清理。顶层 CMake 对交叉编译做了专门支持ANDROID场景下把CMAKE_FIND_ROOT_PATH_MODE_*全部设为BOTH保证find_library等命令在交叉环境下仍能查到宿主机上的工具runtime/CMakeLists.txt。五、运行示例程序构建完成后文档指引进入examples/目录运行。runtime/examples/README.md 说明官方推荐示例为u2pp_olu2 流式 ASRaishell-1 测试集另有ds2_olDeepspeech2 流式每个示例的入口是各自的run.sh例如pushd u2pp_ol bash run.sh --stop_stage 4运行前同样需要先source venv/bin/activate激活虚拟环境若需要查看模型计算图可用 Netronpip install netron后netron exp/.../avg_1.jit.pdmodel --port 8022examples/codelab/仅面向引擎开发者做日志等组件自测普通用户可忽略。engine/asr/server/websocket/下还内置了 WebSocket 服务程序对应examples/custom_asr/中“自定义 ASR 服务”的部署形态可用于把编译好的引擎封装为网络服务。六、Valgrind 内存调试可选文档的 Valgrind 章节给出了两条要点均可在脚本中得到印证Docker 容器必须带--privileged否则 Valgrind 启动时报a function redirection which is mandatory for this platform-tool combination cannot be set up出现该 fatal error 时可先安装调试符号包apt-get install libc6-dbg安装脚本 runtime/tools/setup_valgrind.sh 采用源码编译方式固定 Valgrind 版本3.18.1pushd tools ./setup_valgrind.sh popd脚本逻辑若本地已存在valgrind-3.18.1.tar.bz2则复用否则从 sourceware.org 断点续传下载随后解压、./configure --prefix$PWD/valgrind/install、make make install。产物位于runtime/tools/valgrind/install使用 PATH 指定该前缀即可对引擎可执行程序做内存检测。七、FAQ五类典型编译/运行错误的定位与解决以下五问全部继承自 runtime/README.md并结合当前仓库源码补充了出错位置。7.1No module named paddle与 CMakeSTRIP报错现象节选CMake Error at CMakeLists.txt:119 (string): string sub-command STRIP requires two arguments. Traceback (most recent call last): File string, line 1, in module ModuleNotFoundError: No module named paddle如 3.3 节所述CMakeLists.txt中通过execute_process(COMMAND python -c import paddle ...)探测 Paddle 安装信息python中找不到paddle模块时输出为空导致后续string(STRIP)缺参。解决在激活的虚拟环境中安装 paddlepaddle 2.4rc确保which python指向venv/bin/python且其中已装好 Paddle。7.2error while loading shared libraries: liblibpaddle.sou2_recognizer_main: error while loading shared libraries: liblibpaddle.so: cannot open shared object file: No such file or directory原因是链接时写入了带-l:libpaddle.so生成的 SONAME 异常liblibpaddle.so。文档给出的修复方法是用patchelf修正已安装库的 sonamecd $YOUR_ENV_PATH/lib/python3.8/site-packages/paddle/fluid patchelf --set-soname libpaddle.so libpaddle.so另外运行时需将 CMake 探测到的PADDLE_LIB_DIRSpaddle/fluid与paddle/libs目录加入LD_LIBRARY_PATH这也是CMakeLists.txt专门输出该变量的目的。7.3 缺少libgfortran.so.5u2_recognizer_main: error while loading shared libraries: libgfortran.so.5: cannot open shared object filelibgfortran.so.5对应 GCC 8 时代的 Fortran 运行时。文档以 GCC 8.2 为例解决方案是安装同版本 gfortranapt-get install gfortran-87.4Undefined reference to _gfortran_concat_string这是 GCC 8 引入的 Fortran 内部符号链接错误。解决保持 gcc 与 gfortran 版本一致均使用 8.2gcc 8.2 gfortran 8.2 组合避免混用不同主次版本的工具链。7.5fatal error: pyconfig.h: No such file or directory./boost/python/detail/wrap_python.hpp:57:11: fatal error: pyconfig.h: No such file or directory编译 pybind11 模块时需要 Python 开发头文件。解决apt-get install python3-dev。八、已知限制流式分贝归一化的在线/离线差异文档 TODO 章节记录了一个明确的已知差异Deepspeech2 使用 linear 特征时在线分贝归一化DecibelNormalizer与离线版本结果存在微小偏差原因是在线计算按 chunk分块读取特征导致归一化时samples.size()与离线整段计算不同。在当前仓库中对应的实现位于 runtime/engine/common/frontend/db_norm.cc 的DecibelNormalizer::Compute()其核心是统计输入样本的均方值得到rms_db计算gain target_db - rms_db超过max_gain_db时直接返回错误再对样本执行item * 10^(gain/20)的原地缩放见 db_norm.cc。文档提示的normalizer.cc:73即该函数中mean_square / samples.size()一行当前源码为第 72 行附近行号随代码演进略有漂移。这一说明对需要在 C 引擎上复现离线识别结果的开发者有直接参考价值chunk 边界不同会带来可预期的微小数值差异属于设计使然而非 bug。九、小结从 clone 到运行的最小路径综合以上各节一份可直接复制的最小构建路径为前提已 clone 仓库、已启动带--privileged的 Paddle Docker 容器并挂载到/workspace# 1. 创建并激活 Python 3.8 虚拟环境 bash tools/venv.sh source venv/bin/activate # 2. 安装满足版本要求的 PaddlePaddle python -m pip install paddlepaddle2.4.2 -i https://mirror.baidu.com/pypi/simple # 3. 编译引擎与示例输出于 build/Linux/x86_64安装于其 install/ 子目录 ./build.sh # 4. 运行推荐示例 pushd examples/u2pp_ol bash run.sh --stop_stage 4排障时按本文第七节顺序检查 Python/Paddle 环境、Paddle 共享库 SONAME、gfortran 版本匹配与 Python 开发头文件即可覆盖文档记录的全部已知问题若构建摘要Building Summary中的WITH_ASR/CLS/VAD、Python 解释器路径与预期不符则回到build.sh的-D参数逐一核对。赞分享人工智能语音音频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点击查看免费下载相关推荐Windows 平台从源码构建 Electron环境准备、GN 编译流程与常见问题排查Windows 平台从源码构建 Electron环境准备、GN 编译流程与常见问题排查 导读 本指南完整讲解如何在 Windows 上从源码编译 Electr桌面应用跨平台前端MarkText Linux 开发环境搭建指南前置依赖、构建准备与常见报错排查MarkText Linux 开发环境搭建指南前置依赖、构建准备与常见报错排查 本篇指南围绕 MarkText 官方开发文档《Linux Specific P桌面应用富文本在 Ubuntu 上从源码编译 StarRocks环境准备、构建流程与常见问题在 Ubuntu 上从源码编译 StarRocks环境准备、构建流程与常见问题 本文基于 StarRocks 官方构建文档 docs/en/develope数据库OLAP数据仓库大数据湖仓一体数据分析上一篇React Snap 项目推荐下一篇uBlock Origin 免费广告拦截器如何五分钟完成安装与被误拦时放行创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表