PaddleSpeech C++ Runtime 部署 U2/U2++ 流式 ASR:wenetspeech 静态模型推理与 CER 评测实战
人工智能语音音频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/examples/u2pp_ol/wenetspeech/README.md 部署示例展开介绍如何用 PaddleSpeech 的 C 引擎SpeechX Runtime加载 WenetSpeech asr1 配方导出的 U2/U2 静态模型完成 wav 与特征两种输入的流式识别并计算 AISHELL-1 测试集上的 CER同时结合 run.sh、local/ 下的各解码脚本与 path.sh深入剖析每一步的底层二进制、关键参数chunk、receptive_field_length、subsampling_rate 等与量化/WFST 解码的扩展用法。示例定位与模型来源该目录是 U2/U2 流式模型的 C 部署示例对应训练配方位于 examples/wenetspeech/asr1。原文档明确了模型形态这里使用的是export导出的静态static模型即训练侧先将动态图模型导出为可被 C 侧 Paddle Inference 加载的静态形态部署侧不再依赖 Python 训练框架。README 给出的定位信息可以概括为三点目标演示如何用 u2/u2 模型识别wav并计算CER测试数据使用 AISHELL-1 作为测试集模型获取run.sh会自动下载导出的静态模型模型下载地址在run.sh中定义。从 run.sh 的源码看stage 0 会下载三组资源资源文件说明U2 静态模型asr1_chunk_conformer_u2pp_wenetspeech_static_1.3.0.model.tar.gzfp32 静态模型解压后含export.jit、mean_std.json、unit.txtU2 量化模型asr1_chunk_conformer_u2pp_wenetspeech_static_quant_1.3.0.model.tar.gz量化静态模型用于量化推理单条测试音频zh.wav生成data/wav.scputt1 wav 绝对路径AISHELL 测试集aishell_test.zip解压后生成data/test/并构造data/aishell_test.scp其中aishell_test.scp的构造方式是先realpath列出全部 wav再用awk提取不含目录和扩展名的 utt id最后paste两列生成utt_id wav_path格式的 scp 文件见 run.sh。运行环境与二进制定位path.sh运行任何 stage 之前都需要先 source 环境脚本. path.shpath.sh 的核心逻辑通过ENGINE_ROOT$PWD/../../../反推到 runtime 仓库根目录即 runtime/期望编译产物位于build/Linux/x86_64/engine/asrSPEECHX_BUILD若目录不存在会报错提示请确保项目编译成功将以下 bin 目录加入PATHengine/asr/nnet、engine/asr/decoder、engine/common/frontend/audio、engine/asr/recognizer以及 openfst 的fstbin/lmbin若 run.sh 检测到SPEECHX_BUILD不存在会自动cd $SPEECHX_ROOT bash build.sh触发一次编译。因此本示例的前提是已经按 runtime/README.md 完成了 runtime 工程的 CMake 编译且PADDLE_LIB_PATH指向对应版本 PaddlePaddle 的推理库。整体执行流程run.sh stage 划分README 给出的标准执行顺序是# 0. 下载数据集和模型 ./run.sh --stop_stage 0 # 1. 处理 cmvn 并计算特征fbank ./run.sh --stage 1 --stop_stage 1 # 2. 使用特征fbank输入解码 ./run.sh --stage 2 --stop_stage 2 # 3. 使用 wav 输入解码u2_recognizer_main ./run.sh --stage 3 --stop_stage 3需要注意当前仓库中的 run.sh 与早期 README 的 stage 编号存在演进差异。当前版本中 stage 1/2/3 实际调用的是stage1→ local/recognizer.shwav 输入解码fp32 静态模型stage2→ local/recognizer_quant.shwav 输入解码量化模型stage3→ local/recognizer_wfst.shwav 输入 WFST 图解码。而 README 中处理 cmvn 并计算特征的步骤对应保留下来的 local/feat.sh./local/feat.sh --stage 1 --stop_stage 1也就是说README 描述的是先离线算 fbank 再解码的两段式流程当前 run.sh 则把重心放在了 wav 直接输入与量化/WFST 变体上。两者互补feat.sh 产出fbank.ark/scp后可交给u2_nnet_main做纯网络前向解码见下文。特征计算与 cmvnfeat.shlocal/feat.sh 使用compute_fbank_main并行计算流式 fbank 特征compute_fbank_main \ --num_bins 80 \ --cmvn_file$model_dir/mean_std.json \ --streaming_chunk36 \ --wav_rspecifierscp:$data/split${nj}/JOB/${aishell_wav_scp} \ --feature_wspecifierark,scp:$data/split${nj}/JOB/fbank.ark,$data/split${nj}/JOB/fbank.scp关键参数说明--num_bins 8080 维 mel 滤波 bank与 U2/U2 模型输入维度一致--cmvn_filemean_std.json模型目录随附的均值/方差文件README 提到的convert cmvn 文件格式即指训练侧的 cmvn 统计需要转换为该 json 形态供 C 前端加载--streaming_chunk36以 36 帧为一个 chunk 计算模拟流式分块场景保证离线特征与流式推理时的分块方式一致输出fbank.ark/fbank.scp是 Kaldi 风格的特征容器/索引对后续u2_nnet_main直接以ark,t:读取。脚本先用local/split_data.sh把 scp 切成nj20份再由utils/run.pl做多作业并行。wav 输入解码recognizer.sh这是 README Decoding using wav input 对应的核心流程。local/recognizer.sh 调用recognizer_main全量参数如下recognizer_main \ --use_fbanktrue \ --num_bins80 \ --cmvn_file$model_dir/mean_std.json \ --model_path$model_dir/export.jit \ --word_symbol_table$model_dir/unit.txt \ --nnet_decoder_chunk16 \ --receptive_field_length7 \ --subsampling_rate4 \ --wav_rspecifierscp:$data/split${nj}/JOB/${aishell_wav_scp} \ --result_wspecifierark,t:$data/split${nj}/JOB/result_recognizer.ark参数逐项解析参数示例值含义--use_fbanktrue由 C 侧前端从 wav 在线计算 fbank否则读离线特征--num_bins80mel 滤波数--cmvn_filemean_std.json特征归一化统计文件--model_pathexport.jit导出的静态模型文件--word_symbol_tableunit.txt词表/单元表用于将输出 id 映射为字符--nnet_decoder_chunk16解码器每次喂给网络的 chunk 大小帧与 U2/U2 的 chunk 式流式解码约定一致--receptive_field_length7流式解码时因卷积感受野需要额外延迟的帧数用于对齐能出结果的边界--subsampling_rate4CNN 下采样倍率决定特征帧到时间步的缩放--wav_rspecifierscp:file输入 scp每行utt_id wav 路径--result_wspecifierark,t:file.ark解码结果输出关于输入 scp 的格式README 给出了样例对应 AISHELL 测试集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只识别单条 wav时只需自行构造两行式的 scpkey path/to/wav/file然后给u2_recognizer_main/recognizer_main指定--wav_rspecifier即可其余 flag 的含义可运行u2_recognizer_main --help查看README 建议的自查方式。解码完成后脚本把 20 份分片的result_recognizer.ark合并为exp/aishell_recognizer并调用utils/compute-wer.py --char1以字符级对齐计算 CERutils/compute-wer.py --char1 --v1 $text $exp/aishell_recognizer $exp/aishell.recognizer.err其中$text是 AISHELL 的data/test/text参考文本。量化模型解码recognizer_quant.shlocal/recognizer_quant.sh 与 recognizer.sh 结构完全相同差异仅有两处模型目录换成asr1_chunk_conformer_u2pp_wenetspeech_static_quant_1.3.0.model/且--model_path$model_dir/export量化模型的文件名是export而 fp32 版本是export.jit结果输出到独立的recognizer.quant.rsl.ark并单独计算一份aishell.recognizer.quant.err。这样可以在同一测试集上直接对比 fp32 与量化模型的 CER 损失验证量化对精度的影响。WFST 解码扩展recognizer_wfst.shlocal/recognizer_wfst.sh 在 wav 输入的基础上叠加了 WFST 语言图约束。相比 recognizer.sh 的增量--graph_path$lang_dir/TLG.fst \ --word_symbol_table$lang_dir/words.txt \ --rescoring_weight0.0 \ --acoustic_scale2语言包目录data/lang_test/内含TLG.fst与words.txt脚本在图不存在时会自动下载预编译的中文 ngram 图包tlg.zip如果想自己构建图README 指向 local/run_build_tlg.sh该脚本会调用 ngram 训练流程相关工具脚本见 local/aishell_train_lms.sh--acoustic_scale控制声学模型与语言模型的对齐权重示例中取 2。离线特征解码u2_nnet_mainnnet.sh对应 README Decoding using feature input 的底层实现是 local/nnet.shu2_nnet_main \ --model_path$model_dir/export.jit \ --vocab_path$model_dir/unit.txt \ --feature_rspecifierark,t:${data}/split${nj}/JOB/fbank.ark \ --nnet_decoder_chunk16 \ --receptive_field_length7 \ --subsampling_rate4 \ --acoustic_scale1.0 \ --nnet_encoder_outs_wspecifierark,t:$exp/encoder_outs.ark \ --nnet_prob_wspecifierark,t:$exp/logprobs.ark它与recognizer_main的区别在于输入是 feat.sh 产出的离线fbank.ark同时会额外落盘 encoder 输出encoder_outs.ark与词表概率logprobs.ark便于调试与离线分析网络中间状态。可以推断这条路径适合验证特征口径是否一致即离线 fbank 与 wav 在线 fbank 的等价性。评测结果与注意事项各配置下的测试集结果请见 RESULTS.mdREADME 将其作为唯一结果入口模型文件名中的1.3.0标识了对应的 PaddleSpeech 模型版本run.sh的下载 URL 与本地文件名必须一致解压失败时优先检查网络与该 tag 是否匹配README 中的 stage 编号1cmvn/特征、2特征解码、3wav 解码与当前 run.sh 的 stage 映射1wav 解码、2量化、3WFST存在版本演进差异实操时建议以 run.sh 中实际的脚本调用关系为准并按需单独执行local/feat.sh完成特征口径准备所有解码均为多作业并行默认nj20最终结果合并后统一计算字符级错误率CER保证评测可复现。赞分享人工智能语音音频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 SpeechX 实战U2/U2/DeepSpeech2 模型的 C 流式 ASR 部署指南PaddleSpeech SpeechX 实战U2/U2/DeepSpeech2 模型的 C 流式 ASR 部署指南 SpeechX 是 Paddle人工智能语音音频NLP媒体生成PaddleSpeech 基于 SpeechXruntime的 U2/U2 流式 ASR C 工业部署实战指南PaddleSpeech 基于 SpeechXruntime的 U2/U2 流式 ASR C 工业部署实战指南 PaddleSpeech 仓库中的人工智能语音音频NLP媒体生成PaddleSpeech Runtime 示例指南在 C 引擎上运行 U2/U2 流式 ASR 解码与 CER 评测PaddleSpeech Runtime 示例指南在 C 引擎上运行 U2/U2 流式 ASR 解码与 CER 评测 本文围绕 runtime/exa人工智能语音音频NLP媒体生成上一篇Awesome-Chinese-LLM 中文开源大模型选型指南从底座模型到垂直微调用一份清单筛出可部署方案下一篇PocketPal AI开发终极指南从零构建移动端AI助手应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考