65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
import asyncio
|
||
from typing import List, Dict
|
||
from services.audio_session import AudioSession
|
||
from handlers.prompt_sound_handler import handle_prompt_sound_request
|
||
from handlers.response_coordinator import process_response
|
||
from interfaces.llm import LLM
|
||
from interfaces.tts import TTS
|
||
from utils.logger import session_logger
|
||
from services.tts_error_manager import tts_error_manager
|
||
from implementations.minimax_tts import MiniMaxTTS
|
||
|
||
async def generate_and_process_response(
|
||
transcript: str,
|
||
history: List[Dict[str, str]],
|
||
selected_role: dict,
|
||
device_id: str,
|
||
session_id: str,
|
||
device_history,
|
||
session: AudioSession,
|
||
language: str = None, # 默认为None
|
||
):
|
||
llm_service: LLM = session.llm_service
|
||
if hasattr(llm_service, "device_id"):
|
||
llm_service.device_id = device_id
|
||
if hasattr(llm_service, "session_id"):
|
||
llm_service.session_id = session_id
|
||
|
||
tts_service: TTS = session.tts_service
|
||
if not isinstance(tts_service, MiniMaxTTS):
|
||
session_logger.warning(
|
||
device_id, session_id, "检测到TTS服务不是MiniMaxTTS,正在切换到MiniMaxTTS"
|
||
)
|
||
tts_service = MiniMaxTTS(selected_role=selected_role)
|
||
session.tts_service = tts_service
|
||
|
||
try:
|
||
if isinstance(language, (int, float)) or (isinstance(language, str) and not language.isalpha()):
|
||
session_logger.warning(
|
||
device_id, session_id, f"检测到无效的语言代码: {language},将使用默认语言"
|
||
)
|
||
language = "zh" # 使用默认语言
|
||
|
||
await process_response(
|
||
transcript,
|
||
history,
|
||
selected_role,
|
||
device_id,
|
||
session_id,
|
||
device_history,
|
||
session,
|
||
language, # 传递合法化后的语言参数
|
||
)
|
||
except Exception as e:
|
||
session_logger.error(
|
||
device_id, session_id, f"生成或处理回复时出错: {e}", exc_info=True
|
||
)
|
||
if session.websocket and session.websocket.client_state.name == "CONNECTED":
|
||
try:
|
||
await session.websocket.send_text("TTS_ERROR")
|
||
except Exception as ws_error:
|
||
session_logger.error(device_id, session_id, f"发送TTS错误通知失败: {ws_error}")
|
||
await handle_prompt_sound_request(device_id, "tts_error")
|
||
finally:
|
||
await tts_error_manager.end_tts_session(device_id, session_id)
|