| | import time |
| | from contextlib import asynccontextmanager |
| |
|
| | from fastapi import FastAPI |
| |
|
| | from voice_dialogue.tts import tts_config_registry |
| | from voice_dialogue.utils import get_system_language, logger |
| | from .config import TTSConfigInitializer |
| | from .service_factories import get_core_voice_service_definitions |
| | from .service_manager import ServiceManager |
| | from ..schemas.tts_schemas import generate_model_id |
| |
|
| |
|
| | class LifespanManager: |
| | """应用生命周期管理器""" |
| |
|
| | def __init__(self, app: FastAPI): |
| | self.app = app |
| | self.service_manager = ServiceManager() |
| |
|
| | async def startup(self): |
| | """应用启动逻辑""" |
| | logger.info("正在启动VoiceDialogue API服务...") |
| | startup_start_time = time.time() |
| |
|
| | try: |
| | |
| | system_language = get_system_language() |
| | logger.info(f"系统默认语言: {system_language}") |
| |
|
| | |
| | tts_config = TTSConfigInitializer.initialize() |
| | self._update_app_state(tts_config) |
| |
|
| | default_tts_config = tts_config_registry.get_default_config_for_system() |
| | current_tts_model_id = None |
| | current_tts_character_name = None |
| |
|
| | if default_tts_config: |
| | current_tts_model_id = generate_model_id( |
| | default_tts_config.tts_type.value, |
| | default_tts_config.character_name |
| | ) |
| | current_tts_character_name = default_tts_config.character_name |
| | logger.info(f"系统默认TTS模型: {current_tts_character_name} (ID: {current_tts_model_id})") |
| |
|
| | |
| | service_definitions = get_core_voice_service_definitions(system_language) |
| |
|
| | |
| | await self._start_all_services(service_definitions) |
| |
|
| | |
| | self._update_app_state({ |
| | "service_manager": self.service_manager, |
| | "system_running": True, |
| | "system_language": system_language, |
| | "current_asr_language": system_language, |
| | "current_tts_model_id": current_tts_model_id, |
| | "current_tts_character_name": current_tts_character_name, |
| | }) |
| |
|
| | |
| | startup_duration = time.time() - startup_start_time |
| | service_status = self.service_manager.get_service_status() |
| |
|
| | logger.info(f"VoiceDialogue API服务启动完成") |
| | logger.info(f"启动总耗时: {startup_duration:.2f}秒") |
| | logger.info(f"启动的服务数量: {service_status['total_services']}") |
| |
|
| | if service_status['startup_errors']: |
| | logger.warning(f"启动时发生 {service_status['startup_errors']} 个错误") |
| |
|
| | except Exception as e: |
| | logger.error(f"服务启动失败: {e}", exc_info=True) |
| | await self.shutdown() |
| | raise |
| |
|
| | def _update_app_state(self, state_updates: dict): |
| | """更新应用状态""" |
| | for key, value in state_updates.items(): |
| | setattr(self.app.state, key, value) |
| |
|
| | async def _start_all_services(self, service_definitions): |
| | """启动所有服务""" |
| | for service_def in service_definitions: |
| | success = self.service_manager.start_service(service_def) |
| | if not success and service_def.required: |
| | raise RuntimeError(f"必需服务 {service_def.name} 启动失败") |
| |
|
| | async def shutdown(self): |
| | """应用关闭逻辑""" |
| | logger.info("正在关闭VoiceDialogue API服务...") |
| |
|
| | |
| | setattr(self.app.state, "system_running", False) |
| |
|
| | |
| | self.service_manager.stop_all_services() |
| |
|
| | logger.info("VoiceDialogue API服务已关闭") |
| |
|
| |
|
| | @asynccontextmanager |
| | async def lifespan(app: FastAPI): |
| | """FastAPI生命周期管理""" |
| | |
| | lifespan_manager = LifespanManager(app) |
| |
|
| | try: |
| | |
| | await lifespan_manager.startup() |
| | yield |
| | finally: |
| | |
| | await lifespan_manager.shutdown() |
| |
|