- 人工智能
- 语音
- 音频
【免费下载链接】PaddleSpeech
Easy-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.
本篇技术指南围绕 PaddleSpeech 服务端工具模块paddlespeech.server.utils.onnx_infer(文档入口见 paddlespeech.server.utils.onnx_infer 模块 API)展开,深入剖析其核心函数get_sess如何基于 ONNX Runtime 创建推理会话、如何通过配置字典控制执行设备、图优化级别与线程数。读完本文,你将能够看懂服务端 ASR / TTS 在线引擎的 ONNX 推理参数体系,并能在实际部署配置文件中精准调优sess_conf。
一、模块定位:服务端 ONNX 推理的统一入口
在 PaddleSpeech 的服务端架构中,paddlespeech/server/utils/onnx_infer.py承担着"为 ONNX 模型创建推理会话"这一基础职责。整个模块非常精炼,只对外暴露一个函数:
get_sess(model_path, sess_conf):读取一个.onnx模型文件路径和一份会话配置字典,返回一个onnxruntime.InferenceSession实例。
从源码结构看(见 onnx_infer.py),该函数内部完成了三件核心工作:
- 组装
onnxruntime.SessionOptions(图优化级别、执行模式、线程数); - 依据配置选择 ExecutionProvider(CPU / CUDA / TensorRT);
- 调用
ort.InferenceSession完成会话创建。
它与服务端另一套基于 Paddle Inference 的工具模块paddle_predictor.py形成对照:前者面向 ONNX Runtime 推理路径,后者面向 Paddle Inference 推理路径,二者在服务端引擎层通过不同的engine_type被选择使用。
二、get_sess源码逐段拆解
以下是get_sess的完整实现(摘自 onnx_infer.py):
def get_sess(model_path: Optional[os.PathLike]=None, sess_conf: dict=None): logger.debug(f"ort sessconf: {sess_conf}") sess_options = ort.SessionOptions() sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL if sess_conf.get('graph_optimization_level', 99) == 0: sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_DISABLE_ALL sess_options.execution_mode = ort.ExecutionMode.ORT_SEQUENTIAL # "gpu:0" providers = ['CPUExecutionProvider'] if "gpu" in sess_conf.get("device", ""): device_id = int(sess_conf["device"].split(":")[1]) providers = [('CUDAExecutionProvider', {'device_id': device_id})] # fastspeech2/mb_melgan can't use trt now! if sess_conf.get("use_trt", 0): providers = ['TensorrtExecutionProvider'] logger.debug(f"ort providers: {providers}") if 'cpu_threads' in sess_conf: sess_options.intra_op_num_threads = sess_conf.get("cpu_threads", 0) else: sess_options.intra_op_num_threads = sess_conf.get( "intra_op_num_threads", 0) sess_options.inter_op_num_threads = sess_conf.get("inter_op_num_threads", 0) sess = ort.InferenceSession( model_path, providers=providers, sess_options=sess_options) return sess2.1 SessionOptions 的默认策略
- 图优化级别默认全开:函数默认设置
graph_optimization_level = ORT_ENABLE_ALL,这是 ONNX Runtime 提供的最高级别图优化(含基本优化、扩展优化与布局优化),仅在配置中显式传入graph_optimization_level: 0时才降级为ORT_DISABLE_ALL。 - 执行模式固定为顺序执行:
execution_mode = ORT_SEQUENTIAL,即算子按拓扑顺序逐个执行。对于语音服务这类以推理延迟为主要指标的在线场景,顺序执行通常已足够;若需要图内算子并行,可考虑ORT_PARALLEL(当前模块未开放该选项)。
2.2 Provider 选择逻辑:CPU / CUDA / TensorRT
device字段的取值格式为"gpu:<id>"或"cpu":
- 未配置或配置为
"cpu":使用['CPUExecutionProvider']; - 配置为
"gpu:0"这类字符串:解析冒号后的数字作为device_id,使用[('CUDAExecutionProvider', {'device_id': device_id})]; - 在 GPU 基础上再开启
use_trt: True:直接切换到['TensorrtExecutionProvider']。
源码注释特别强调了一个兼容性约束:"fastspeech2/mb_melgan can't use trt now!",意味着 FastSpeech2 声学模型与 MB-MelGAN 声码器当前无法配合 TensorRT 使用,配置use_trt前需要确认目标模型的支持情况。
2.3 线程数配置的两种写法
线程配置体现了对两套配置命名习惯的兼容:
- 优先读取
cpu_threads(服务端 TTS 配置中使用); - 若不存在,则回退读取
intra_op_num_threads(服务端 ASR 配置中使用),二者本质都作用于sess_options.intra_op_num_threads,即"节点内部算子并行执行"的线程数; inter_op_num_threads控制"图中跨节点并行执行"的线程数,独立读取。
intra_op_num_threads与inter_op_num_threads的含义与 onnxruntime 官方InferenceSession参数一致:前者决定单个算子内部的数据并行线程数,后者决定整个计算图中多个算子之间的并行度。对延迟敏感的在线推理,通常建议inter_op_num_threads保持为 0(由 Runtime 自动决定)或设小值,避免线程调度开销影响单请求延迟。
三、服务端引擎中的实际调用链
3.1 在线 ASR(onnx 引擎)
在 asr_engine.py 中,ASRServerExecutor.init_model对deepspeech2系列模型调用:
self.am_predictor = onnx_infer.get_sess( model_path=self.am_model, sess_conf=self.am_predictor_conf)配置从self.config.am_predictor_conf注入(见 asr_engine.py),即服务端 yaml 中asr_online-onnx段落下的am_predictor_conf字段。该引擎通过CommonTaskResource(task='asr', model_format='onnx', inference_mode='online')管理模型资源下载,ONNX 引擎只使用am_model(onnx 静态图文件),am_params会被断言为 None。
3.2 在线 TTS(onnx 引擎)
在 tts_engine.py 中,get_sess被复用多次,覆盖声学模型与声码器两类子模型:
- FastSpeech2(
fastspeech2_csmsc_onnx):单个 onnx 模型,创建self.am_sess(tts_engine.py); - FastSpeech2 + CNN Decoder(
fastspeech2_cnndecoder_csmsc_onnx):支持流式 AM 推理,需要三个子模型 encoder / decoder / postnet,分别创建self.am_encoder_infer_sess、self.am_decoder_sess、self.am_postnet_sess(tts_engine.py),同时加载am_stat中的均值方差用于归一化; - 声码器(
mb_melgan_csmsc_onnx/hifigan_csmsc_onnx):创建self.voc_sess(tts_engine.py)。
可以看出,get_sess是服务端"onnx 化"在线推理的最小公共原语:无论模型形态是单个 onnx 文件还是多个子图文件,统一通过它生成推理会话,上层引擎只负责按需调用。
四、服务端配置文件中的sess_conf参数对照
get_sess实际消费的配置键与两个官方服务端配置文件的对应关系如下:
| 配置键 | 默认行为 | 作用 | 典型配置出处 |
|---|---|---|---|
device | "cpu"(默认 CPUExecutionProvider) | 选择推理设备,"gpu:<id>"触发 CUDA Provider | tts_online_application.yaml、ws_ds2_application.yaml |
use_trt | 0 | GPU 下切换 TensorrtExecutionProvider(FastSpeech2/MB-MelGAN 暂不支持) | tts_online_application.yaml |
graph_optimization_level | 非 0 时启用 ORT_ENABLE_ALL;显式为0时 ORT_DISABLE_ALL | 控制 onnxruntime 图优化级别 | ws_ds2_application.yaml |
cpu_threads | 0(不设置则回退读取 intra_op_num_threads) | intra_op 线程数(TTS 命名风格) | tts_online_application.yaml |
intra_op_num_threads | 0 | 节点内算子并行线程数(ASR 命名风格) | ws_ds2_application.yaml |
inter_op_num_threads | 0 | 图内跨节点并行线程数 | ws_ds2_application.yaml |
其中log_severity_level、log_verbosity_level两个日志相关键在配置中给出(见 ws_ds2_application.yaml),用于控制会话加载与初始化阶段的日志级别,属于 onnxruntime 会话级日志配置,get_sess当前实现中未直接消费,但保留在配置中以备排查问题。
在线 TTS 配置实例
流式 TTS 服务端配置(tts_online_application.yaml)中,tts_online-onnx引擎对 AM 与声码器分别给出会话配置:
tts_online-onnx: am: 'fastspeech2_cnndecoder_csmsc_onnx' am_ckpt: # list am_sess_conf: device: "cpu" use_trt: False cpu_threads: 4 voc: 'hifigan_csmsc_onnx' voc_sess_conf: device: "cpu" use_trt: False cpu_threads: 4配合流式推理参数am_block: 72、am_pad: 12(CNN Decoder 流式 AM 的块长与 padding,am_pad设为 12 时流式合成结果与非流式一致)以及voc_block: 36、voc_pad: 14(MB-MelGAN 声码器流式参数),这些参数与get_sess创建的会话共同构成完整的流式 TTS 推理链路。若am选fastspeech2_csmsc_onnx,am_ckpt只需单个 ckpt;若选fastspeech2_cnndecoder_csmsc_onnx,则am_ckpt需按 [encoder, decoder, postnet] 顺序给出三个模型文件。
在线 ASR 配置实例
流式 ASR 服务端配置(ws_ds2_application.yaml)中,asr_online-onnx引擎的配置示例:
asr_online-onnx: model_type: 'deepspeech2online_wenetspeech' am_model: # the pdmodel file of onnx am static model [optional] lang: 'zh' sample_rate: 16000 device: 'cpu' am_predictor_conf: device: 'cpu' graph_optimization_level: 0 intra_op_num_threads: 0 inter_op_num_threads: 0 log_severity_level: 2 log_verbosity_level: 0chunk_buffer_conf段则与 VAD/分帧相关(frame_duration_ms、window_n、shift_n等),描述流式输入的音频分块策略,与推理会话配置相互独立。
五、配置要点与调优建议
结合get_sess实现与服务端配置文件,部署时建议关注以下几点:
- CPU 推理:默认即 CPU Provider。可调
cpu_threads/intra_op_num_threads提升单算子并行度;由于服务端推理以单请求延迟为主,inter_op_num_threads建议保持默认(0,由 Runtime 决定),过大会引入线程调度开销。 - GPU 推理:将
device设为"gpu:0"(按实际卡号调整),get_sess会自动携带device_id创建 CUDAExecutionProvider。 - TensorRT 限制:
use_trt仅对支持 TensorRT 的模型生效,FastSpeech2 与 MB-MelGAN 系列当前不能使用(源码注释明确提示),配置前应确认模型类别。 - 图优化开关:默认
ORT_ENABLE_ALL适合绝大多数场景;若遇到算子兼容性问题或需要逐算子调试,可显式配置graph_optimization_level: 0关闭优化。 - 命名兼容:
cpu_threads与intra_op_num_threads均可配置,get_sess优先读取前者;跨引擎复制配置时注意不要两者同时设置造成困惑。
六、小结
paddlespeech.server.utils.onnx_infer.get_sess是 PaddleSpeech 服务端 ONNX 推理的底层会话工厂:一段不足 30 行的实现,统一封装了图优化、执行模式、Provider 选择(CPU/CUDA/TensorRT)与线程数配置,被在线 ASR(deepspeech2 onnx)与在线 TTS(FastSpeech2 系列 onnx + 流式声码器)引擎复用。理解它的行为,就能读懂am_predictor_conf/am_sess_conf/voc_sess_conf等配置段的全部语义,进而在实际部署中对推理性能与兼容性进行精准控制。
- 人工智能
- 语音
- 音频
【免费下载链接】PaddleSpeech
Easy-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.
相关推荐
PaddleSpeech 在线 ASR ONNX 引擎深度解析:基于 onnxruntime 的流式语音识别服务端实现
PaddleSpeech 在线 ASR ONNX 引擎深度解析:基于 onnxruntime 的流式语音识别服务端实现 本文围绕 PaddleSpeech 服务
人工智能语音音频NLP媒体生成使用 Label Studio 与 ReactCode 审阅 Langfuse 追踪数据的完整实战指南
使用 Label Studio 与 ReactCode 审阅 Langfuse 追踪数据的完整实战指南 本指南面向 LLM 应用开发者与评估工程师:将 Lang
人工智能语音音频AutoAgent 会话数据持久化实战:通过 config.toml 配置 file_store 与 jwt_secret 实现服务重启后的会话恢复
AutoAgent 会话数据持久化实战:通过 config.toml 配置 file_store 与 jwt_secret 实现服务重启后的会话恢复 本指南基于
人工智能大模型AI AgentAgent 框架工具调用自主智能体RAG
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考