136 lines
5.2 KiB
Python
136 lines
5.2 KiB
Python
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)
|