add banbanmini backend

This commit is contained in:
HycJack
2026-03-24 15:04:36 +08:00
parent 0d0f995dc2
commit 7510ca6df1
197 changed files with 13008 additions and 0 deletions

View 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)