update:内存泄漏

This commit is contained in:
3030332422
2025-11-23 11:55:38 +08:00
parent 39cd0fe1ac
commit 5d439a4168
8 changed files with 107 additions and 50 deletions
@@ -5,6 +5,7 @@ import hmac
import base64
import hashlib
import asyncio
import gc
import requests
import websockets
import opuslib_next
@@ -347,4 +348,7 @@ class ASRProvider(ASRProviderBase):
async def close(self):
"""关闭资源"""
await self._cleanup()
await self._cleanup(None)
if hasattr(self, 'decoder'):
del self.decoder
gc.collect()
@@ -10,6 +10,7 @@ import traceback
import threading
import opuslib_next
import concurrent.futures
import gc
from abc import ABC, abstractmethod
from config.logger import setup_logging
from typing import Optional, Tuple, List
@@ -241,6 +242,7 @@ class ASRProviderBase(ABC):
@staticmethod
def decode_opus(opus_data: List[bytes]) -> List[bytes]:
"""将Opus音频数据解码为PCM数据"""
decoder = None
try:
decoder = opuslib_next.Decoder(16000, 1)
pcm_data = []
@@ -265,3 +267,7 @@ class ASRProviderBase(ABC):
except Exception as e:
logger.bind(tag=TAG).error(f"音频解码过程发生错误: {e}")
return []
finally:
if decoder:
del decoder
gc.collect()
@@ -4,6 +4,7 @@ import uuid
import asyncio
import websockets
import opuslib_next
import gc
from core.providers.asr.base import ASRProviderBase
from config.logger import setup_logging
from core.providers.asr.dto.dto import InterfaceType
@@ -370,6 +371,17 @@ class ASRProvider(ASRProviderBase):
pass
self.forward_task = None
self.is_processing = False
# 显式释放decoder资源
if hasattr(self, 'decoder') and self.decoder:
try:
del self.decoder
self.decoder = None
gc.collect()
logger.bind(tag=TAG).info("Doubao decoder resources released")
except Exception as e:
logger.bind(tag=TAG).error(f"Error releasing Doubao decoder: {e}")
# 清理所有连接的音频缓冲区
if hasattr(self, '_connections'):
for conn in self._connections.values():
@@ -5,6 +5,7 @@ import hashlib
import asyncio
import websockets
import opuslib_next
import gc
from time import mktime
from datetime import datetime
from urllib.parse import urlencode
@@ -512,6 +513,17 @@ class ASRProvider(ASRProviderBase):
pass
self.forward_task = None
self.is_processing = False
# 显式释放decoder资源
if hasattr(self, 'decoder') and self.decoder:
try:
del self.decoder
self.decoder = None
gc.collect()
logger.bind(tag=TAG).info("Xunfei decoder resources released")
except Exception as e:
logger.bind(tag=TAG).error(f"Error releasing Xunfei decoder: {e}")
# 清理所有连接的音频缓冲区
if hasattr(self, "_connections"):
for conn in self._connections.values():
@@ -2,6 +2,7 @@ import time
import numpy as np
import torch
import opuslib_next
import gc
from config.logger import setup_logging
from core.providers.vad.base import VADProviderBase
@@ -36,6 +37,11 @@ class VADProvider(VADProviderBase):
# 至少要多少帧才算有语音
self.frame_window_threshold = 3
def __del__(self):
if hasattr(self, 'decoder'):
del self.decoder
gc.collect()
def is_vad(self, conn, opus_packet):
try:
pcm_frame = self.decoder.decode(opus_packet, 960)