免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

PaddleSpeech WebSocket 服务层源码解析:`paddlespeech.server.ws` 模块的流式 ASR / TTS 接口设计

PaddleSpeech WebSocket 服务层源码解析:`paddlespeech.server.ws` 模块的流式 ASR / TTS 接口设计 人工智能语音音频【免费下载链接】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 仓库中 docs/source/api/paddlespeech.server.ws.rst 文档所描述的paddlespeech.server.ws包为骨架深入剖析其子模块 asr_api.py、tts_api.py 与 api.py 的源码实现并结合服务端配置文件与demos/streaming_asr_server、demos/streaming_tts_server两个实战示例完整还原基于 WebSocket 协议的流式语音识别与流式语音合成的接口设计、连接管理、信令协议与部署方式。读完本文你将掌握 PaddleSpeech 在线语音服务的路由挂载机制、ASR/TTS 的 WebSocket 信令交互流程以及如何通过命令行与 Python API 一键启动流式服务。一、paddlespeech.server.ws包在服务架构中的定位paddlespeech.server.ws是 PaddleSpeech Serving 体系中专门负责WebSocket 协议接入层的 Python 包位于 paddlespeech/server/ws 目录仅包含三个文件文件职责init.py包初始化空实现仅含许可证头api.py路由聚合器按engine_list动态挂载 ASR / TTS 子路由asr_api.py流式语音识别 WebSocket 端点/paddlespeech/asr/streamingtts_api.py流式语音合成 WebSocket 端点/paddlespeech/tts/streaming及采样率查询接口从依赖关系看ws包直接调用 paddlespeech/server/engine/engine_pool.py 中定义的全局引擎池get_engine_pool()从池中取出asr/tts引擎实例后再创建连接处理器Connection Handler。整个调用链为FastAPI/Starlette WebSocket 请求 │ ▼ paddlespeech.server.ws.asr_api / tts_api接入层本文主题 │ ▼ engine_pool[asr] / engine_pool[tts]引擎池 │ ▼ engine.asr.online / engine.tts.online 引擎及 ConnectionHandler推理层也就是说ws层不直接做模型推理而是负责协议解析、连接生命周期管理、信令分发并把音频/文本数据转交给引擎层的连接处理器去完成特征提取、解码与合成。二、路由聚合api.py的setup_router机制api.py 的核心是一个工厂式函数setup_router(api_list: List)_router APIRouter() def setup_router(api_list: List): setup router for fastapi Args: api_list (List): [asr, tts] Returns: APIRouter for api_name in api_list: if api_name asr: _router.include_router(asr_router) elif api_name tts: _router.include_router(tts_router) else: pass return _router要点解读该函数接收一个字符串列表api_list按名称决定是否将asr_router、tts_router挂载到统一的_router上api_list的来源是服务端配置中的任务类型。结合 engine_pool.py 的init_engine_pool可以看到配置中的engine_list形如asr_onlinespeech task_engine type引擎池按下划线拆分后的第一个单词asr、tts、cls、text、vector作为键从代码结构可以推断setup_router与引擎池初始化配合使用只有配置中启用了某个引擎类型对应的 WebSocket 路由才会被挂载从而实现“按需加载”的服务能力目前ws层只实现了asr与tts两类 WebSocket 路由其他任务分类、文本、声纹等在ws包中没有对应端点。三、流式语音识别 WebSocket 端点asr_api.py3.1 端点定义与连接建立asr_api.py 用 FastAPI 装饰器定义了流式 ASR 端点router.websocket(/paddlespeech/asr/streaming) async def websocket_endpoint(websocket: WebSocket): await websocket.accept() engine_pool get_engine_pool() asr_model engine_pool[asr] connection_handler None try: while True: assert websocket.application_state WebSocketState.CONNECTED message await websocket.receive() websocket._raise_on_disconnect(message) ...流程拆解await websocket.accept()接受 WebSocket 握手完成协议升级获取引擎实例从全局引擎池取出asr引擎engine_pool[asr]延迟创建连接处理器connection_handler初始为None只有客户端发送start信令时才通过asr_model.new_handler()创建注释中保留了旧版PaddleASRConnectionHanddler的写法实际代码已改为引擎自身的工厂方法消息循环通过websocket.receive()持续接收客户端消息直到收到end信令或连接断开。这里直接复用了 Starlette 的_raise_on_disconnect来检测断连异常。3.2 文本信令协议start / end / 异常兜底每次循环中代码先判断消息中是否包含text字段对应 JSON 信令帧然后解析其中的signal字段asr_api.py信令服务端行为服务端响应start调用asr_model.new_handler()创建连接处理器准备接收 PCM 音频{status: ok, signal: server_ready}end对剩余音频做最终解码decode(is_finishedTrue)、重打分rescoring()、取结果与字级时间戳、reset()重置连接{status: ok, signal: finished, result: ..., times: ...}随后break退出循环无signal字段或未知值忽略该帧{status: ok, message: no valid json data}end信令的响应中同时包含两个关键字段result整句最终识别文本times字级时间戳列表每项形如{w: 我, bg: 0.0, ed: 0.7}bg为起始秒、ed为结束秒。3.3 二进制音频帧与端点检测当消息包含bytes字段时即为一段 PCM 音频数据asr_api.pyelif bytes in message: message message[bytes] connection_handler.extract_feat(message) connection_handler.decode(is_finishedFalse) if connection_handler.endpoint_state: logger.info(endpoint: detected and rescoring.) connection_handler.rescoring() word_time_stamp connection_handler.get_word_time_stamp() asr_results connection_handler.get_result() if connection_handler.endpoint_state: if connection_handler.continuous_decoding: logger.info(endpoint: continue decoding) connection_handler.reset_continuous_decoding() else: logger.info(endpoint: exit decoding) resp {status: ok, signal: finished, result: asr_results, times: word_time_stamp} await websocket.send_json(resp) break resp {result: asr_results} await websocket.send_json(resp)核心机制特征提取与解码每收到一段 PCM先extract_feat(message)提取特征再decode(is_finishedFalse)做增量解码端点检测endpoint detection解码后检查connection_handler.endpoint_state若检测到端点则立即rescoring()重打分并取出字级时间戳连续解码开关continuous_decoding决定检测到端点后的行为——为True时调用reset_continuous_decoding()继续解码下一条语句适用于长音频连续识别为False时直接回发finished信令并结束本轮连接增量返回部分结果未触发端点时每包音频都会回发{result: asr_results}客户端因此可以看到识别文本随语音输入逐字增长。3.4 断开处理整个循环被try/except WebSocketDisconnect包裹连接异常断开时记录错误日志asr_api.py由 FastAPI/Starlette 完成资源回收。四、流式语音合成 WebSocket 端点tts_api.py4.1 引擎类型选择tts_api.py 在建立连接后根据引擎类型动态导入连接处理器if tts_engine.engine_type online: from paddlespeech.server.engine.tts.online.python.tts_engine import PaddleTTSConnectionHandler elif tts_engine.engine_type online-onnx: from paddlespeech.server.engine.tts.online.onnx.tts_engine import PaddleTTSConnectionHandler else: logger.error(Online tts engine only support online or online-onnx.) sys.exit(-1)即流式 TTS 支持两种引擎后端online基于 Paddle 动态图/静态图推理的在线 TTS 引擎源码路径 paddlespeech/server/engine/tts/online/pythononline-onnx基于 ONNX Runtime 的在线 TTS 引擎源码路径 paddlespeech/server/engine/tts/online/onnx配置注释说明其推理速度更快见 tts_online_application.yaml。4.2 连接生命周期与 session/paddlespeech/tts/streaming端点的信令处理tts_api.pystart生成一个uuid.uuid1().hex会话 IDsession创建PaddleTTSConnectionHandler(tts_engine)回发{status: 0, signal: server ready, session: session}end将connection_handler置空回发{status: 0, signal: connection will be closed, session: session}后break关闭连接其他信令回发{status: 0, signal: no valid json data}。4.3 文本合成与流式音频返回当消息中没有signal但包含text字段时进入合成流程tts_api.pyelif text in message: text message[text] spk_id message[spk_id] wav_generator connection_handler.run(sentencetext, spk_idspk_id) while True: try: tts_results next(wav_generator) resp {status: 1, audio: tts_results} await websocket.send_json(resp) except StopIteration as e: resp {status: 2, audio: } await websocket.send_json(resp) logger.info(Complete the synthesis of the audio streams) break except Exception as e: resp {status: -1, audio: } await websocket.send_json(resp) break要点合成是边推理边发送的connection_handler.run()返回一个生成器wav_generator每次next()产出一段已合成的音频帧立即通过send_json推送给客户端状态码语义1表示音频数据帧2表示合成完成StopIteration-1表示合成异常请求帧需要同时携带text待合成文本与spk_id说话人 ID由于是流式合成客户端可以做到“首包响应即播放”这正是流式 TTS 低延迟体验的关键。4.4 采样率查询接口除 WebSocket 端点外tts_api.py 还暴露了一个 HTTP GET 端点router.get(/paddlespeech/tts/streaming/samplerate) def get_samplerate(): ... sample_rate tts_engine.sample_rate response {sample_rate: sample_rate} ...客户端可在建立合成连接前查询引擎的合成采样率用于配置播放设备或音频格式转换。五、配套配置文件从engine_list到protocol的完整约定ws层路由的启用与否、引擎类型的选择全部由服务端 YAML 配置驱动。仓库中与 WebSocket 服务直接相关的配置如下配置文件用途协议引擎paddlespeech/server/conf/ws_conformer_application.yaml流式 ASRConformer 在线模型websocketasr_onlinepaddlespeech/server/conf/ws_conformer_wenetspeech_application_faster.yaml流式 ASR更快但精度略降的配置websocketasr_onlinepaddlespeech/server/conf/ws_ds2_application.yaml流式 ASRDeepSpeech2 ONNXwebsocketasr_online-onnxpaddlespeech/server/conf/tts_online_application.yaml流式 TTSHTTP 或 WebSocket 可切换http可改websockettts_online-onnxdemos/streaming_tts_server/conf/tts_online_ws_application.yaml流式 TTSWebSocket 专用配置websockettts_online-onnx以流式 ASR 配置 ws_conformer_application.yaml 为例关键参数如下host: 0.0.0.0 port: 8090 protocol: websocket # websocket 仅支持在线online引擎类型 engine_list: [asr_online] # 任务_引擎类型 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 # -1 表示使用全部左侧块全局注意力 force_yes: True device: cpu # cpu 或 gpu:id continuous_decoding: True # 检测到端点后是否继续解码 am_predictor_conf: # 推理器配置 switch_ir_optim: True glog_info: False summary: True chunk_buffer_conf: # 音频分块缓冲参数 window_n: 7 # 帧 shift_n: 4 # 帧 window_ms: 25 # 毫秒 shift_ms: 10 # 毫秒 sample_rate: 16000 sample_width: 2 # 2 字节16bit PCM参数含义说明engine_list是服务启动的核心init_engine_pool会逐个实例化列表中的引擎engine_pool.py而setup_router则依据同样的任务名决定挂载哪些 WebSocket 路由protocol: websocket明确声明该服务只支持 WebSocket 协议。demo 文档也特别强调流式语音识别服务只支持 websocket 协议不支持 http 协议见 demos/streaming_asr_server/README_cn.mdcontinuous_decoding: True直接对应asr_api.py中端点检测后的分支逻辑3.3 节启用后长音频可连续识别chunk_buffer_conf定义了服务端从 PCM 流中切分块chunk的窗口/移位参数直接决定端到端延迟与识别精度之间的平衡。流式 TTS 配置tts_online_ws_application.yaml中还有一组流式合成特有的参数am: fastspeech2_cnndecoder_csmsc_onnx # 声学模型cnndecoder 版本支持流式 AM 推理 am_block: 72 am_pad: 12 # am_pad 设为 12 时流式合成效果与非流式一致 voc: mb_melgan_csmsc_onnx # 声码器mb_melgan / hifigan 均支持流式推理 voc_block: 36 voc_pad: 14 # mb_melgan 建议 14等价于非流式最小可到 7 voc_upsample: 300 # 应与 voc 配置中的 n_shift 一致注释中的取值建议非常关键am_pad12、voc_pad14时流式合成音频与非流式完全一致voc_pad最低可降到 7音频听感仍正常——这是做延迟调优时的直接依据。六、端到端实战启动 WebSocket 流式服务并调用6.1 流式 ASRWebSocket服务端启动在PaddleSpeech/demos/streaming_asr_server目录下# 命令行方式推荐默认 CPU改 device 参数可部署到 GPU paddlespeech_server start --config_file ./conf/ws_conformer_wenetspeech_application.yaml # 更快的解码速度但精度略降 paddlespeech_server start --config_file ./conf/ws_conformer_wenetspeech_application_faster.yaml客户端调用paddlespeech_client asr_online --server_ip 127.0.0.1 --port 8090 --input ./zh.wav客户端参数摘自 demos/streaming_asr_server/README_cn.mdserver_ip服务端 IP默认127.0.0.1port服务端口默认8090input必填待识别音频必须是 WAV 格式且采样率与模型一致16ksample_rate音频采样率默认 16000lang语言默认zh_cnaudio_format音频格式默认wavpunc.server_ip/punc.server_port标点预测服务地址可选默认 None。客户端运行时会打印逐步累积的识别结果最终帧形如client final receive msg{status: ok, signal: finished, result: 我认为跑步最重要的就是给我带来了身体健康, times: [{w: 我, bg: 0.0, ed: 0.7}, ...]}注意初次连接时服务端需要加载模型响应时间会略长127.0.0.1不可达时应替换为实际服务 IP。6.2 流式 TTSWebSocket服务端启动修改 tts_online_application.yaml 将protocol设为websocket或直接使用 tts_online_ws_application.yamlpaddlespeech_server start --config_file ./conf/tts_online_application.yaml客户端调用--protocol websocket指定 WebSocket 协议paddlespeech_client tts_online --server_ip 127.0.0.1 --port 8092 --protocol websocket --input 您好欢迎使用百度飞桨语音合成服务。 --output output.wav客户端参数摘自 demos/streaming_tts_server/README_cn.mdserver_ip服务端 IP默认127.0.0.1port服务端口默认8092protocol可选[http, websocket]默认httpinput必填待合成文本spk_id说话人 ID默认 0当前代码仅支持单说话人模型该参数暂不生效output合成音频输出路径默认 None不保存play是否边合成边播放默认 False播放需依赖pyaudio库。从客户端日志可以看到流式效果的关键指标——首包响应时间与 RTF首包响应0.2124948501586914 s 尾包响应3.199106454849243 s 音频时长3.825 s RTF: 0.83636770061418126.3 Python API 调用方式除命令行外两个 demo 都提供了等价的 Python API# 服务端 from paddlespeech.server.bin.paddlespeech_server import ServerExecutor server_executor ServerExecutor() server_executor(config_file./conf/ws_conformer_wenetspeech_application_faster.yaml, log_file./log/paddlespeech.log)# 流式 ASR 客户端 from paddlespeech.server.bin.paddlespeech_client import ASROnlineClientExecutor asrclient_executor ASROnlineClientExecutor() res asrclient_executor(input./zh.wav, server_ip127.0.0.1, port8090, sample_rate16000)# 流式 TTS 客户端 from paddlespeech.server.bin.paddlespeech_client import TTSOnlineClientExecutor executor TTSOnlineClientExecutor() executor(input您好欢迎使用百度飞桨语音合成服务。, server_ip127.0.0.1, port8092, protocolwebsocket, spk_id0, output./output.wav, playFalse)paddlespeech_server start --help可查看服务启动参数--config_file配置文件默认./conf/application.yaml与--log_file日志文件默认./log/paddlespeech.log。七、设计要点总结从 asr_api.py 与 tts_api.py 的实现可以总结出 PaddleSpeech WebSocket 服务层设计的几个核心原则信令与数据分离文本帧JSON 信令与二进制帧PCM 音频通过text/bytes字段区分同一个连接上交替传输无需额外建立数据通道延迟创建、按需销毁连接处理器在收到start信令时才创建end或端点结束或断连时销毁每个 WebSocket 连接独占一个处理器实例互不干扰增量返回ASR 逐包返回部分识别结果、TTS 逐帧返回合成音频这是实现低首包延迟的基础端点检测与连续解码通过endpoint_state与continuous_decoding的组合支持“整句结束即返回、长音频连续识别”两种模式配置驱动路由setup_router与init_engine_pool共用engine_list语义任务启停、协议选择websocket/http完全由 YAML 决定无需改动代码。如需继续深入可以沿着以下仓库路径阅读引擎池初始化见 paddlespeech/server/engine/engine_pool.pyASR 在线引擎与连接处理器见 paddlespeech/server/engine/asr/onlineTTS 在线引擎见 paddlespeech/server/engine/tts/onlineAPI 文档的 Sphinx 定义automodule指令位于 docs/source/api/paddlespeech.server.ws.rst 及其子页面 paddlespeech.server.ws.asr_api.rst 与 paddlespeech.server.ws.tts_api.rst。赞分享人工智能语音音频【免费下载链接】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点击查看免费下载相关推荐comet-llmOpikPython SDK Experiments REST 客户端详解实验资源的增删改查、批量与流式 APIcomet llmOpikPython SDK Experiments REST 客户端详解实验资源的增删改查、批量与流式 API 本文基于 Opik P人工智能语音音频NLP媒体生成PaddleSpeech WebSocket 服务端 API 深度解析基于 paddlespeech.server.ws.api 的流式 ASR 与流式 TTS 实现PaddleSpeech WebSocket 服务端 API 深度解析基于 paddlespeech.server.ws.api 的流式 ASR 与流式 TT人工智能语音音频PaddleSpeech RESTful 请求模型全解析从 request.py 看懂 ASR/TTS/CLS/Vector 服务端接口协议PaddleSpeech RESTful 请求模型全解析从 request.py 看懂 ASR/TTS/CLS/Vector 服务端接口协议 导读 本篇文章以人工智能语音音频NLP媒体生成上一篇FanControl Windows 风扇控制完整指南从噪音到安静的 3 个步骤下一篇Il2CppDumper 完整实战指南30 分钟重建 Unity IL2CPP 游戏的类型层级创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表