ARTICLE DETAIL

资讯详情

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

PaddleSpeech 流式 ASR 服务客户端实战:从 WAV 文件模拟到麦克风实时识别

PaddleSpeech 流式 ASR 服务客户端实战:从 WAV 文件模拟到麦克风实时识别 人工智能语音音频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/onlineASR 服务是实时语音交互的核心能力而客户端则决定了音频以何种方式喂给服务端。本篇基于 流式 ASR 客户端文档 展开讲清楚两类客户端的完整用法其一是paddlespeech_client asr_online命令行工具用 WAV 文件模拟流式推帧做服务验证其二是同目录下的 麦克风客户端脚本直接调用声卡进行边说边识别的实时测试。读完本文你将掌握流式 ASR 服务的安装准备、测试音频要求、两条可复制的客户端命令、WebSocket 流式交互协议start 信令 / PCM 字节帧 / end 信令并能定位到仓库中对应的服务端接口与客户端实现源码。一、环境准备与安装前提按照文档给出的安装建议运行该流式 ASR 客户端的前提是推荐使用paddlepaddle 2.4rc或以上版本可以从 medium、hard 等方式中选择一种方式安装 PaddleSpeech文档中安装入口指向仓库根目录下的安装文档 docs/source/install.md可对照选择安装级别客户端运行还需要websockets、pyaudio仅麦克风客户端需要、soundfile等依赖这些依赖会随 PaddleSpeech 安装流程引入。麦克风客户端脚本 microphone_client.py 直接import pyaudio与websockets说明该脚本依赖这两个第三方库命令行客户端则由 paddlespeech_client.py 中注册的paddlespeech_client.asr_online命令提供。二、准备测试音频WAV 格式与采样率约束文档明确给出了输入约束ASR client 的输入应该是一个 WAV 文件.wav并且采样率必须与模型的采样率相同。对于 PaddleSpeech 默认的流式 ASR 模型采样率为 16000 Hz。可以按文档给出的命令下载示例音频wget -c https://paddlespeech.cdn.bcebos.com/PaddleAudio/zh.wav从客户端源码可以确认这一约束的落地方式。命令行客户端内部使用的ASRWsAudioHandler定义在 audio_handler.py 第 74-97 行在read_wave中用soundfile.read(..., dtypeint16)读取音频后直接执行assert sample_rate 16000第 111 行——即如果 WAV 文件不是 16 kHz模拟流式客户端会在发送前直接断言失败。同时源码还体现了流式推帧的切块逻辑# audio_handler.py 第 113 行附近 chunk_size int(85 * sample_rate / 1000) # 85ms, sample_rate 16kHz即官方模拟客户端按85 ms 一帧16 kHz 下每帧 1360 个 int16 采样点切分音频并逐帧发送不足一帧时补零对齐。这一点在验证流式延迟行为时很有参考价值你观察到的部分结果partial result是以 85 ms 为粒度的。三、客户端方式一paddlespeech_client asr_online 命令行这是文档主推的Python 模拟流式服务命令行用它可以在不接麦克风的情况下验证流式 ASR 服务端是否可用# 流式ASR paddlespeech_client asr_online --server_ip 127.0.0.1 --port 8091 --input ./zh.wav3.1 完整参数说明该命令由 paddlespeech_client.py 中的ASROnlineClientExecutor第 398-499 行注册并实现结合源码中argparse的定义完整参数如下参数类型默认值说明--server_ipstr127.0.0.1流式 ASR 服务地址--portint8091流式 ASR 服务端口--inputstr必填待识别的 WAV 音频文件路径--sample_rateint16000音频采样率须与服务端模型一致--langstrzh_cn音频语言类型--audio_formatstrwav音频格式--punc.server_ipstrNone标点服务地址指定后客户端会在拿到识别文本后调用标点服务做标点恢复--punc.portint8190标点服务端口其中--punc.server_ip/--punc.port体现了 PaddleSpeech 服务化设计的解耦思路识别引擎与标点模型可分别部署为两个服务客户端负责串联。在ASRWsAudioHandler中audio_handler.py 第 74-96 行标点服务由内部封装的TextHttpHandler承载仅当punc_server_ip与punc_server_port均非空时才会对识别结果发起 HTTP 标点恢复请求第 171-174、191-192 行。3.2 客户端内部的流式交互流程ASROnlineClientExecutor.__call__第 463-499 行拿到参数后并不自己手写 WebSocket 逻辑而是复用ASRWsAudioHandlerlogger.info(asr websocket client start) handler ASRWsAudioHandler( server_ip, port, punc_server_ippunc_server_ip, punc_server_portpunc_server_port) loop asyncio.get_event_loop() res loop.run_until_complete(handler.run(input))ASRWsAudioHandler默认连接的服务端点为ws://ip:port/paddlespeech/asr/streaming第 78 行。run方法第 132-200 行完整实现了流式协议的客户端侧websockets.connect(self.url)建立 WebSocket 连接发送 start 信令文本消息JSON 格式{name: ..., signal: start, nbest: 1}等待服务端应答按 85 ms 一帧将 int16 PCM 字节数据逐帧ws.send(chunk_data.tobytes())每发一帧接收一帧服务端回包即该帧对应的部分识别结果并打印日志全部音频发完后发送 end 信令signal: end接收最终识别结果若配置了标点服务对最终结果调用标点恢复最后打印音频时长、耗时与 RTFRTF elapsed_time / audio_info.duration第 195-200 行。这个每帧一问一答的收发模式正是流式 ASR 客户端与离线 ASR 客户端的本质区别客户端能持续看到中间结果最终结果在 end 信令后返回。四、客户端方式二microphone_client.py 麦克风实时识别文档给出的第二种方式是直接调用麦克风设备# 直接调用麦克风设备 python microphone_client.py该脚本位于 paddlespeech/server/tests/asr/online/microphone_client.py是一个自包含的示例客户端值得结合源码逐段理解。4.1 关键参数chunk、采样率与端点脚本中的ASRWsAudioHandler注意这是与paddlespeech.server.utils.audio_handler中的同名类不同的、面向麦克风场景的独立实现第 29-43 行初始化了以下关键参数self.url ws:// self.url : str(self.port) /ws/asr self.fileName ./output.wav # 录音缓存文件 self.chunk 5120 # 每次读取的采样点数 self.format pyaudio.paInt16 # 16 bit 整型 self.channels 1 # 单声道 self.rate 16000 # 16 kHz 采样率chunk 512016 kHz 下每帧 5120 个采样点即320 ms 一帧比模拟客户端的 85 ms 更粗适合麦克风实时场景降低网络与处理频率采样率固定为 16000 Hz、单声道、int16与服务端流式 ASR 模型的要求一致与read_wave中assert sample_rate 16000的要求呼应录音结束前脚本会把整段缓存的麦克风数据写入./output.wav留档便于事后核对识别结果与实际音频是否对应。4.2 运行交互流程脚本主入口第 146-159 行用asyncio事件循环驱动handler.run()并对SIGINT、SIGTERM注册了信号处理器loop asyncio.get_event_loop() main_task asyncio.ensure_future(handler.run()) for signal in [SIGINT, SIGTERM]: loop.add_signal_handler(signal, main_task.cancel)交互流程如下运行后提示是否开始录音 (y/n)输入y才会真正开始录音输入n或非法输入直接退出startrecord()用threading._start_new_thread起一个独立录音线程pyaudio打开frames_per_buffer5120的输入流循环stream.read(self.chunk)把帧数据同时追加到self._frames待发送队列和self.data_backup落盘缓存主协程通过websockets.connect(self.url)连接服务端先发送 start 信令注意此处携带的是nbest: 5并提示结束录音请: Ctrl c。继续请按回车。进入while True循环只要录音线程产出了新帧就ws.send一帧并ws.recv打印一条部分识别结果实现边说边出字按 Ctrl C 触发asyncio.CancelledError脚本在 except 分支里补发 end 信令、接收最终结果随后stoprecord()停止录音线程并把./output.wav写盘。也就是说Ctrl C 在该脚本中不是强制中断而是被设计成结束会话的语义——它会先走完整的 end 信令握手再落盘退出这正是流式 ASR WebSocket 协议优雅收尾的示范。4.3 使用提示该脚本将服务地址硬编码为ASRWsAudioHandler(127.0.0.1, 8091)第 151 行跨机器测试时直接修改这一行即可需要声卡可用容器环境中需挂载/dev/snd等音频设备pyaudio在缺少 PortAudio 系统库时无法导入从源码结构看该示例客户端连接的端点是ws://ip:8091/ws/asr而 PaddleSpeech 内置 FastAPI 流式 ASR 服务在 asr_api.py 第 26 行注册的路径是/paddlespeech/asr/streaming且 官方模拟客户端 默认也是走/paddlespeech/asr/streaming。二者路径不同如果你的服务端是内置服务运行该麦克风示例前需要按实际服务路径调整第 34 行的端点。五、服务端接口流式协议的另一侧要理解客户端行为有必要看服务端如何处理这些消息。内置 WebSocket 接口定义在 asr_api.py 的/paddlespeech/asr/streaming端点第 26 行起其处理逻辑与客户端逐条对应收到文本消息后解析 JSONsignal start时通过asr_model.new_handler()为该连接创建一个独立的处理实例第 68-74 行并回复{status: ok, signal: server_ready}——这就是客户端 start 后收到的那条应答收到字节消息PCM 帧时依次执行connection_handler.extract_feat(message)与connection_handler.decode(is_finishedFalse)第 102-103 行得到当前部分的识别结果后以{result: asr_results}回传对应客户端每帧打印的 partial result引擎内部还有端点检测connection_handler.endpoint_state第 105-126 行检测到语音终点时执行rescoring()重打分若不允许连续解码则直接下发signal: finished的最终结果并断开循环收到signal end时调用decode(is_finishedTrue)、rescoring()、get_result()与get_word_time_stamp()返回最终文本及词级时间戳第 75-91 行——这也解释了为什么最终结果里可能带词级时间信息。对照客户端代码可以看到完整的调用闭环paddlespeech_client asr_online与microphone_client.py分别以文件切帧和声卡采集两种数据来源驱动同一套 start/帧/end 协议。六、小结与实操建议围绕 paddlespeech/server/tests/asr/online/README_cn.md 的原始内容本篇补充了可落地的细节先装环境paddlepaddle 2.4rc按 docs/source/install.md 选择 medium/hard 方式安装 PaddleSpeech备音频16 kHz 单声道 WAV文档提供的zh.wav可直接下载验服务paddlespeech_client asr_online --server_ip 127.0.0.1 --port 8091 --input ./zh.wav观察 85 ms 帧的部分结果与最终 RTF 日志需要标点时追加--punc.server_ip与--punc.port默认 8190真实时python microphone_client.py输入y开始录音Ctrl C 优雅结束并落盘./output.wav排障抓手客户端日志中的client receive msg...、服务端日志中的endpoint: detected and rescoring.等打印可直接定位是信令、断帧还是端点检测环节出了问题。涉及的核心文件客户端 microphone_client.py、命令行注册 paddlespeech_client.py、通用 WebSocket 客户端 audio_handler.py、服务端接口 asr_api.py配合 demos/streaming_asr_server 下的部署说明即可完成从服务启动到客户端验证的完整闭环。赞分享人工智能语音音频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 客户端实战从 WebSocket 协议到麦克风实时识别PaddleSpeech 流式 ASR 客户端实战从 WebSocket 协议到麦克风实时识别 本文基于 PaddleSpeech 仓库中流式语音识别服务测试人工智能语音音频NLP媒体生成PaddleSpeech 离线 ASR HTTP 客户端实战从 wav 到识别文本的完整请求链路解析PaddleSpeech 离线 ASR HTTP 客户端实战从 wav 到识别文本的完整请求链路解析 导读 本文聚焦 PaddleSpeech 服务端测试模块人工智能语音音频NLP媒体生成MNN sherpa-mnn C 示例详解从波文件离线识别、麦克风实时识别到 WebSocket 服务MNN sherpa mnn C 示例详解从波文件离线识别、麦克风实时识别到 WebSocket 服务 本文基于 MNN 仓库中 apps/framewo推理引擎大模型上一篇RapidJSON单元测试框架GTest宏与测试用例设计下一篇Thanos监控数据容灾备份终极指南构建企业级高可用监控方案 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表