From b0262cfe72e6f4416629314408b5816155137923 Mon Sep 17 00:00:00 2001 From: Sakura-RanChen <1908198662@qq.com> Date: Tue, 29 Apr 2025 17:14:53 +0800 Subject: [PATCH] =?UTF-8?q?update:=E4=BC=98=E5=8C=96=E5=90=9E=E9=9F=B3?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E8=A7=A3=E5=86=B3=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E9=95=BF=E9=9F=B3=E9=A2=91=E6=97=B6=E7=9A=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/core/connection.py | 10 +++++-- .../core/handle/sendAudioHandle.py | 28 +++++++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/main/xiaozhi-server/core/connection.py b/main/xiaozhi-server/core/connection.py index 3cf6b018..c9e984f2 100644 --- a/main/xiaozhi-server/core/connection.py +++ b/main/xiaozhi-server/core/connection.py @@ -202,12 +202,16 @@ class ConnectionHandler: finally: await self.close(ws) + async def reset_timeout(self): + """重置超时计时器""" + if self.timeout_task: + self.timeout_task.cancel() + self.timeout_task = asyncio.create_task(self._check_timeout()) + async def _route_message(self, message): """消息路由""" # 重置超时计时器 - if self.timeout_task: - self.timeout_task.cancel() - self.timeout_task = asyncio.create_task(self._check_timeout()) + await self.reset_timeout() if isinstance(message, str): await handleTextMessage(self, message) diff --git a/main/xiaozhi-server/core/handle/sendAudioHandle.py b/main/xiaozhi-server/core/handle/sendAudioHandle.py index ec29a9fd..1d4da583 100644 --- a/main/xiaozhi-server/core/handle/sendAudioHandle.py +++ b/main/xiaozhi-server/core/handle/sendAudioHandle.py @@ -51,8 +51,8 @@ async def sendAudioMessage(conn, audios, text, text_index=0): logger.bind(tag=TAG).info(f"发送第一段语音: {text}") await send_tts_message(conn, "sentence_start", text) - # 播放音频 - await sendAudio(conn, audios) + is_first_audio = (text_index == conn.tts_first_text_index) + await sendAudio(conn, audios, pre_buffer=is_first_audio) await send_tts_message(conn, "sentence_end", text) @@ -64,22 +64,32 @@ async def sendAudioMessage(conn, audios, text, text_index=0): # 播放音频 -async def sendAudio(conn, audios): +async def sendAudio(conn, audios, pre_buffer=True): # 流控参数优化 frame_duration = 60 # 帧时长(毫秒),匹配 Opus 编码 start_time = time.perf_counter() play_position = 0 + last_reset_time = time.perf_counter() # 记录最后的重置时间 - # 预缓冲:发送前 3 帧 - pre_buffer = min(3, len(audios)) - for i in range(pre_buffer): - await conn.websocket.send(audios[i]) + # 仅当第一句话时执行预缓冲 + if pre_buffer: + pre_buffer_frames = min(3, len(audios)) + for i in range(pre_buffer_frames): + await conn.websocket.send(audios[i]) + remaining_audios = audios[pre_buffer_frames:] + else: + remaining_audios = audios - # 正常播放剩余帧 - for opus_packet in audios[pre_buffer:]: + # 播放剩余音频帧 + for opus_packet in remaining_audios: if conn.client_abort: return + # 每分钟重置一次计时器 + if time.perf_counter() - last_reset_time > 60: + await conn.reset_timeout() + last_reset_time = time.perf_counter() + # 计算预期发送时间 expected_time = start_time + (play_position / 1000) current_time = time.perf_counter()