add banbanmini backend
This commit is contained in:
135
talkingq-url/handlers/prompt_sound_handler.py
Normal file
135
talkingq-url/handlers/prompt_sound_handler.py
Normal file
@@ -0,0 +1,135 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user