ARTICLE DETAIL

资讯详情

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

PaddleSpeech 基于 SpeechX 的 C++ ASR 部署指南:U2/U2++/DeepSpeech2 模型 FP32 与 INT8 推理实战

PaddleSpeech 基于 SpeechX 的 C++ ASR 部署指南:U2/U2++/DeepSpeech2 模型 FP32 与 INT8 推理实战 PaddleSpeech 基于 SpeechX 的 C ASR 部署指南U2/U2/DeepSpeech2 模型 FP32 与 INT8 推理实战【免费下载链接】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/gh_mirrors/pa/PaddleSpeech导读本文基于 PaddleSpeech 仓库中的 ASR 部署示例demos/asr_deployment/README_cn.md系统讲解如何利用 SpeechX 运行时对 U2 / U2 / DeepSpeech2 等主流 ASR 模型进行 C 端部署。文中覆盖从环境搭建、SpeechX 编译、模型与测试数据准备到 FP32 / INT8 双精度解码的完整操作流程并结合 runtime 目录下的引擎源码与示例脚本深入剖析recognizer_main的流式分块推理机制、核心命令行参数含义以及 CER / RTF 指标的计算口径。读完本文你将能够独立在 Linux 环境如 Ubuntu 16.04 Docker中跑通一套端到端的 C ASR 离线/流式识别管线并理解量化部署带来的精度与性能权衡。一、简介为什么用 C 部署 ASR在工业实践中语音识别模型上线时往往需要脱离 Python 训练框架、以更高的吞吐和更低的延迟运行。SpeechX 是 PaddleSpeech 提供的 C 推理运行时本部署方案通过它实现对U2、U2、DeepSpeech2三类经典 ASR 模型的 C 部署U2统一流式与非流式Unified Streaming and Non-streaming两阶段模型兼顾 CTC 前缀束搜索的流式输出与 Attention Rescoring 的精度修正U2U2 的增强版引入双向left-to-right / right-to-left解码器重打分rescoring精度更高是当前仓库部署示例的主角DeepSpeech2经典的端到端语音识别模型同样支持该运行时部署。从源码结构看C 推理引擎整体位于 runtime/engine/asr包含nnet神经网络前向、decoder解码器、recognizer识别器控制器与serverWebSocket 服务四大子模块对应的可运行示例位于 runtime/examples/u2pp_ol/wenetspeech示例采用wenetspeech 上训练的 U2 Chunk Conformer 静态模型在 AISHELL-1 测试集上评测。二、环境准备部署示例对编译与运行环境有明确要求原文档列出的环境如下组件版本要求Python3.7Docker 镜像registry.baidubce.com/paddlepaddle/paddle:2.2.2-gpu-cuda10.2-cudnn7操作系统Ubuntu 16.04.7 LTS编译器gcc / g / gfortran 8.2.0CMake3.16.0几点实操建议Docker 镜像中已内置 CUDA 10.2 / cuDNN 7 与对应版本的 PaddlePaddle 运行时run.sh在编译阶段依赖PADDLE_LIB_PATH定位 Paddle 动态库见 runtime/examples/u2pp_ol/wenetspeech/path.sh 中被注释的paddle.sysconfig.get_include()逻辑因此建议直接在上述 Docker 容器内进行编译与运行避免宿主环境库版本冲突若 CPU 指令集支持avx512_vnniINT8 量化模型的推理会获得额外加速本文第五节的结果即在该类 CPU 上测得gfortran 8.2.0 是编译 Kaldi 风格特征前端如 OpenBLAS、线性代数依赖所必需的请确保与 gcc 版本一致。三、编译 SpeechX 运行时示例脚本run.sh在首次运行时若检测不到SPEECHX_BUILD目录即编译产物会自动进入SPEECHX_ROOT执行bash build.sh完成整仓编译对应 runtime/examples/u2pp_ol/wenetspeech/run.shif [ ! -d ${SPEECHX_BUILD} ]; then pushd ${SPEECHX_ROOT} bash build.sh popd fi编译完成后产物默认位于runtime/build/Linux/x86_64/engine/asr下并通过path.sh将以下关键二进制目录加入PATH见 path.shnnet神经网络前向相关 bin如u2_nnet_main、u2_onnx_nnetdecoderCTC 前缀束搜索 / TLG 解码器 binrecognizer识别器主程序recognizer_mainkaldi/fstbin、kaldi/lmbinWFST 解码与语言模型工具frontend/audio音频与特征前端工具。整个引擎的 CMake 组织可参看 runtime/engine/asr/CMakeLists.txt其依赖openblas、openfst、kenlm、paddleinference、fastdeploy 等由 runtime/cmake 下的脚本统一管理。四、U2 识别部署完整实操以下步骤对应原文档第三节「例子」实际操作目录为 runtime/examples/u2pp_ol/wenetspeech。4.1 初始化环境变量source path.sh该脚本会校验编译产物是否存在并将recognizer_main等 bin 与LD_LIBRARY_PATH配置好PADDLE_LIB_PATH需在容器内由 Paddle 环境自动注入。4.2 下载模型、准备测试数据与 cmvnrun.sh --stage 0 --stop_stage 1注意原文档此处写作--stage 0 --stop_stage 1而当前仓库中run.sh的阶段划分已调整为 stage 0 负责「下载模型与数据」、stage 1 与 stage 2 分别执行 FP32 与 INT8 解码见 run.sh建议以仓库脚本实际为准。stage 0 将自动完成下载FP32 静态模型asr1_chunk_conformer_u2pp_wenetspeech_static_1.3.0.model.tar.gz解压后得到export.jitPaddle 静态图模型、mean_std.jsoncmvn 均值方差文件与unit.txt词表/符号表下载INT8 量化模型asr1_chunk_conformer_u2pp_wenetspeech_static_quant_1.3.0.model.tar.gz准备两个测试输入单条中文测试音频zh.wav生成wav.scp与 AISHELL-1 测试集aishell_test.zip生成aishell_test.scp每条utt_id wav 绝对路径。scp文件是 Kaldi 风格的输入描述格式例如BAC009S0764W0121 /workspace/PaddleSpeech/runtime/examples/u2pp_ol/wenetspeech/data/test/S0764/BAC009S0764W0121.wav BAC009S0764W0122 /workspace/PaddleSpeech/runtime/examples/u2pp_ol/wenetspeech/data/test/S0764/BAC009S0764W0122.wav如需识别单个音频只需构造形如key path/to/wav/file的两列 scp 即可详见 runtime/examples/u2pp_ol/wenetspeech/README.md。4.3 解码FP32 与 INT8# FP32 ./local/recognizer.sh # INT8 ./local/recognizer_quant.sh两个脚本结构完全一致recognizer.sh 与 recognizer_quant.sh差异仅在于模型目录FP32 指向asr1_chunk_conformer_u2pp_wenetspeech_static_1.3.0.model/INT8 指向asr1_chunk_conformer_u2pp_wenetspeech_static_quant_1.3.0.model/INT8 脚本的--model_path直接传模型目录名exportPaddle 量化导出产物FP32 传export.jit日志与结果文件分别写到recognizer.log/recognizer.quant.log结果汇总到exp/aishell_recognizer与exp/aishell.recognizer.quant.rsl。脚本内部以nj20并行分片utils/run.pl JOB1:$nj每个 JOB 调用一次recognizer_main最终用 utils/compute-wer.py 以--char1字符级计算 CER 并打印尾部统计。4.4 解码输出解读原文档给出了单条音频的典型输出这里结合源码解释每一类日志对应 recognizer_main.ccI1026 16:13:24.683531 48038 u2_recognizer_main.cc:55] utt: BAC009S0916W0495 I1026 16:13:24.683578 48038 u2_recognizer_main.cc:56] wav dur: 4.17119 sec. I1026 16:13:24.683595 48038 u2_recognizer_main.cc:64] wav len (sample): 66739 I1026 16:13:25.037652 48038 u2_recognizer_main.cc:87] Pratial result: 3 这令 I1026 16:13:25.222124 48038 u2_recognizer_main.cc:87] Pratial result: 5 这令被贷款 I1026 16:13:25.608129 48038 u2_recognizer_main.cc:87] Pratial result: 9 这令被贷款的员工们请 I1026 16:13:25.804101 48038 feature_cache.h:44] set finished I1026 16:13:25.804128 48038 feature_cache.h:51] compute last feats done. I1026 16:13:26.246963 48038 u2_recognizer_main.cc:113] BAC009S0916W0495 这令被贷款的员工们请食难安utt / wav dur / wav len读取到测试语句 ID、音频时长秒与采样点数Pratial result: N ...流式解码过程中的部分结果N为已累积的帧/分块编号体现 U2 的流式输出能力——边接收音频边给出中间识别文本feature_cache.h: set finished / compute last feats done整段音频输入完毕后特征缓存完成收尾计算对应 runtime/engine/asr/nnet/nnet_producer.cc 中的生产者-消费者缓存最后一行utt 识别文本经过Attention Rescoring重打分后的最终结果由result_writer写入ark,t格式结果文件。4.5 主程序的流式推理原理从 recognizer_main.cc 可以看出 C 部署的流式处理骨架默认--streaming_chunk0.36秒、--sample_rate16000因此每块音频为0.36 × 16000 5760个采样点主循环把 wav 按块切分逐块调用recognizer_ptr-Accept(wav_chunk)送入特征前端fbank 提取全部送入后调用SetInputFinished()并等待解码线程结束nnet_producer.h 中的 Accept / Reset 接口即此缓存队列随后执行AttentionRescoring()用解码器得分与 CTC 得分加权融合得到最终结果结束时统计total wav duration、total decode cost并打印RTF is: ...其中RTF 总解码耗时 / 总音频时长含提特征与解码更贴近端到端口径。五、核心参数详解recognizer_main的关键参数定义集中在 runtime/engine/asr/decoder/param.h 与 runtime/engine/asr/recognizer/recognizer_main.cc。下表为示例脚本中实际使用的参数及其源码注释含义参数示例值默认值源码注释/作用--use_fbanktruefalse使用 fbank 特征false 表示线性特征--num_bins80161Mel 滤波器组个数--cmvn_filemean_std.jsoncmvn 均值-方差文件路径--model_pathexport.jit/exportavg_1.jit.pdmodelPaddle 静态图模型路径--word_symbol_tableunit.txt词/字符号表--nnet_decoder_chunk161神经网络前向解码分块数--receptive_field_length77两个 CNN(kernel3) 下采样模块的感受野长度--subsampling_rate44两个 CNN(kernel3) 模块的下采样率--wav_rspecifierscp:...测试音频 rspecifier--result_wspecifierark,t:...识别结果 wspecifier5.1 解码分块参数与感受野--nnet_decoder_chunk、--receptive_field_length、--subsampling_rate三者共同决定模型前向的输入窗口大小与步长。在 ctc_prefix_beam_search_decoder_main.cc 中可看到如下计算int32 chunk_size FLAGS_receptive_field_length (FLAGS_nnet_decoder_chunk - 1) * FLAGS_subsampling_rate; int32 chunk_stride FLAGS_subsampling_rate * FLAGS_nnet_decoder_chunk;即一次前向所需帧数 感受野长度 分块数 - 1× 下采样率相邻两次前向的帧步长 下采样率 × 分块数。以示例取值7, 16, 4为例chunk_size 7 15 × 4 67 帧chunk_stride 64 帧——这正是 Chunk Conformer 流式模型中「当前块 左侧缓存上下文」的典型配置保证流式解码的因果性。subsampling_rate还会被U2Nnet读取模型属性覆盖见 u2_nnet.cc。5.2 其他可调解码参数param.h中还定义了示例脚本未显式传入、使用默认值的解码器参数按需可追加到命令行--acoustic_scale1.0声学分数权重--beam15.0、--lattice_beam7.5、--max_active7500束搜索规模控制--ctc_weight0.5、--rescoring_weight1.0CTC 得分与重打分得分的融合权重ctc_prefix_beam_search_score.h中实现--reverse_weight0.3仅当使用双向 Transformer 解码器时该值 0 才启用从右到左解码U2 即属于此情形--num_left_chunks-1解码时可用的左侧块数-1 表示不限制--blank_threshold0.98blank 跳过阈值。5.3 特征输入模式除直接解码 wav 外示例还支持「特征输入」模式feat.sh负责将mean_std.json转换为 Kaldi 格式的 cmvn 并抽取 fbank 特征之后可走recognizer_main的--feature_rspecifier输入详见 runtime/examples/u2pp_ol/wenetspeech/README.md。--use_fbank、--num_bins等参数即在该模式下决定特征口径。六、部署结果CER 与 RTF 对比原文档在「结果」一节给出了测试口径CER 在aishell-test上计算RTF 包含提特征与解码更端到端。仓库中的完整评测数据见 runtime/examples/u2pp_ol/wenetspeech/RESULTS.md。6.1 FP32 推理原文档测试机器 Intel Xeon Gold 6271C记录Overall - 5.75 % N104765 C99035 S5587 D143 I294 Mandarin - 5.75 % N104762 C99035 S5584 D143 I294 English - 0.00 % N0 C0 S0 D0 I0 Other - 100.00 % N3 C0 S3 D0 I0RTF is: 0.315337RESULTS.md 在 Intel Xeon Gold 6148同样支持 avx512_vnni上测得 FP32 RTF 为0.265234总时长 36108.9 秒 / 总耗时 9577.31 秒。CER 统计行中的N/C/S/D/I含义为N总字符数、C正确、S替换、D删除、I插入CER (S D I) / N。6.2 INT8 量化推理原文档记录 INT8 结果CER 5.87% 与 5.83% 在不同版本文档中略有出入以仓库 RESULTS.md 为准Overall - 5.83 % N104765 C98943 S5675 D147 I286 Mandarin - 5.83 % N104762 C98943 S5672 D147 I286 English - 0.00 % N0 C0 S0 D0 I0 Other - 100.00 % N3 C0 S3 D0 I0RTF is: 0.269674INT8 相比 FP32CER 从 5.75% 略升至 5.83%约 0.08 个百分点精度损失极小而 RTF 在支持avx512_vnni的机器上有望获得可观加速原文档 6271C 机器上 FP32 RTF 0.315337 → INT8 RTF 0.269674提速约 14%。这说明在延迟敏感、对精度容错较高的工业场景中INT8 量化是性价比很高的部署选项。6.3 附加TLG 解码无 Attention RescoringRESULTS.md还提供了recognizer_wfst.shTLG 词图解码、不做 Attention Rescoring的参考结果CER 4.73%N104765C100001S4283D481I187RTF 0.283。该路径对应ctc_tlg_decoder见 runtime/engine/asr/decoder/ctc_tlg_decoder.cc适合结合外部语言模型与 WFST 做工业级解码方案。七、总结本文完整走通了 PaddleSpeech 中「SpeechX C ASR 部署」的实战链路部署对象U2 / U2 / DeepSpeech2 模型以 wenetspeech 训练的 U2 Chunk Conformer 静态模型为示例运行方式Ubuntu 16.04 Paddle 2.2.2 Docker 环境内编译 runtime 引擎通过 run.sh 一键完成模型下载、数据准备与 FP32/INT8 解码原理支撑recognizer_main.cc 展示了 0.36s 分块的流式推理 Attention Rescoring 两阶段解码param.h 定义了感受野、下采样率、束宽、CTC/重打分权重等全部关键参数效果衡量AISHELL-1 测试集上 FP32 CER 5.75%、RTF 0.265~0.315INT8 CER 5.83%、RTF 0.270量化方案在近乎无损精度下显著提升解码速度。对于希望进一步扩展的读者runtime/examples/u2pp_ol 下还提供了 FastDeployONNX与 WFST 解码等变体脚本可直接在示例目录中参考对应local/*.sh的使用方式。【免费下载链接】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/gh_mirrors/pa/PaddleSpeech创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表