From 5622a137354f719ce77c43ad3dcfbcfa975b108e Mon Sep 17 00:00:00 2001 From: Sakura-RanChen <1908198662@qq.com> Date: Wed, 25 Mar 2026 11:07:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B5=81=E5=BC=8F?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E4=B8=8B=E7=9A=84=E8=AF=AF=E5=88=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/utils/audioRateController.py | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/main/xiaozhi-server/core/utils/audioRateController.py b/main/xiaozhi-server/core/utils/audioRateController.py index 29e203f2..ef598709 100644 --- a/main/xiaozhi-server/core/utils/audioRateController.py +++ b/main/xiaozhi-server/core/utils/audioRateController.py @@ -27,6 +27,7 @@ class AudioRateController: self.queue_empty_event = asyncio.Event() # 队列清空事件 self.queue_empty_event.set() # 初始为空状态 self.queue_has_data_event = asyncio.Event() # 队列数据事件 + self._last_queue_empty_time = 0 # 上次队列清空的时间(秒) def reset(self): """重置控制器状态""" @@ -37,6 +38,7 @@ class AudioRateController: self.queue.clear() self.play_position = 0 self.start_timestamp = None # 由首个音频包设置 + self._last_queue_empty_time = 0 # 重置时间 # 相关事件处理 self.queue_empty_event.set() self.queue_has_data_event.clear() @@ -45,11 +47,15 @@ class AudioRateController: """添加音频包到队列""" # 如果队列之前为空,需要调整时间戳以保持播放时间连续 # 这样工具调用等待期间,新加入的音频不会提前播放 + # 如果间隔很短(<1帧),说明是正常的流式传输,不需要重置 if len(self.queue) == 0 and self.play_position > 0: - self.start_timestamp = time.monotonic() - (self.play_position / 1000) - self.logger.bind(tag=TAG).debug( - f"队列从空恢复,重置时间戳,当前播放位置: {self.play_position}ms" - ) + elapsed_since_empty = (time.monotonic() - self._last_queue_empty_time) * 1000 + # 只有间隔超过1帧时长,才认为是真正的"暂停恢复" + if elapsed_since_empty >= self.frame_duration: + self.start_timestamp = time.monotonic() - (self.play_position / 1000) + self.logger.bind(tag=TAG).debug( + f"队列从空恢复,重置时间戳,当前播放位置: {self.play_position}ms,间隔: {elapsed_since_empty:.0f}ms" + ) self.queue.append(("audio", opus_packet)) # 相关事件处理 @@ -64,10 +70,12 @@ class AudioRateController: message_callback: 消息发送回调函数 async def() """ if len(self.queue) == 0 and self.play_position > 0: - self.start_timestamp = time.monotonic() - (self.play_position / 1000) - self.logger.bind(tag=TAG).debug( - f"队列从空恢复,重置时间戳,当前播放位置: {self.play_position}ms" - ) + elapsed_since_empty = (time.monotonic() - self._last_queue_empty_time) * 1000 + if elapsed_since_empty >= self.frame_duration: + self.start_timestamp = time.monotonic() - (self.play_position / 1000) + self.logger.bind(tag=TAG).debug( + f"队列从空恢复,重置时间戳,当前播放位置: {self.play_position}ms,间隔: {elapsed_since_empty:.0f}ms" + ) self.queue.append(("message", message_callback)) # 相关事件处理 @@ -140,6 +148,7 @@ class AudioRateController: # 队列处理完后清除事件 self.queue_empty_event.set() self.queue_has_data_event.clear() + self._last_queue_empty_time = time.monotonic() # 记录队列清空时间 def start_sending(self, send_audio_callback): """