File size: 4,171 Bytes
a16e0e5
 
 
 
 
60f8238
851495c
a16e0e5
a28f7e3
a16e0e5
fb6d02a
a16e0e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fb6d02a
 
 
851495c
fb6d02a
 
851495c
fb6d02a
 
 
 
 
a16e0e5
a28f7e3
a16e0e5
 
 
 
 
 
 
 
757f3be
 
fb6d02a
 
a16e0e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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配置
            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()