79 lines
3.0 KiB
Python
79 lines
3.0 KiB
Python
import asyncio
|
||
from utils.logger import session_logger
|
||
from services.interrupt_handler import interrupt_handler
|
||
from services.tts_error_manager import tts_error_manager
|
||
|
||
|
||
class InterruptionHelper:
|
||
|
||
|
||
@staticmethod
|
||
async def notify_client_tts_error(device_id: str, session_id: str):
|
||
|
||
try:
|
||
if not await tts_error_manager.can_send_error(device_id, session_id):
|
||
session_logger.info(device_id, session_id, "已经发送过TTS_ERROR,不再重复发送")
|
||
return False
|
||
|
||
from services.connection_manager import connection_manager
|
||
|
||
websocket = await connection_manager.get_connection(device_id)
|
||
if websocket and websocket.client_state.name == "CONNECTED":
|
||
await websocket.send_text("TTS_ERROR")
|
||
session_logger.info(device_id, session_id, "已通知客户端TTS错误")
|
||
return True
|
||
except Exception as e:
|
||
session_logger.error(device_id, session_id, f"发送TTS错误通知失败: {e}")
|
||
return False
|
||
|
||
@staticmethod
|
||
async def send_error_prompt_sound(device_id: str, session_id: str):
|
||
|
||
try:
|
||
from handlers.prompt_sound_handler import handle_prompt_sound_request
|
||
|
||
await handle_prompt_sound_request(device_id, "tts_error")
|
||
session_logger.info(device_id, session_id, "已发送错误提示音")
|
||
return True
|
||
except Exception as e:
|
||
session_logger.error(device_id, session_id, f"发送错误提示音失败: {e}")
|
||
return False
|
||
|
||
@staticmethod
|
||
async def handle_llm_timeout(device_id: str, session_id: str, llm_service=None):
|
||
|
||
session_key = (device_id, session_id)
|
||
await interrupt_handler.set_interrupt_state(session_key, True)
|
||
if llm_service and hasattr(llm_service, "closed"):
|
||
llm_service.closed = True
|
||
await InterruptionHelper.send_error_prompt_sound(device_id, session_id)
|
||
await InterruptionHelper.notify_client_tts_error(device_id, session_id)
|
||
session_logger.error(device_id, session_id, "已处理LLM超时")
|
||
|
||
@staticmethod
|
||
async def register_queue_cleanup(session_key: tuple, queue: asyncio.Queue):
|
||
|
||
if queue is None:
|
||
return
|
||
|
||
async def cleanup_queue():
|
||
try:
|
||
await queue.put(None)
|
||
while not queue.empty():
|
||
try:
|
||
queue.get_nowait()
|
||
queue.task_done()
|
||
except asyncio.QueueEmpty:
|
||
break
|
||
device_id, session_id = session_key
|
||
session_logger.info(device_id, session_id, "队列已清空")
|
||
except Exception as e:
|
||
device_id, session_id = session_key
|
||
session_logger.error(device_id, session_id, f"清空队列时出错: {e}")
|
||
|
||
await interrupt_handler.register_cleanup_handler(
|
||
session_key,
|
||
cleanup_queue,
|
||
priority=interrupt_handler.PRIORITY["QUEUE_CLEANUP"],
|
||
)
|