ARTICLE DETAIL

资讯详情

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

PaddleSpeech 流式语音合成(Streaming TTS)在线引擎源码级解析:`tts_online` Python 动态图推理实现

PaddleSpeech 流式语音合成(Streaming TTS)在线引擎源码级解析:`tts_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点击查看免费下载本文以 docs/source/api/paddlespeech.server.engine.tts.online.python.rst 所指向的paddlespeech.server.engine.tts.online.python模块为线索深入剖析 PaddleSpeech 服务端流式语音合成Streaming TTS的 Python 动态图推理引擎从TTSServerExecutor的模型加载、TTSEngine的引擎初始化到PaddleTTSConnectionHandler的流式推理与去填充depadding逻辑并结合tts_online_application.yaml配置文件给出可直接落地的参数说明与启动、调用方法。读完本文你将掌握流式 TTS 服务中 AM/Voc 分块推理的底层原理、am_block/am_pad/voc_block/voc_pad四个关键超参的选取依据以及如何在当前仓库中一键启动并访问该服务。一、模块定位online.python在 TTS 服务端架构中的位置PaddleSpeech 的服务端采用「语音任务task× 引擎类型engine type」的组织方式配置文件中的engine_list即以此命名例如tts_online、tts_online-onnx。其中online使用 PaddlePaddle 动态图进行推理的引擎即本文主角paddlespeech/server/engine/tts/online/python/tts_engine.pyonline-onnx使用 onnxruntime 进行推理的引擎online/onnx推理速度更快此外还有paddleinferencePaddle Inference与python非流式两种 TTS 引擎变体可参见 engine/tts 目录结构。在 API 文档体系中paddlespeech.server.engine.tts.online.python.rst 是 Sphinxautomodule自动生成的包级文档页它聚合了该包的全部公开成员并进一步toctree链接到子模块文档 paddlespeech.server.engine.tts.online.python.tts_engine.rst。tts_engine.py是该包唯一的核心实现文件__init__.py为空文件模块顶层通过__all__ [TTSEngine, PaddleTTSConnectionHandler]声明了两个公开类另外还有一个仅内部使用的TTSServerExecutor。从源码结构看整个流式 TTS 在线引擎由以下三条主线组成类职责关键方法TTSServerExecutor(TTSExecutor)模型资源加载、前后端frontend与 AM/Voc 模型初始化get_model_info、_init_from_pathTTSEngine(BaseEngine)服务端引擎的配置校验、设备设置、采样率一致性检查initPaddleTTSConnectionHandler每个 TTS 请求的连接处理流式推理、去填充、后处理与返回infer、run、depadding二、TTSServerExecutor流式 TTS 的模型加载与资源管理TTSServerExecutor继承自paddlespeech.cli.tts.infer.TTSExecutor在构造函数中通过CommonTaskResource(tasktts, model_formatdynamic, inference_modeonline)声明资源类型动态图模型格式、在线推理模式tts_engine.py。2.1get_model_info按 AM/Voc 分支加载模型该方法根据field参数am或voc从CommonTaskResource获取模型类并加载权重tts_engine.pyAM声学模型分支model_class(idimself.vocab_size, odimodim, **self.am_config[model])其中idim来自音素词典大小、odim来自am_config.n_mels梅尔频带数权重通过paddle.load(ckpt)[main_params]加载Voc声码器分支model_class(**self.voc_config[generator_params])权重来自paddle.load(ckpt)[generator_params]加载后调用model.remove_weight_norm()移除权重归一化这是 HiFiGAN / MB-MelGAN 一类声码器在推理时的标准操作两种分支都会返回(model, model_mu, model_std)其中model_mu、model_std由np.load(stat)读入并转为 Paddle Tensor供后续 Z-Score 归一化使用。2.2_init_from_path完整初始化链_init_from_path是本引擎的初始化入口tts_engine.py其流程可归纳为判断是否使用预训练模型若am_ckpt/am_config/am_stat/phones_dict任一为空则use_pretrained_amTrue由CommonTaskResource自动下载默认预训练资源否则使用本地路径os.path.abspath规范化并skip_download。模型 tag 组装am_tag am - lang例如fastspeech2_csmsc-zh用于在资源表中索引对应模型。加载配置文件AM 与 Voc 的 yaml 配置均解析为CfgNodeyacs 配置系统。构建前端frontendlang zh时使用paddlespeech.t2s.frontend.zh_frontend.Frontend加载phone_vocab_path与tone_vocab_pathlang en时使用paddlespeech.t2s.frontend.en_frontend.English仅需音素词典。AM 推理封装self.am_name am[:am.rindex(_)]剥离后缀得到真实模型名如fastspeech2_csmsc→fastspeech2。对fastspeech2_cnndecoder直接加载其余模型则用ZScore(am_mu, am_std)归一化器 {am_name}_inference推理封装类包装并置为eval()模式。Voc 推理封装同样以ZScore归一化 {voc_name}_inference类包装mb_melgan、hifigan均支持流式 voc 推理。值得注意的是AM 模型在前端与推理封装上区分了「普通 fastspeech2」与「fastspeech2_cnndecoder带 CNN Decoder」两种形态这正是后续两条流式推理路径的分水岭。三、TTSEngine引擎初始化与关键校验TTSEngine继承BaseEngine单例元类init()方法完成以下工作tts_engine.py模型组合断言AM 必须为fastspeech2_csmsc或fastspeech2_cnndecoder_csmscVoc 必须为hifigan_csmsc或mb_melgan_csmsc否则报错退出。流式参数合法性断言要求voc_block 0且voc_pad 0。设备设置优先使用配置文件中的device如cpu、gpu:0否则回退到paddle.get_device()并调用paddle.set_device。执行初始化调用executor._init_from_path(...)传入am/voc名称、各自配置/权重/统计文件路径、phones_dict/tones_dict/speaker_dict与lang。采样率一致性校验assert am_config.fs voc_config.fs保证 AM 与 Vocoder 的采样率一致引擎的self.sample_rate取自 AM 配置的fs。流式 chunk 超参装载将am_block/am_pad/voc_block/voc_pad从配置写入引擎并计算两个上采样倍数am_upsample 1AM 帧与帧之间无上采样voc_upsample voc_config.n_shift声码器的帧移如 300用于将梅尔帧数换算为音频采样点数。这些参数随后会被PaddleTTSConnectionHandler消费是流式推理正确性的关键。四、流式推理的基石get_chunks分块与depadding去填充流式合成的核心矛盾是声码器/解码器需要上下文才能对「当前块」生成高质量输出但流式场景下又不能等待全部输入。解决方案是「分块 前后填充pad」每个 chunk 除有效帧block外再向两侧各扩展pad帧参与推理推理后再把 pad 区域裁剪掉。4.1 分块get_chunks实现在 server/utils/util.py核心逻辑为n math.ceil(data_len / block_size) for i in range(n): start max(0, i * block_size - pad_size) end min((i 1) * block_size pad_size, data_len)stepam时按data.shape[1]帧维切分chunk 形状为data[:, start:end, :]stepvoc时按data.shape[0]切分chunk 形状为data[start:end, :]block_size -1时视为非流式直接返回整段数据。4.2 去填充depadding推理结果需要裁掉 pad 带来的冗余depaddingtts_engine.py按 chunk 位置分三种情况处理front_pad min(chunk_id * block, pad) if chunk_id 0: # 首块仅保留前 block*upsample data data[:block * upsample] elif chunk_id chunk_num - 1: # 尾块去掉前向填充 data data[front_pad * upsample:] else: # 中间块两端填充都去掉 data data[front_pad * upsample:(front_pad block) * upsample]其中upsample为帧到采样点的放大倍数AM 阶段为 1Voc 阶段为n_shift。这个「首块截头、尾块去前填充、中间块掐头去尾」的规则保证了相邻 chunk 拼接后不重不漏与流式声码器中 pad 的计算方法一一对应。五、两条流式推理路径infer的实现细节PaddleTTSConnectionHandler.infer()是整个流式合成的核心tts_engine.py整体流程为按lang调用对应前端get_input_ids得到phone_ids并记录frontend_time遍历每个句子的音素序列根据 AM 类型走两条不同的流式路径每条路径都以yield逐 chunk 输出波形实现「边合成边下发」。5.1 路径一fastspeech2_csmscAM 整句推理 Voc 流式AM 一次性对整句音素推理得到完整梅尔谱mel self.executor.am_inference(part_phone_ids)随后get_chunks(mel, voc_block, voc_pad, voc)将梅尔谱切块逐块送入voc_inference生成子波形每块经depadding裁掉填充后yield sub_wav。该路径只做到了 Voc 阶段流式AM 阶段仍是整句计算。5.2 路径二fastspeech2_cnndecoder_csmscAM 流式 Voc 流式全链路首先encoder_infer(part_phone_ids)得到 encoder 输出orig_hs按mel_len与voc_block预估 voc chunk 数量AM 侧get_chunks(orig_hs, am_block, am_pad, am)将 encoder 输出分块逐块执行decoder(hs)postnet(...)经denorm反归一化与depadding后用np.concatenate累积到mel_streaming缓冲Voc 侧当mel_streaming的帧数达到当前endvoc_block voc_pad窗口时触发一次流式 voc 推理depadding后yield sub_wav并推进start/end滑动窗口start max(0, voc_chunk_id * voc_block - voc_pad) end min((voc_chunk_id 1) * voc_block voc_pad, mel_len)首包时间点会被记录first_am_infer前端结束到首个 AM 输出、first_voc_infer首个 AM 输出到首个 Voc 输出、first_response_time前端开始到首个音频包。最终final_response_time记录从前端开始到全部推理结束的总耗时供 RTF 计算。5.3 后处理与返回runrun()tts_engine.py对每个infer产出的 float32 波形执行float2pcmfloat32 → int16→tobytes()→base64.b64encode逐包yieldbase64 音频同时统计总时长、first_response_time、final_response_time与RTFfinal_response_time / duration并写入日志。六、配置参数详解tts_online_application.yaml流式 TTS 服务的标准配置见 demos/streaming_tts_server/conf/tts_online_application.yaml它同时给出了tts_onlinepython 动态图与tts_online-onnx两套引擎配置。以下为tts_online的核心参数参数取值/默认说明host0.0.0.0服务监听地址容器内若客户端访问 ip 不可达可换成本地 ipport8092服务端口protocolhttp/websocket网络协议engine_list[tts_online]等speech task_engine type形式amfastspeech2_csmsc/fastspeech2_cnndecoder_csmsc声学模型仅后者支持流式 AM 推理am_config / am_ckpt / am_stat / phones_dict / tones_dict / speaker_dict留空则自动下载预训练资源本地模型路径可选vocmb_melgan_csmsc/hifigan_csmsc声码器两者均支持流式 Voc 推理langzh语言支持zh/endevicecpu/gpu:id推理设备am_block72AM chunk 的有效帧数仅对fastspeech2_cnndecoder生效am_pad12AM chunk 前后各扩展帧数am_pad12时流式与非流式合成音频一致voc_block36Voc chunk 的有效帧数voc_pad14Voc chunk 前后各扩展帧数详见下方取值建议关于voc_pad的选取配置注释与 demos/streaming_tts_server/README_cn.md 给出了明确的经验值mb_melgan_csmscvoc_pad14时流式合成音频与非流式完全一致最小可设为7听感正常小于 7 会出现可感知的异常hifigan_csmscvoc_pad19时与非流式完全一致voc_pad14时听感正常。am_pad/am_block对不支持流式 AM 的fastspeech2_csmsc无效。此外tts_online-onnx配置中还额外包含am_sample_rate/voc_sample_rate、am_sess_conf/voc_sess_confonnxruntime 会话参数如use_trt、cpu_threads以及voc_upsample须与 voc 配置中的n_shift一致等字段用于 onnxruntime 推理。七、启动服务与客户端调用7.1 启动流式 TTS 服务命令行方式推荐paddlespeech_server start --config_file ./conf/tts_online_application.yaml其中config_file指定配置文件默认./conf/tts_online_application.yamllog_file指定日志路径默认./log/paddlespeech.log。启动成功后会输出 warm-up 首包响应时间以及Uvicorn running on http://0.0.0.0:8092的提示。Python API 方式from paddlespeech.server.bin.paddlespeech_server import ServerExecutor server_executor ServerExecutor() server_executor(config_file./conf/tts_online_application.yaml, log_file./log/paddlespeech.log)7.2 客户端访问命令行http 协议paddlespeech_client tts_online --server_ip 127.0.0.1 --port 8092 \ --protocol http --input 您好欢迎使用百度飞桨语音合成服务。 --output output.wav客户端参数说明server_ip服务端 ip默认127.0.0.1port服务端口默认8092protocolhttp/websocket默认httpinput待合成文本必填spk_id说话人 id当前仅支持单说话人模型该参数暂不生效output输出音频路径默认None不保存play是否边合成边播放默认False播放依赖pyaudio库。运行后会打印句子、首包响应、尾包响应、音频时长与 RTF例如[INFO] - 句子您好欢迎使用百度飞桨语音合成服务。 [INFO] - 首包响应0.18863153457641602 s [INFO] - 尾包响应3.1427218914031982 s [INFO] - 音频时长3.825 s [INFO] - RTF: 0.8216266382753459 [INFO] - 音频保存至output.wavPython API 客户端from paddlespeech.server.bin.paddlespeech_client import TTSOnlineClientExecutor executor TTSOnlineClientExecutor() executor(input您好欢迎使用百度飞桨语音合成服务。, server_ip127.0.0.1, port8092, protocolhttp, output./output.wav)八、性能指标与流式效果评估从run()与infer()的日志输出可以看出引擎在单次请求中记录了一组可用于评估流式实时性的关键指标tts_engine.pyfrontend_time文本前端处理耗时first_am_infer首个 AM 块推理耗时first_voc_infer首个 Voc 块推理耗时first_response_time首包响应时间衡量「输入文本到听到第一段声音」的延迟是流式体验的核心指标final_response_time尾包响应时间整句合成完成RTFfinal_response_time / duration实时率小于 1 表示合成速度快于播放速度。配置中还内置了 warm-up 机制服务启动时预跑若干次合成以完成显存/内存预热日志中「The first response time of the 0/1/2 warm up」即来自该阶段。需要说明的是以上各耗时为运行环境相关量实际数值取决于 CPU/GPU 设备与所选模型mb_melgan推理速度更快、音质略低hifigan音质更优、推理更慢。九、小结paddlespeech.server.engine.tts.online.python是 PaddleSpeech 流式 TTS 服务的动态图参考实现其设计可以概括为三点资源与推理解耦TTSServerExecutor负责模型/前端/归一化器的装载与复用TTSEngine负责配置校验与设备管理PaddleTTSConnectionHandler负责请求级流式推理分块 填充 去填充通过get_chunks与depadding在「上下文完整」与「低首包延迟」之间取得平衡am_pad/voc_pad的取值直接决定流式合成音质与非流式的一致性双路径适配普通fastspeech2_csmsc仅 Voc 流式fastspeech2_cnndecoder_csmsc实现 AM/Voc 全链路流式后者通过mel_streaming缓冲与滑动窗口实现「边编码、边解码、边合成」。如需进一步了解 onnxruntime 加速版本可对照阅读 online/onnx/tts_engine.py完整的服务端启动与客户端调用示例位于 demos/streaming_tts_server含 http 与 websocket 两套配置及README_cn.md中的详细说明。赞分享人工智能语音音频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 流式语音合成服务 ONNX 在线引擎tts_online-onnx架构与实现解析PaddleSpeech 流式语音合成服务 ONNX 在线引擎tts_online onnx架构与实现解析 本技术指南以 PaddleSpeech 仓库中人工智能语音音频NLP媒体生成PaddleSpeech 流式 TTS 在线引擎Python 动态图后端源码级解析与实战指南PaddleSpeech 流式 TTS 在线引擎Python 动态图后端源码级解析与实战指南 PaddleSpeech 的流式语音合成Streaming人工智能语音音频PaddleSpeech 在线流式 TTS 服务引擎tts_engine深度解析从 Python 动态图推理到分块流式合成PaddleSpeech 在线流式 TTS 服务引擎tts_engine深度解析从 Python 动态图推理到分块流式合成 PaddleSpeech 的流人工智能语音音频NLP媒体生成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表