From f297e1b64806da8a2078c759043c80569de0518e Mon Sep 17 00:00:00 2001 From: Sakura-RanChen <1908198662@qq.com> Date: Mon, 22 Jun 2026 11:16:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B6=85=E6=97=B6=E6=83=85=E5=86=B5?= =?UTF-8?q?=E4=B8=8D=E4=B8=8Eactivate=5Fsession=E5=90=8C=E4=B8=80=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E6=9D=A1=E4=BB=B6=E5=AF=BC=E8=87=B4=E7=9A=84=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E4=BB=BB=E5=8A=A1=E6=9C=AA=E6=B8=85=E9=99=A4=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/providers/tts/alibl_stream.py | 26 +++++++++++------- .../core/providers/tts/aliyun_stream.py | 25 ++++++++++------- .../providers/tts/huoshan_double_stream.py | 27 ++++++++++++------- 3 files changed, 49 insertions(+), 29 deletions(-) diff --git a/main/xiaozhi-server/core/providers/tts/alibl_stream.py b/main/xiaozhi-server/core/providers/tts/alibl_stream.py index d7626c55..bd0d2f83 100644 --- a/main/xiaozhi-server/core/providers/tts/alibl_stream.py +++ b/main/xiaozhi-server/core/providers/tts/alibl_stream.py @@ -80,6 +80,9 @@ class TTSProvider(TTSProviderBase): return self.ws logger.bind(tag=TAG).debug("开始建立新连接...") + # 建立新连接前取消旧监听任务 + await self._cancel_monitor_task() + self.ws = await websockets.connect( self.ws_url, additional_headers=self.header, @@ -306,16 +309,7 @@ class TTSProvider(TTSProviderBase): """清理资源""" await super().close() self.activate_session = False - # 取消监听任务 - if self._monitor_task: - try: - self._monitor_task.cancel() - await self._monitor_task - except asyncio.CancelledError: - pass - except Exception as e: - logger.bind(tag=TAG).warning(f"关闭时取消监听任务错误: {e}") - self._monitor_task = None + await self._cancel_monitor_task() # 关闭WebSocket连接 if self.ws: @@ -325,6 +319,18 @@ class TTSProvider(TTSProviderBase): pass self.ws = None self.last_active_time = None + + async def _cancel_monitor_task(self): + """取消监听任务""" + if self._monitor_task and not self._monitor_task.done(): + self._monitor_task.cancel() + try: + await self._monitor_task + except asyncio.CancelledError: + pass + except Exception as e: + logger.bind(tag=TAG).warning(f"取消监听任务错误: {e}") + self._monitor_task = None async def _start_monitor_tts_response(self): """监听TTS响应 - 长期运行""" diff --git a/main/xiaozhi-server/core/providers/tts/aliyun_stream.py b/main/xiaozhi-server/core/providers/tts/aliyun_stream.py index 7ae64d1b..88f573b5 100644 --- a/main/xiaozhi-server/core/providers/tts/aliyun_stream.py +++ b/main/xiaozhi-server/core/providers/tts/aliyun_stream.py @@ -193,6 +193,9 @@ class TTSProvider(TTSProviderBase): return self.ws logger.bind(tag=TAG).debug("开始建立新连接...") + # 建立新连接前取消旧监听任务 + await self._cancel_monitor_task() + self.ws = await websockets.connect( self.ws_url, additional_headers={"X-NLS-Token": self.token}, @@ -401,15 +404,7 @@ class TTSProvider(TTSProviderBase): """资源清理""" await super().close() self.activate_session = False - if self._monitor_task: - try: - self._monitor_task.cancel() - await self._monitor_task - except asyncio.CancelledError: - pass - except Exception as e: - logger.bind(tag=TAG).warning(f"关闭时取消监听任务错误: {e}") - self._monitor_task = None + await self._cancel_monitor_task() if self.ws: try: @@ -504,6 +499,18 @@ class TTSProvider(TTSProviderBase): opus_encoder=None, ) + async def _cancel_monitor_task(self): + """取消监听任务""" + if self._monitor_task and not self._monitor_task.done(): + self._monitor_task.cancel() + try: + await self._monitor_task + except asyncio.CancelledError: + pass + except Exception as e: + logger.bind(tag=TAG).warning(f"取消监听任务错误: {e}") + self._monitor_task = None + def to_tts(self, text: str) -> list: """非流式TTS处理,用于测试及保存音频文件的场景""" try: diff --git a/main/xiaozhi-server/core/providers/tts/huoshan_double_stream.py b/main/xiaozhi-server/core/providers/tts/huoshan_double_stream.py index 9cea8144..e1211109 100644 --- a/main/xiaozhi-server/core/providers/tts/huoshan_double_stream.py +++ b/main/xiaozhi-server/core/providers/tts/huoshan_double_stream.py @@ -229,6 +229,10 @@ class TTSProvider(TTSProviderBase): except: pass logger.bind(tag=TAG).debug("开始建立新连接...") + + # 建立新连接前取消旧监听任务 + await self._cancel_monitor_task() + ws_header = { "X-Api-App-Key": self.appId, "X-Api-Access-Key": self.access_token, @@ -472,16 +476,7 @@ class TTSProvider(TTSProviderBase): """资源清理方法""" await super().close() self.activate_session = False - # 取消监听任务 - if self._monitor_task: - try: - self._monitor_task.cancel() - await self._monitor_task - except asyncio.CancelledError: - pass - except Exception as e: - logger.bind(tag=TAG).warning(f"关闭时取消监听任务错误: {e}") - self._monitor_task = None + await self._cancel_monitor_task() if self.ws: try: @@ -731,6 +726,18 @@ class TTSProvider(TTSProviderBase): def wav_to_opus_data_audio_raw_stream(self, raw_data_var, is_end=False, callback: Callable[[Any], Any]=None): return self.opus_encoder.encode_pcm_to_opus_stream(raw_data_var, is_end, callback=callback) + async def _cancel_monitor_task(self): + """取消监听任务""" + if self._monitor_task and not self._monitor_task.done(): + self._monitor_task.cancel() + try: + await self._monitor_task + except asyncio.CancelledError: + pass + except Exception as e: + logger.bind(tag=TAG).warning(f"取消监听任务错误: {e}") + self._monitor_task = None + def to_tts(self, text: str) -> list: """非流式生成音频数据,用于生成音频及测试场景 Args: