尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

PaddleSpeech 在线 ASR 引擎源码解析:paddlespeech.server.engine.asr.online.python 模块实战指南

发布时间:2026/9/23 22:40:10

资讯中心
01
ARTICLE

PaddleSpeech 在线 ASR 引擎源码解析:paddlespeech.server.engine.asr.online.python 模块实战指南

PaddleSpeech 在线 ASR 引擎源码解析:paddlespeech.server.engine.asr.online.python 模块实战指南
人工智能语音音频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 服务端在线语音识别Streaming ASR的 Python 引擎实现展开以paddlespeech.server.engine.asr.online.python包为切入点深入剖析其三大核心类ASREngine、ASRServerExecutor、PaddleASRConnectionHanddler的职责划分、流式特征提取、分块解码、CTC 前缀束搜索、端点检测与二次 rescoring 的完整调用链。读完本文你将掌握 PaddleSpeech 在线 ASR 服务器如何把一段持续流入的 PCM 音频切分成可实时解码的 chunk理解conformer_online与deepspeech2online两种模型在在线场景下的差异并能直接阅读对应的服务器配置文件与源码进行二次开发。模块定位在线 ASR 引擎在服务端架构中的位置paddlespeech.server.engine.asr.online目录下并列了三种引擎后端python/本文主体纯 Python/Paddle 动态图实现同时兼容 Paddle Inference predictor 与动态图模型paddleinference/基于 Paddle Inference 静态图预测的在线引擎onnx/基于 ONNX Runtime 的在线引擎。三种后端共享同一套在线解码算法基础设施ctc_endpoint.pyCTC 端点检测与ctc_search.pyCTC 前缀束搜索位于 paddlespeech/server/engine/asr/online/ 目录下与具体的模型推理框架解耦。这意味着无论底层是动态图、静态图还是 ONNX流式解码与断句策略都是同一套逻辑。从服务端整体看在线 ASR 属于protocol: websocketengine_list: [asr_online]的组合见 ws_conformer_application.yaml。WebSocket 协议层paddlespeech/server/ws/下的 asr API每建立一个连接就会通过引擎的new_handler()创建一个独立的连接处理器Connection Handler保证多路并发连接之间互不干扰。三大核心类引擎、执行器、连接处理器该包对外导出的 API 定义在 asr_engine.py__all__ [PaddleASRConnectionHanddler, ASRServerExecutor, ASREngine]三个类职责分明对应三层生命周期类生命周期职责基类ASREngine进程级单例加载服务配置、初始化设备与模型、创建连接处理器BaseEngineSingleton 元类ASRServerExecutor进程级模型/资源初始化、配置合并与校验、文本特征器ASRExecutorCLI 执行器PaddleASRConnectionHanddler每路 WebSocket 连接一个流式特征提取、增量解码、端点检测、结果输出无普通类ASREngine单例引擎与设备管理ASREngine继承自 base_engine.py 的BaseEngine而BaseEngine使用Singleton元类保证整个服务进程内只有一份引擎资源。其init(config)方法asr_engine.py完成保存服务配置字典self.config创建ASRServerExecutor从配置中读取device默认paddle.get_device()并调用paddle.set_device设备不可用或已被占满时会给出请将 server 设置为 cpu的明确提示并退出调用init_model()完成模型加载失败则返回False。作为在线引擎它主动将preprocess、run、postprocess三个方法置为NotImplementedErrorasr_engine.py这与离线引擎一次输入一次输出的范式划清界限——在线引擎的输入是持续到达的音频流处理单元是连接而非请求。每个连接通过new_handler()asr_engine.py返回一个PaddleASRConnectionHanddler实例。ASRServerExecutor模型资源与配置校验ASRServerExecutor继承自 CLI 的ASRExecutor构造时通过CommonTaskResource(taskasr, model_formatdynamic, inference_modeonline)声明这是一个动态图格式的在线推理任务。它负责三类关键工作路径解析与资源下载_init_from_path()asr_engine.py根据model_type、lang、sample_rate、codeswitch拼装资源 tag形如conformer_online_multicn-zh-16k从资源目录或显式传入的cfg_path/am_model/am_params定位模型若未显式指定路径则自动从MODEL_HOME下载对应资源。配置通过CfgNode(new_allowedTrue)合并 YAML 得到并据此构建TextFeaturizer支持unit_type、vocab与spm_model_prefix子词模型。在线专属的配置修正update_config()asr_engine.py针对不同模型做差异化处理deepspeech2将decode.lang_model_path重写为MODEL_HOME/language_model/下的绝对路径并从资源表中取出语言模型 URL 与 MD5 完成下载校验在线解码依赖外部语言模型做束搜索打分conformer/transformer支持通过 CLI 参数覆盖decoding_method与num_decoding_left_chunks且仅允许ctc_prefix_beam_search与attention_rescoring两种解码方式其余值会被强制改写为attention_rescoring这也是在线服务的默认推荐。模型加载分支init_model()asr_engine.py中deepspeech2走init_predictor(model_file, params_file, predictor_conf)加载 Paddle Inference 静态图预测器conformer/transformer则根据model_type去掉数据集后缀得到model_name通过task_resource.get_model_class(model_name)动态获取模型类from_config构建后set_state_dict(paddle.load(am_model))加载权重并切换eval()。PaddleASRConnectionHanddler单路连接的流式状态机PaddleASRConnectionHanddlerasr_engine.py是整条流式链路的执行者。构造函数从preprocess_config读取win_length与n_shift帧长与帧移单位采样点并校验fs采样率与引擎sample_rate一致据此计算frame_shift_in_ms帧移毫秒数这是后续端点检测时间换算的基础。随后根据模型类型分派if deepspeech2 in self.model_type: assert self.continuous_decoding is False, ds2 model not support endpoint # 创建 CTCDecoder 并 init_decoder绑定语言模型与解码参数 elif conformer in self.model_type or transformer in self.model_type: self.searcher CTCPrefixBeamSearch(self.ctc_decode_config) self.endpoint_opt OnlineCTCEndpoingOpt(frame_shift_in_msself.frame_shift_in_ms, blank0) self.endpointer OnlineCTCEndpoint(self.endpoint_opt)这里体现了一个重要设计约束deepspeech2 在线模型不支持端点检测与连续解码continuous_decoding必须为False而 Conformer/Transformer 在线模型天然支持。流式特征提取PCM 数据到 Fbank 缓存extract_feat(samples)asr_engine.py接收 WebSocket 推送的字节流np.frombuffer(samples, dtypenp.int16)将字节解码为 16bit PCM 采样点所以客户端必须发送 16kHz/16bit 单声道 PCM对应配置中sample_rate: 16000追加到remained_wav缓存中累积若累积采样数不足一个win_length帧窗直接返回等待更多数据通过Transformation(preprocess_conf)计算 Fbank转成(1, T, D)的 Paddle Tensor拼接到cached_feat特征缓存关键步进self.remained_wav self.remained_wav[self.n_shift * num_frames:]——只保留未被帧移覆盖的尾部采样实现滑窗式前进。连接处理器维护两类累计计数num_samples全局采样点数与num_frames帧数并记录global_frame_offset与当前句子的num_frames为连续解码时的时间戳偏移做准备。流式解码主循环decode 的两种路径decode(is_finished)asr_engine.py是每次收到新音频后的解码入口按模型分两条路径。路径一DeepSpeech2 的静态图分块解码deepspeech2 以固定参数解码decoding_chunk_size 1 # 解码块大小解码帧单位 context 7 # 上下文帧数 subsampling 4 # 下采样率 cached_feature_num context - subsampling # 3 decoding_window (decoding_chunk_size - 1) * subsampling context # 7 stride subsampling * decoding_chunk_size # 4只有当cached_feat帧数达到decoding_window或结束帧达到context时才执行模型前向。decode_one_chunkasr_engine.py通过am_predictor的输入/输出句柄audio、audio_len、h_box、c_box四个输入output、output_lens、output_state_h、output_state_c四个输出完成预测RNN 的隐状态chunk_state_h_box与chunk_state_c_box在 chunk 间持续传递这是流式 LSTM 的关键。解码结果由CTCDecoder.next(...)累积并用decoder.decode()输出当前最优文本。每轮结束后特征缓存前移cached_feat cached_feat[:, end - cached_feature_num:, :]仅保留跨块所需的 3 帧上下文。路径二Conformer/Transformer 的 advance_decodingadvance_decoding(is_finished)asr_engine.py是 Conformer 在线模型的流式核心与 DeepSpeech2 的最大区别是它使用模型编码器内置的forward_chunk接口从ctc_decode_config读取decoding_chunk_size如 16与num_decoding_left_chunks如 -1表示使用全部历史从model.encoder.embed读取subsampling_rate如 4与right_context如 6context right_context 1 7计算decoding_window、stride与required_cache_size decoding_chunk_size * num_decoding_left_chunks对缓存特征按stride步进切块逐块调用(y, self.att_cache, self.cnn_cache) self.model.encoder.forward_chunk( chunk_xs, self.offset, required_cache_size, att_cacheself.att_cache, cnn_cacheself.cnn_cache)att_cache注意力缓存与cnn_cache卷积缓存跨 chunk 传递offset记录全局解码帧偏移——这就是 Conformer 流式解码chunk-by-chunk with cache的实现方式拼接所有 chunk 输出得到encoder_out计算 CTC log 概率ctc_probs self.model.ctc.log_softmax(ys)交给searcher.search(...)做流式 CTC 前缀束搜索若非结束帧则调用endpointer.endpoint_detected(...)检测断句更新特征缓存只保留尾部cached_feature_num帧。decode()结束后由update_result()asr_engine.py通过text_feature.defeaturize把 token id 序列还原为文本存入result_transcriptsget_result()返回当前最优partial结果。流式解码引擎CTCPrefixBeamSearchCTCPrefixBeamSearchctc_search.py实现了适用于流式场景的 CTC 前缀束搜索其核心状态是cur_hyps——一组(prefix, scores)假设每个假设携带 7 个字段0. blank_ending_score # 以 blank 结尾的总对数概率 1. none_blank_ending_score # 以非 blank 结尾的总对数概率 2. viterbi_blank_score # 以 blank 结尾的 Viterbi 概率 3. viterbi_non_blank_score # 以非 blank 结尾的 Viterbi 概率 4. current_token_prob # 当前 token 概率 5. times_viterbi_blank # blank 结尾时间戳 6. times_viterbi_non_blank # 非 blank 结尾时间戳search(ctc_probs, device)ctc_search.py对每一帧做两级束剪枝第一级对当前帧 CTC 概率取topk(first_beam_size)只对高分 token 做 token passing状态转移按blank、s last重复字符、s ! last新字符三种情况用log_add合并概率并维护 Viterbi 路径与时间戳第二级按log_add(pb, pnb)总分排序截取second_beam_size保留假设。get_one_best_hyps()返回当前最优 token 序列hyps中额外保留了 Viterbi 时间戳字段供 rescoring 阶段计算词级起止时间。由于cur_hyps跨search调用持续存在直到reset()它天然支持增量式流式解码——这正是与离线一次性束搜索的本质区别。断句的决策者OnlineCTCEndpointOnlineCTCEndpointctc_endpoint.py将用户说完了吗这一难题转化为 CTC blank 概率的统计问题其算法参考了《End-to-End Automatic Speech Recognition Integrated with CTC-based Voice Activity Detection》arXiv:2002.00551的思路。核心判定逻辑endpoint_detected(ctc_log_probs, decoding_something)逐帧统计blank_prob np.exp(logprob[blank])超过blank_threshold默认 0.8则trailing_silence_frames 1否则清零即连续静音帧数将num_frames_decoded与trailing_silence_frames乘以frame_shift_in_ms换算为毫秒级的语音时长与尾部静音时长。判定采用三条并行规则任一命中即触发端点规则是否必须含非静音最小尾部静音最小语句时长语义rule1False5000 ms0连续 5 秒静音即断句即使什么都没识别出来rule2True1000 ms0识别出内容后静音 1 秒即断句rule3False020000 ms语句最长 20 秒超时强制断句三条规则可通过OnlineCTCEndpoingOpt的field(default_factory...)结构在源码层调整若想禁用某条规则将其静音超时设为一个极大值即可。二次解码attention rescoring 与词级时间戳rescoring()asr_engine.py是 Conformer/Transformer 在线引擎的二遍解码当整句音频结束端点触发后用注意力解码器对束搜索产出的beam_size条候选重打分。流程如下前置条件decoding_method必须是attention_rescoring否则直接跳过deepspeech2 不支持此功能searcher.finalize_search()结束搜索get_hyps()取回候选对每条候选补sos/eos并 padding 后调用model.forward_attention_decoder(hyps_pad, hyps_lens, encoder_out, reverse_weight)得到正向与反向r_decoder_out解码器得分综合得分公式见 asr_engine.pyscore decoder_log_prob reverse_weight * (reverse_decoder_log_prob - decoder_log_prob) ctc_weight * ctc_score # ctc 得分ln 域选出best_index对应的最优假设并用 Viterbi 时间戳换算每个词的起止时间decode_frame_shift_in_sec subsampling_rate * (n_shift / sample_rate) global_offset_in_sec global_frame_offset * frame_shift_in_ms / 1000.0最终word_time_stamp输出形如{w: token, bg: 开始秒, ed: 结束秒}的列表get_word_time_stamp()可供客户端做字级字幕/对齐展示。连续解码continuous_decoding 的流式体验配置项continuous_decoding: True见 ws_conformer_application.yaml开启后端点检测不再是整段结束的信号而是当前句结束的信号。reset_continuous_decoding()asr_engine.py负责global_frame_offset num_frames记录当前句的全局帧偏移供下一句时间戳对齐重置模型缓存model_reset、束搜索searcher.reset与端点器endpointer.reset刻意不重置输出注释说明reset hyps will truncate history transcripts即历史识别文本得以保留实现整段长音频的无缝连续识别。reset()asr_engine.py则是一次全新连接的完整状态初始化deepspeech2 的 RNN 隐状态置零、num_samples/global_frame_offset/num_frames归零、endpoint_state复位、模型缓存与输出缓存清空。服务器配置实战两份在线 ASR 配置文件仓库中与在线 ASR 直接相关的两份服务配置ws_conformer_application.yamlConformer 在线ws_conformer_application.yaml 的关键参数host: 0.0.0.0 port: 8090 protocol: websocket # 在线引擎仅支持 websocket engine_list: [asr_online] # 任务格式task_engine type asr_online: model_type: conformer_online_multicn # 在线 Conformer 模型 am_model: # pdmodel 静态图文件 [可选留空自动下载] am_params: # pdiparams 静态图参数 [可选] lang: zh sample_rate: 16000 cfg_path: # 模型配置 yaml [可选] decode_method: # 留空则默认 attention_rescoring num_decoding_left_chunks: -1 # -1 表示使用全部历史 chunk force_yes: True device: cpu # cpu 或 gpu:id continuous_decoding: True # 端点检测后继续解码实现连续识别 am_predictor_conf: # Paddle Inference 预测器配置 device: switch_ir_optim: True glog_info: False summary: True chunk_buffer_conf: # 客户端 chunk 缓冲约定帧/毫秒 window_n: 7 shift_n: 4 window_ms: 25 shift_ms: 10 sample_rate: 16000 sample_width: 2 # 16bit PCMnum_decoding_left_chunks: -1对应源码中使用全部历史的流式缓存策略同时在线引擎要求该值必须为-1或 0见 asr_engine.py 的断言。ws_ds2_application.yamlDeepSpeech2 在线ws_ds2_application.yaml 展示了 DeepSpeech2 在线模型在两种推理框架下的配置asr_online-onnxONNX Runtime含graph_optimization_level、intra_op_num_threads、inter_op_num_threads、log_severity_level等参数与asr_online-inferencePaddle Inference含switch_ir_optim、glog_info、summary。两者均额外提供frame_duration_ms: 85的音频缓冲时长约定。与 WebSocket 层的衔接从源码结构看在线 ASR 的处理链路为WebSocket 协议层paddlespeech/server/ws/ 下的 asr API收到客户端音频帧后调用ASREngine单例的new_handler()创建/复用PaddleASRConnectionHanddler依次执行extract_feat→decode→get_result并在端点触发或连接结束时执行rescoring返回最终结果客户端工具 paddlespeech_client.py 提供了 WebSocket 音频流发送的参考实现。服务端整体的部署与使用说明可参考 server/README_cn.md 以及在线 ASR 的专项说明 server/tests/asr/online/README_cn.md。小结paddlespeech.server.engine.asr.online.python包完整展示了 PaddleSpeech 在线 ASR 的工程化实现通过ASREngine单例ASRServerExecutor资源管理PaddleASRConnectionHanddler连接级流式状态机的三层架构把持续到达的音频流转化为chunk 级特征提取—增量 CTC 解码—端点检测—attention rescoring的闭环。其中 Conformer/Transformer 模型依赖forward_chunk的 attention/CNN 缓存实现真正的流式前向DeepSpeech2 依赖 Paddle Inference 预测器的 RNN 隐状态传递实现分块解码而 CTC 前缀束搜索与端点检测则被抽象为ctc_search.py、ctc_endpoint.py两个独立模块被 python、paddleinference、onnx 三种引擎后端共用。理解这条链路是定制在线 ASR 服务如调整断句灵敏度、切换解码策略、扩展连续识别的起点。赞分享人工智能语音音频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 在线 ASR 引擎 Python 实现asr_engine 模块 API 与流式解码源码解析PaddleSpeech 在线 ASR 引擎 Python 实现asr_engine 模块 API 与流式解码源码解析 导读 本文以 PaddleSpeech人工智能语音音频PaddleSpeech 在线 ONNX 流式 ASR 引擎深度解析paddlespeech.server.engine.asr.online.onnx.asr_engine 模块全指南PaddleSpeech 在线 ONNX 流式 ASR 引擎深度解析 paddlespeech.server.engine.asr.online.onnx.a人工智能语音音频NLP媒体生成PaddleSpeech 在线 ASR 引擎的 CTC 前缀束搜索ctc_search 模块深入解析PaddleSpeech 在线 ASR 引擎的 CTC 前缀束搜索ctc_search 模块深入解析 导读 本文聚焦飞桨 PaddleSpeech 开源语音人工智能语音音频NLP媒体生成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。