import os from services.connection_manager import connection_manager from services.device_config import device_config_manager from services.role_manager import role_manager from config import settings from utils.logger import session_logger async def handle_prompt_sound_request( device_id: str, prompt_type: str, language: str = None ): websocket = await connection_manager.get_connection(device_id) if websocket and websocket.client_state.name == "CONNECTED": try: sound_files = { "welcome": "welcome.mp3", "error": "error.mp3", "goodbye": "goodbye.mp3", "interrupt": "interrupt.mp3", "tts_error": "tts_error.mp3", } file_name = sound_files.get(prompt_type) if not file_name: session_logger.error( device_id, "sound", f"未找到提示音类型: {prompt_type}" ) return device_config = await device_config_manager.get_config(device_id, force_refresh=True) effective_language = language if ( not effective_language and device_config and hasattr(device_config, "preferred_language") and device_config.preferred_language ): effective_language = device_config.preferred_language session_logger.info( device_id, "sound", f"使用设备首选语言选择提示音: {effective_language}" ) selected_role_key = ( device_config.selected_role_key if device_config else settings.selected_role_key ) session_logger.info( device_id, "sound", f"从设备配置获取角色:{selected_role_key}" ) selected_role = await role_manager.get_role_config_for_language( selected_role_key, effective_language ) if not selected_role: session_logger.error( device_id, "sound", f"未找到角色 {selected_role_key} 的配置" ) return base_url = None if "multilingual" in selected_role: current_lang = effective_language or selected_role.get( "default_language", "zh" ) if current_lang in selected_role["multilingual"]: lang_config = selected_role["multilingual"][current_lang] if "url" in lang_config: base_url = lang_config["url"] session_logger.info( device_id, "sound", f"使用多语言({current_lang})配置的URL: {base_url}" ) if not base_url and "url" in selected_role: base_url = selected_role["url"] session_logger.info( device_id, "sound", f"使用角色基础URL: {base_url}" ) if not base_url: session_logger.error( device_id, "sound", f"角色 {selected_role_key} 未配置URL" ) return sound_file_path = os.path.join(settings.assets_dir, base_url, file_name) if not os.path.exists(sound_file_path): session_logger.error( device_id, "sound", f"提示音文件不存在: {sound_file_path}" ) return prompt_sound_url = f"http://{settings.server_host}:{settings.server_port}/assets/{base_url}/{file_name}" try: await websocket.send_text(f"PROMPT_SOUND_URL:{prompt_sound_url}") session_logger.info( device_id, "sound", f"已发送提示音URL给客户端: {prompt_sound_url}" ) except Exception as e: session_logger.error( device_id, "sound", f"发送提示音URL失败: {e}" ) except Exception as e: session_logger.error( device_id, "sound", f"准备提示音时出错: {e}", exc_info=True ) else: session_logger.error( device_id, "sound", "未找到设备的 WebSocket 连接或连接已关闭" ) async def send_welcome_sound( device_id: str, role_key: str = None, language: str = None ): device_config = await device_config_manager.get_config(device_id, force_refresh=True) if role_key is None and device_config: role_key = device_config.selected_role_key session_logger.info( device_id, "sound", f"使用设备配置的角色发送欢迎音效: {role_key}" ) if ( language is None and device_config and hasattr(device_config, "preferred_language") and device_config.preferred_language ): language = device_config.preferred_language session_logger.info( device_id, "sound", f"使用设备首选语言发送欢迎音效: {language}" ) await handle_prompt_sound_request(device_id, "welcome", language)