diff --git a/main/xiaozhi-server/core/handle/reportHandle.py b/main/xiaozhi-server/core/handle/reportHandle.py index 09ad0218..cc78a157 100644 --- a/main/xiaozhi-server/core/handle/reportHandle.py +++ b/main/xiaozhi-server/core/handle/reportHandle.py @@ -94,9 +94,12 @@ def opus_to_wav(conn, opus_data): # 返回完整的WAV数据 return bytes(wav_header) + pcm_data_bytes finally: - if decoder: - del decoder - gc.collect() + if decoder is not None: + try: + del decoder + gc.collect() + except Exception as e: + conn.logger.bind(tag=TAG).debug(f"释放decoder资源时出错: {e}") def enqueue_tts_report(conn, text, opus_data): diff --git a/main/xiaozhi-server/core/providers/asr/aliyun_stream.py b/main/xiaozhi-server/core/providers/asr/aliyun_stream.py index 0728f6c6..23999fca 100644 --- a/main/xiaozhi-server/core/providers/asr/aliyun_stream.py +++ b/main/xiaozhi-server/core/providers/asr/aliyun_stream.py @@ -349,6 +349,11 @@ class ASRProvider(ASRProviderBase): async def close(self): """关闭资源""" await self._cleanup(None) - if hasattr(self, 'decoder'): - del self.decoder - gc.collect() + if hasattr(self, 'decoder') and self.decoder is not None: + try: + del self.decoder + self.decoder = None + gc.collect() + logger.bind(tag=TAG).debug("Aliyun decoder resources released") + except Exception as e: + logger.bind(tag=TAG).debug(f"释放Aliyun decoder资源时出错: {e}") diff --git a/main/xiaozhi-server/core/providers/asr/base.py b/main/xiaozhi-server/core/providers/asr/base.py index d0a26cf7..2d88ff70 100644 --- a/main/xiaozhi-server/core/providers/asr/base.py +++ b/main/xiaozhi-server/core/providers/asr/base.py @@ -268,6 +268,9 @@ class ASRProviderBase(ABC): logger.bind(tag=TAG).error(f"音频解码过程发生错误: {e}") return [] finally: - if decoder: - del decoder - gc.collect() + if decoder is not None: + try: + del decoder + gc.collect() + except Exception as e: + logger.bind(tag=TAG).debug(f"释放decoder资源时出错: {e}") diff --git a/main/xiaozhi-server/core/providers/asr/doubao_stream.py b/main/xiaozhi-server/core/providers/asr/doubao_stream.py index ed1c0c9d..7d0871a6 100644 --- a/main/xiaozhi-server/core/providers/asr/doubao_stream.py +++ b/main/xiaozhi-server/core/providers/asr/doubao_stream.py @@ -373,14 +373,14 @@ class ASRProvider(ASRProviderBase): self.is_processing = False # 显式释放decoder资源 - if hasattr(self, 'decoder') and self.decoder: + if hasattr(self, 'decoder') and self.decoder is not None: try: del self.decoder self.decoder = None gc.collect() - logger.bind(tag=TAG).info("Doubao decoder resources released") + logger.bind(tag=TAG).debug("Doubao decoder resources released") except Exception as e: - logger.bind(tag=TAG).error(f"Error releasing Doubao decoder: {e}") + logger.bind(tag=TAG).debug(f"释放Doubao decoder资源时出错: {e}") # 清理所有连接的音频缓冲区 if hasattr(self, '_connections'): diff --git a/main/xiaozhi-server/core/providers/asr/xunfei_stream.py b/main/xiaozhi-server/core/providers/asr/xunfei_stream.py index 0022d693..7bd992a9 100644 --- a/main/xiaozhi-server/core/providers/asr/xunfei_stream.py +++ b/main/xiaozhi-server/core/providers/asr/xunfei_stream.py @@ -515,14 +515,14 @@ class ASRProvider(ASRProviderBase): self.is_processing = False # 显式释放decoder资源 - if hasattr(self, 'decoder') and self.decoder: + if hasattr(self, 'decoder') and self.decoder is not None: try: del self.decoder self.decoder = None gc.collect() - logger.bind(tag=TAG).info("Xunfei decoder resources released") + logger.bind(tag=TAG).debug("Xunfei decoder resources released") except Exception as e: - logger.bind(tag=TAG).error(f"Error releasing Xunfei decoder: {e}") + logger.bind(tag=TAG).debug(f"释放Xunfei decoder资源时出错: {e}") # 清理所有连接的音频缓冲区 if hasattr(self, "_connections"): diff --git a/main/xiaozhi-server/core/providers/vad/silero.py b/main/xiaozhi-server/core/providers/vad/silero.py index 738c2646..6fc26291 100644 --- a/main/xiaozhi-server/core/providers/vad/silero.py +++ b/main/xiaozhi-server/core/providers/vad/silero.py @@ -38,9 +38,12 @@ class VADProvider(VADProviderBase): self.frame_window_threshold = 3 def __del__(self): - if hasattr(self, 'decoder'): - del self.decoder - gc.collect() + if hasattr(self, 'decoder') and self.decoder is not None: + try: + del self.decoder + gc.collect() + except Exception: + pass def is_vad(self, conn, opus_packet): try: diff --git a/main/xiaozhi-server/core/utils/util.py b/main/xiaozhi-server/core/utils/util.py index 190c4d6a..9586ace8 100644 --- a/main/xiaozhi-server/core/utils/util.py +++ b/main/xiaozhi-server/core/utils/util.py @@ -395,8 +395,12 @@ def opus_datas_to_wav_bytes(opus_datas, sample_rate=16000, channels=1): wf.writeframes(pcm_bytes) return wav_buffer.getvalue() finally: - del decoder - gc.collect() + if decoder is not None: + try: + del decoder + gc.collect() + except Exception: + pass def check_vad_update(before_config, new_config):