ARTICLE DETAIL

资讯详情

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

PaddleSpeech 工业级 ASR 部署实战:基于 SpeechX 的 U2/U2++/Deepspeech2 C++ 推理指南

PaddleSpeech 工业级 ASR 部署实战:基于 SpeechX 的 U2/U2++/Deepspeech2 C++ 推理指南 PaddleSpeech 工业级 ASR 部署实战基于 SpeechX 的 U2/U2/Deepspeech2 C 推理指南【免费下载链接】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 仓库中 demos/asr_deployment/README.md 展开系统讲解如何使用 SpeechX 将 U2/U2/Deepspeech2 语音识别模型以 C 方式部署到生产环境。你将从环境准备、SpeechX 编译、WAV 解码FP32/INT8 双精度模式、结果解读四个层面完整掌握一套可落地的工业级 ASR 推理流程并了解其底层识别链路与 RTF/CER 评估口径。一、SpeechX 与 ASR 部署概览SpeechX 是 PaddleSpeech 面向服务端部署场景的 C 语音引擎本文所述 ASR 部署即围绕它展开。核心能力如下多模型支持支持 U2、U2、Deepspeech2 三类 ASR 模型的 C 推理其中 U2/U2 为端到端模型Deepspeech2 为经典 CTC 模型覆盖流式与非流式识别场景双精度推理同时提供 FP32 与 INT8 量化模型推理脚本满足不同算力与延迟要求工业实践导向以 C 实现适合在服务端以较低资源开销承载高并发识别任务。在 PaddleSpeech 仓库中SpeechX 对应 runtime 目录其核心引擎源码位于 runtime/engine/asr包括nnet神经网络前向、decoderCTC 前缀束搜索/TLG 解码器、recognizer识别控制器等模块。二、环境准备部署环境要求如下源自 demos/asr_deployment/README.md 与 runtime/README.md组件版本/要求Python3.7README 文档标注runtime 侧要求 3.8Docker 镜像registry.baidubce.com/paddlepaddle/paddle:2.2.2-gpu-cuda10.2-cudnn7操作系统Ubuntu 16.04.7 LTS编译器gcc/g/gfortran 8.2.0CMake3.16.0PaddlePaddle 2.4rcruntime 构建要求见 runtime/README.md官方推荐在 Docker 容器内进行开发与部署以保证环境一致性。启动容器命令来自 runtime/README.mddocker 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 内存检查可选的前提。三、编译 SpeechX进入容器后按以下步骤构建引擎与示例# 1. 创建 Python 虚拟环境 bash tools/venv.sh # 2. 激活环境并安装 PaddlePaddle当前依赖 develop 分支特性需 nightly 版本 source venv/bin/activate python -m pip install paddlepaddle2.4.2 -i https://mirror.baidu.com/pypi/simple # 3. 构建 engine 与 examples ./build.sh编译产物位于runtime/build/Linux/x86_64/engine/asr下见 path.sh包含nnet、decoder、recognizer、frontend/audio等可执行文件与动态库。常见编译/运行问题排查来自 runtime/README.md FAQ错误解决办法No module named paddleCMake STRIP 报错安装 paddlepaddle 2.4rcliblibpaddle.so: cannot open shared object filecd $YOUR_ENV_PATH/lib/python3.8/site-packages/paddle/fluid patchelf --set-soname libpaddle.so libpaddle.solibgfortran.so.5: cannot open shared object file安装 gfortran-8与 gcc 8.2 匹配Undefined reference to _gfortran_concat_string使用 gcc 8.2 gfortran 8.2pyconfig.h: No such file or directoryapt-get install python3-dev四、U2 ASR 部署实战以 wenetspeech 为例4.1 工程目录与脚本结构官方提供的 U2 在线 ASR 部署示例位于 runtime/examples/u2pp_ol/wenetspeech/结构如下path.sh设置引擎可执行文件、OpenFST、kaldi fstbin/lmbin 等路径环境变量run.sh总控脚本按 stage 执行模型下载、FP32 解码、INT8 解码、WFST 解码local/细分脚本含recognizer.shFP32、recognizer_quant.shINT8、recognizer_wfst.shTLG 图解码、feat.sh、nnet.sh、split_data.sh等RESULTS.mdAISHELL 测试集上的 CER/RTF 结果记录。4.2 初始化环境# 在 speechx/speechx/examples/u2pp_ol/wenetspeech 目录下 source path.shpath.sh会把$ENGINE_BUILD下各二进制目录加入PATH并把 Paddle 库目录写入LD_LIBRARY_PATHpath.sh。4.3 下载模型、准备测试数据与 cmvnrun.sh --stage 0 --stop_stage 1注意原文档示例中该命令用于下载模型并准备数据按 run.sh 的 stage 划分其实际动作包括stage 0下载 U2 wenetspeech 静态模型FP32 与 INT8 量化两个版本、单条测试音频zh.wav并下载 AISHELL 测试集aishell_test.zip生成aishell_test.scpstage 1执行 FP32 解码./local/recognizer.sh。模型与数据均来自 PaddleSpeech 官方 CDN解压后的模型目录包含mean_std.jsoncmvn 统计量、unit.txt词表与export.jit静态图模型。4.4 WAV 解码FP32 与 INT8FP32 解码./local/recognizer.shINT8 量化模型解码./local/recognizer_quant.sh两个脚本的差异仅在于使用的模型目录FP32 使用asr1_chunk_conformer_u2pp_wenetspeech_static_1.3.0.modelexport.jitINT8 使用asr1_chunk_conformer_u2pp_wenetspeech_static_quant_1.3.0.modelexport参见 recognizer.sh 与 recognizer_quant.sh。4.5 识别器关键参数详解FP32 与 INT8 脚本中的recognizer_main参数完全一致均来自 runtime/engine/asr/decoder/param.h 中定义的 gflags 选项recognizer_main \ --use_fbanktrue \ # 使用 fbank 特征false 则用 linear 特征 --num_bins80 \ # fbank 滤波器组个数默认 161 --cmvn_file$model_dir/mean_std.json \ # cmvn 统计文件JSON 格式 --model_path$model_dir/export.jit \ # Paddle 静态图模型INT8 用 export --word_symbol_table$model_dir/unit.txt \# 词表文件 --nnet_decoder_chunk16 \ # 神经网络前向的 chunk 大小 --receptive_field_length7 \ # 两层 CNN(kernel3) 下采样模块的感受野 --subsampling_rate4 \ # 下采样率两层 CNN 降采样 --wav_rspecifierscp:$data/split${nj}/JOB/${aishell_wav_scp} \ # 输入wav scp 列表 --result_wspecifierark,t:$data/split${nj}/JOB/result_recognizer.ark # 输出文本 ark其余常用解码参数在 param.h 中定义可按需调整参数默认值含义--streaming_chunk0.36流式特征 chunk 时长秒见 recognizer_main.cc--sample_rate16000采样率--acoustic_scale1.0声学分数缩放--beam15.0解码束宽--lattice_beam7.5lattice 束宽--max_active7500最大活跃状态数--ctc_weight0.5CTC 分数与重打分分数结合时的 CTC 权重--rescoring_weight1.0attention 重打分权重--reverse_weight0.3双向 Transformer 重打分时右到左解码器权重非双向时须为 0.0--nbest10CTC WFST/前缀搜索的候选数--blank0vocab 中 blank id--num_left_chunks-1解码时左侧 chunk 数--blank_threshold0.98blank 跳过阈值4.6 识别流程与实时输出解读recognizer_main主程序runtime/engine/asr/recognizer/recognizer_main.cc的执行链路为通过wav_rspecifier读取 scp 列表中的 WAVkaldiWaveHolder按streaming_chunk × sample_rate计算 chunk 采样点数逐块喂给RecognizerControllerImpl对应feature_cache.h中的特征缓存全部块送入后调用SetInputFinished()并WaitDecoderFinished()调用AttentionRescoring()执行 attention 重打分输出最终识别文本并统计 RTF。真实运行输出示例来自 demos/asr_deployment/README.mdI1026 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.043697 48038 u2_recognizer_main.cc:87] Pratial result: 4 这令 I1026 16:13:25.222124 48038 u2_recognizer_main.cc:87] Pratial result: 5 这令被贷款 I1026 16:13:25.228385 48038 u2_recognizer_main.cc:87] Pratial result: 6 这令被贷款 I1026 16:13:25.414669 48038 u2_recognizer_main.cc:87] Pratial result: 7 这令被贷款的员工 I1026 16:13:25.420714 48038 u2_recognizer_main.cc:87] Pratial result: 8 这令被贷款的员工 I1026 16:13:25.608129 48038 u2_recognizer_main.cc:87] Pratial result: 9 这令被贷款的员工们请 I1026 16:13:25.801620 48038 u2_recognizer_main.cc:87] Pratial result: 10 这令被贷款的员工们请食难安 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:25.948771 48038 u2_recognizer_main.cc:87] Pratial result: 11 这令被贷款的员工们请食难安 I1026 16:13:26.246963 48038 u2_recognizer_main.cc:113] BAC009S0916W0495 这令被贷款的员工们请食难安从输出可以观察三个关键信息流式中间结果Pratial result行展示随音频流入逐步增长的局部识别文本体现 U2 的流式特性最终结果utt 文本行u2_recognizer_main.cc:113输出该条音频的最终识别结果RTF 统计程序结束时会输出total wav duration、total decode cost与RTF is: xxx见 recognizer_main.cc。4.7 单条 WAV 识别如需只识别单条音频可手工构造 scp 文件key path/to/wav/file然后通过--wav_rspecifier指定该 scp 即可例如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:single.scp \ --result_wspecifierark,t:result.txt其余参数含义可用recognizer_main --help查看。五、解码结果与评估口径原文档给出了 U2 模型在 AISHELL 测试集上的官方结果评估口径如下CER在 AISHELL-test 上计算RTFReal-Time Factor的计算包含提特征与解码全过程属端到端口径测试机器Intel(R) Xeon(R) Gold 6271C CPU 2.60GHz支持avx512_vnni。5.1 FP32 结果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.3153375.2 INT8 结果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.2696745.3 结果解读与量化收益CER 对比FP32 为 5.75%INT8 为 5.83%量化后字符错误率仅上升约 0.08 个百分点精度损失极小RTF 对比FP32 为 0.315INT8 为 0.270INT8 相对 FP32 提速约 14%且该 RTF 为提特征 解码的端到端口径CER 统计项说明N为总字数C为正确字数S为替换错误D为删除错误I为插入错误CER (SDI)/N。此外在 RESULTS.md 中还记录了 TLGWFST 图解码器local/recognizer_wfst.sh在 AISHELL 测试集上 7176 条、36108.9 秒音频的结果CER 4.73%未含 attention 重打分、RTF 0.283可作为引入外部语言模型图TLG时进一步降低 CER 的参考。六、深入源码识别链路关键模块为便于进一步定制与二次开发下面梳理 SpeechX ASR 引擎的核心模块均位于 runtime/engine/asrnnetruntime/engine/asr/nnet神经网络前向模块。u2_nnet.cc负责 Paddle 模型推理u2_onnx_nnet.cc支持 ONNX 模型nnet_producer.cc以生产者模式向识别器提供特征。decoderruntime/engine/asr/decoder解码模块ctc_prefix_beam_search_decoder.cc实现 CTC 前缀束搜索ctc_tlg_decoder.cc实现 TLG 图解码参数定义见 param.h。recognizerruntime/engine/asr/recognizer识别控制器recognizer_controller_impl.cc串联前端、nnet 与 decoderrecognizer_main.cc为 WAV 解码入口。serverruntime/engine/asr/server/websocketWebSocket 服务端/客户端支持将识别能力封装为网络服务。在 runtime/examples/u2pp_ol/wenetspeech/local/ 中还提供了recognizer_fastdeploy.sh、recognizer_wfst_fastdeploy.shFastDeploy 加速版以及run_build_tlg.sh构建 TLG 图等进阶脚本可按需扩展部署形态。七、总结与下一步本文完整覆盖了基于 SpeechX 的 U2/U2/Deepspeech2 ASR C 部署全流程环境与依赖版本Python 3.7/3.8、Docker、gcc 8.2、CMake 3.16SpeechX 的编译与常见问题以 U2 wenetspeech 为例的 WAV 解码FP32/INT8recognizer_main全量参数与底层识别链路CER/RTF 评估口径与量化收益分析。在掌握基础部署后可以继续探索在 runtime/examples/u2pp_ol/wenetspeech 基础上用--wav_rspecifier接入自有音频数据结合 runtime/examples/u2pp_ol/wenetspeech/local/recognizer_wfst.sh 引入 TLG 语言模型图降低 CER参考 runtime/engine/asr/server/websocket 将识别能力封装为在线服务结合 examples/wenetspeech/asr1 训练并导出自己的静态模型替换默认模型进行私有化部署。【免费下载链接】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),仅供参考
返回列表