ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

PaddleSpeech 在线 ASR 引擎深度解析:asr_engine 模块的流式语音识别服务实现

PaddleSpeech 在线 ASR 引擎深度解析:asr_engine 模块的流式语音识别服务实现 人工智能语音音频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 服务端在线流式语音识别的核心 Python 实现——asr_engine.py 模块展开系统讲解其引擎架构、WebSocket 连接级状态机、流式特征提取、分块chunk解码、CTC 前缀束搜索、端点检测与二遍 rescoring 的完整实现原理。读完本文你将掌握 PaddleSpeech 在线 ASR 服务边说话边出字的技术细节以及如何通过服务端 YAML 配置驱动 deepspeech2 / conformer 在线模型。模块定位在线 ASR 服务引擎的三个层次paddlespeech.server.engine.asr.online.python.asr_engine是 PaddleSpeech Servingpaddlespeech_server中在线语音识别online ASR的 Python 引擎实现与仓库中的onnx、paddleinference变体同属一个功能族见 paddlespeech/server/engine/asr/online 目录。该模块对外导出三个核心类类职责生命周期ASREngine全局引擎持有服务配置与执行器负责设备初始化与模型装载进程级继承单例BaseEngineASRServerExecutor模型资源装载器继承 CLI 的ASRExecutor负责下载/加载模型、构建文本特征器引擎级全局唯一PaddleASRConnectionHanddler每个 WebSocket 连接一个的处理器维护该路音频流的状态缓存、解码进度、结果连接级随连接创建与销毁三层分工非常清晰ASREngine只做一次性的资源初始化ASRServerExecutor完成模型加载与配置合并而真正边收音频边解码的实时逻辑全部封装在PaddleASRConnectionHanddler中——这是理解整个在线 ASR 服务的关键入口。从源码结构看ASREngine.init(config)会依次完成读取服务配置 → 创建ASRServerExecutor→ 设置设备支持cpu或gpu:id异常时会提示检查 YAML 中device字段→ 调用init_model()装载模型成功后打印Initialize ASR server engine successfully on device: ...。ASREngine.new_handler()则为每个连接返回一个新的PaddleASRConnectionHanddler(self)见 asr_engine.py这正对应 WebSocket 服务一路连接、一路解码的模型。服务端配置如何启用并调优在线 ASR 引擎在线 ASR 引擎通过服务端 YAML 配置驱动。以 Conformer 在线模型为例ws_conformer_application.yaml 给出了完整配置# 服务设置 host: 0.0.0.0 port: 8090 protocol: websocket # websocket 仅支持 online 引擎类型 engine_list: [asr_online] # 任务格式speech task_engine type # ASR 引擎配置 asr_online: model_type: conformer_online_multicn am_model: # am 静态模型 pdmodel 文件路径 [可选] am_params: # am 静态模型 pdiparams 文件路径 [可选] lang: zh sample_rate: 16000 cfg_path: # 模型配置文件路径 [可选] decode_method: # 解码方式留空则由引擎自动设置 num_decoding_left_chunks: -1 # 允许参考的历史 chunk 数-1 表示不限制 force_yes: True device: cpu # cpu 或 gpu:id continuous_decoding: True # 端点检测命中后是否连续解码 am_predictor_conf: device: # 推理设备可单独指定 switch_ir_optim: True glog_info: False # True - 打印 glog summary: True # False - 不打印 predictor 配置其中am_model、am_params、cfg_path留空时引擎会根据model_type - lang - sample_rate_str如conformer_online_multicn-zh-16k自动从资源库下载对应模型。sample_rate支持 1600016k与 80008k并在特征提取时断言与预处理配置中的fs一致见 asr_engine.py。对于 DeepSpeech2 在线模型可参考 ws_ds2_application.yaml其中asr_online-onnx使用 ONNX Runtime 推理am_predictor_conf含graph_optimization_level、intra_op_num_threads等 ONNX Session 参数asr_online-inference使用 Paddle Inference。需要注意DeepSpeech2 在线模型不支持端点检测引擎中直接断言continuous_decoding is False, ds2 model not support endpoint见 asr_engine.py。连接处理器一路音频流的完整状态机PaddleASRConnectionHanddler的构造函数见 asr_engine.py从全局引擎上继承了配置、模型类型、采样率与文本特征器并完成三件关键初始化特征提取器从模型配置的preprocess_config构建Transformation并读取win_length帧长与n_shift帧移单位均为采样点换算得到frame_shift_in_ms——这是后续端点检测的时间基准。解码器分发init_decoder()根据model_type分流——deepspeech2构建CTCDecoder并绑定 Paddle Inference 预测器conformer/transformer则构建CTCPrefixBeamSearch搜索器与OnlineCTCEndpoint端点检测器见 asr_engine.py。状态复位reset()统一清零采样计数、帧计数、端点标志并按模型类型重置解码器缓存。连接级状态被拆分为三组model_reset()重置音频残留remained_wav、特征缓存cached_feat以及 Conformer 在线解码所需的att_cache自注意力缓存、cnn_cache卷积缓存、encoder_out与全局解码偏移offset以解码帧为单位output_reset()重置部分/最终结果result_transcripts、词级时间戳word_time_stamp、束搜索假设hyps会话级计数num_samples累计采样点、num_frames当前话语帧数、global_frame_offset连续解码时的全局帧偏移。正是这组状态支撑了音频可以断断续续到达、结果可以逐块产出的在线体验。流式特征提取从 PCM 字节流到 FBank 缓存extract_feat(samples)接收 WebSocket 传入的 PCM 字节串见 asr_engine.py处理流程为用np.frombuffer(samples, dtypenp.int16)将字节流还原为 16 位 PCM 采样点累加全局采样计数新音频与上次剩余remained_wav拼接保证不丢帧若不足一帧win_length则直接返回 0等待更多数据对remained_wav做 FBank 预处理得到x_chunk转为(1, T, D)张量并按时间轴拼入cached_feat更新帧计数num_frames并将已消费的音频截断remained_wav remained_wav[n_shift * num_frames:]即按帧移滑动窗口只保留不足以再成帧的尾巴。这里的特征缓存cached_feat是流式解码的蓄水池——每次解码消费其中的若干帧后只保留end - cached_feature_num的尾部帧用于下一块的上下文拼接。分块流式解码deepspeech2 与 conformer 两条路径decode(is_finished)是连接处理器的解码入口见 asr_engine.py按模型类型走两条完全不同的实现。DeepSpeech2逐 chunk 前向 循环状态DeepSpeech2 的解码参数由在线结构固定decoding_chunk_size1、context7、subsampling4由此推导cached_feature_num context - subsampling 3下一块需要保留的上下文帧数decoding_window (chunk_size - 1) * subsampling context 7解码窗口stride subsampling * chunk_size 4滑动步长。decode_one_chunk通过 Paddle Inference 预测器am_predictor依次设置输入音频、音频长度、RNN 隐状态h_box、单元状态c_box与输出句柄run()后取出 logits 交给CTCDecoder.next()滚动解码并将输出状态写回chunk_state_h_box/c_box作为下一 chunk 的循环初始状态见 asr_engine.py。由于需要拼接上下文当缓存帧数不足解码窗口且未结束时解码会等待更多音频。Conformer/Transformerchunk 自注意力 增量编码Conformer 在线模型利用流式编码器的forward_chunk实现真正的增量解码见 asr_engine.pydecoding_chunk_size cfg.decoding_chunk_size # 例如 16解码帧单位 num_decoding_left_chunks cfg.num_decoding_left_chunks # 例如 -1 subsampling self.model.encoder.embed.subsampling_rate # 例如 4 context self.model.encoder.embed.right_context 1 # 例如 7 required_cache_size decoding_chunk_size * num_decoding_left_chunks每个 chunk 的音频片段通过model.encoder.forward_chunk(chunk_xs, self.offset, required_cache_size, att_cache..., cnn_cache...)前向offset记录全局解码帧位置各 chunk 输出y拼接后累积到encoder_out。随后计算 CTC log 概率model.ctc.log_softmax(ys)送入CTCPrefixBeamSearch搜索器得到当前最优假设hyps最后更新特征缓存。is_finishedTrue时末尾帧只需保证缓存大于context帧即可处理最后的上下文确保不遗漏句尾内容。CTC 前缀束搜索在线增量解码的核心CTCPrefixBeamSearch见 ctc_search.py实现了 CTC prefix beam search 的增量版本用于 Conformer 在线解码两级剪枝每帧先用logp.topk(first_beam_size)做第一级 token 剪枝再按log_add([pb, pnb])blank 与非 blank 路径对数概率之和排序截取second_beam_size条假设控制计算量状态定义每条假设维护 7 个字段——blank 结束分数、非 blank 结束分数、viterbi blank 结束分数、viterbi 非 blank 分数、当前 token 概率、blank 结束时间戳列表、非 blank 结束时间戳列表。时间戳信息正是后续词级时间戳输出的数据来源跨 chunk 延续cur_hyps、abs_time_step在reset()前一直保留search()每处理一个 chunk 的 CTC 概率后更新假设从而把多块音频的搜索状态无缝衔接实现增量出字。get_one_best_hyps()返回当前最优假设update_result()通过text_feature.defeaturize(hyp)将 token id 序列转换为可读文本写入result_transcripts。端点检测与连续解码一句话说完自动断句OnlineCTCEndpoint见 ctc_endpoint.py实现基于 CTC blank 概率的在线端点检测参照 End-to-End ASR Integrated with CTC-based Voice Activity Detection 论文思路定义了三条终止规则任一命中即触发端点规则must_contain_nonsilencemin_trailing_silencemin_utterance_length含义rule1False5000 ms0即使什么都没解码静音 5 秒也超时rule2True1000 ms0解码出内容后再静音 1 秒即断句rule3False020000 ms无论状态如何话语达到 20 秒强制截断检测逻辑对每个 CTC 帧计算blank_prob exp(logprob[blank])超过blank_threshold0.8视为静音帧并累计trailing_silence_frames否则清零再按frame_shift_in_ms换算为毫秒后与三条规则比对见 ctc_endpoint.py。当continuous_decodingTrue且端点被检测到时endpoint_state置位reset_continuous_decoding()会记录global_frame_offset、重置模型缓存与搜索器/端点器开始下一句话的解码——注意它不会清空历史文本从而在同一连接内连续输出多句话的结果。二遍 rescoring注意力重打分与词级时间戳对于decoding_method attention_rescoring的 Conformer/Transformer 模型rescoring()见 asr_engine.py执行二遍解码searcher.finalize_search()完成最后一帧搜索取出 beam 假设对每条假设补sos/eos后经model.forward_attention_decoder(hyps_pad, hyps_lens, encoder_out, reverse_weight)得到注意力解码器分数计算score decoder_score * (1 - reverse_weight) r_decoder_score * reverse_weight ctc_score * ctc_weight取最高分假设为最终结果依据 viterbi 时间戳计算每个 token 的起止时间decode_frame_shift_in_sec将解码帧换算为秒并叠加连续解码的global_offset_in_sec生成{w: token, bg: 开始秒, ed: 结束秒}列表。引擎只接受ctc_prefix_beam_search与attention_rescoring两种解码方式其他方式会在update_config()中被强制改为attention_rescoring见 asr_engine.py。结果输出与服务集成get_result()返回当前 partial/ending 的 one-best 文本get_word_time_stamp()返回词级时间戳二者配合 WebSocket 层的 asr_api.py 即可实现边说边返回中间结果、句尾返回最终结果与时间戳的在线交互。从源码结构看连接处理器的extract_feat→decode→get_result/rescoring调用序列正是服务端在线 ASR 对一次 WebSocket 语音流的完整处理管线。引擎类本身基于单例BaseEngine见 base_engine.pypreprocess/run/postprocess对在线场景均抛出NotImplementedError——在线引擎不走传统的整段输入-整段输出流水线而是以连接为粒度由new_handler()生成独立处理器这也从架构上印证了在线 ASR 与离线 ASR 的本质区别。小结PaddleSpeech 在线 ASR 引擎asr_engine.py通过全局引擎 连接处理器的两级设计把流式特征提取、增量 CTC 解码、端点检测与二遍 rescoring 收敛到一条清晰的调用链上extract_feat攒帧成块decode分模型类型做 chunk 解码DeepSpeech2 走带循环状态的 Inference 预测器Conformer/Transformer 走forward_chunk增量编码OnlineCTCEndpoint依据三条静音规则断句最后rescoring输出带时间戳的最终文本。配合 ws_conformer_application.yaml 中的decode_method、num_decoding_left_chunks、continuous_decoding等参数即可针对不同场景调优在线识别的延迟、精度与断句策略。赞分享人工智能语音音频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 ONNX 引擎深度解析流式语音识别服务核心模块PaddleSpeech 在线 ASR ONNX 引擎深度解析流式语音识别服务核心模块 导读 本文以 PaddleSpeech 官方 API 文档中 padd人工智能语音音频PaddleSpeech 在线 ASR ONNX 引擎深度解析基于 onnxruntime 的流式语音识别服务端实现PaddleSpeech 在线 ASR ONNX 引擎深度解析基于 onnxruntime 的流式语音识别服务端实现 本文围绕 PaddleSpeech 服务人工智能语音音频NLP媒体生成PaddleSpeech 在线 ASR 引擎 Python 实现asr_engine 模块 API 与流式解码源码解析PaddleSpeech 在线 ASR 引擎 Python 实现asr_engine 模块 API 与流式解码源码解析 导读 本文以 PaddleSpeech人工智能语音音频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表