""" 环境变量和配置模块 统一管理项目路径、环境配置等 供整个项目共用 """ import os from pathlib import Path from typing import Literal # ============================================================ # 路径常量 # ============================================================ USER_HOME_ROOT = Path.home() # project_config.py 位于项目根目录 PROJECT_ROOT = Path(__file__).parent.resolve() # api_server 目录路径 API_SERVER_ROOT = PROJECT_ROOT / "api_server" # GPT_SoVITS 模块路径 GPT_SOVITS_ROOT = PROJECT_ROOT / "GPT_SoVITS" DEFAULT_APP_DIR = USER_HOME_ROOT / '.moyoyo-tts' # 默认数据目录 DEFAULT_DATA_DIR = DEFAULT_APP_DIR / "data" DEFAULT_MODEL_DIR = DEFAULT_APP_DIR / "models" # 预训练模型目录 PRETRAINED_MODELS_DIR = DEFAULT_MODEL_DIR / "pretrained_models" # 日志目录 LOGS_DIR = PROJECT_ROOT / "logs" # ============================================================ # 配置类 # ============================================================ class Settings: """ API Server 配置 支持从环境变量读取配置,提供合理的默认值 Example: >>> from project_config import settings >>> print(settings.PROJECT_ROOT) >>> print(settings.DEPLOYMENT_MODE) """ # 部署模式 DEPLOYMENT_MODE: Literal["local", "server"] = os.getenv("DEPLOYMENT_MODE", "local") # API 配置 API_V1_PREFIX: str = os.getenv("API_V1_PREFIX", "/api/v1") API_HOST: str = os.getenv("API_HOST", "0.0.0.0") API_PORT: int = int(os.getenv("API_PORT", "8000")) # 路径配置(可通过环境变量覆盖) PROJECT_ROOT: Path = Path(os.getenv("PROJECT_ROOT", str(PROJECT_ROOT))) API_SERVER_ROOT: Path = Path(os.getenv("API_SERVER_ROOT", str(API_SERVER_ROOT))) DATA_DIR: Path = Path(os.getenv("DATA_DIR", str(DEFAULT_DATA_DIR))) # SQLite 数据库路径 SQLITE_PATH: Path = Path(os.getenv("SQLITE_PATH", str(DEFAULT_DATA_DIR / "tasks.db"))) # 实验根目录(训练输出目录) EXP_ROOT: Path = Path(os.getenv("EXP_ROOT", str(LOGS_DIR))) # 任务配置 LOCAL_MAX_WORKERS: int = int(os.getenv("LOCAL_MAX_WORKERS", "1")) # 预训练模型路径 BERT_PRETRAINED_DIR: str = os.getenv( "BERT_PRETRAINED_DIR", str(PRETRAINED_MODELS_DIR / "chinese-roberta-wwm-ext-large") ) SSL_PRETRAINED_DIR: str = os.getenv( "SSL_PRETRAINED_DIR", str(PRETRAINED_MODELS_DIR / "chinese-hubert-base") ) PRETRAINED_S2G: str = os.getenv( "PRETRAINED_S2G", str(PRETRAINED_MODELS_DIR / "gsv-v2final-pretrained" / "s2G2333k.pth") ) PRETRAINED_S2D: str = os.getenv( "PRETRAINED_S2D", str(PRETRAINED_MODELS_DIR / "gsv-v2final-pretrained" / "s2D2333k.pth") ) PRETRAINED_S1: str = os.getenv( "PRETRAINED_S1", str(PRETRAINED_MODELS_DIR / "gsv-v2final-pretrained" / "s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt") ) # Pipeline 脚本路径 @property def PIPELINE_SCRIPT_PATH(self) -> Path: """Pipeline 执行脚本路径""" return self.API_SERVER_ROOT / "app" / "scripts" / "run_pipeline.py" # 临时配置文件目录 @property def CONFIGS_DIR(self) -> Path: """临时配置文件目录""" path = self.DATA_DIR / "configs" path.mkdir(parents=True, exist_ok=True) return path def __repr__(self) -> str: return ( f"Settings(\n" f" DEPLOYMENT_MODE={self.DEPLOYMENT_MODE!r},\n" f" PROJECT_ROOT={self.PROJECT_ROOT},\n" f" API_SERVER_ROOT={self.API_SERVER_ROOT},\n" f" DATA_DIR={self.DATA_DIR},\n" f" SQLITE_PATH={self.SQLITE_PATH},\n" f")" ) # 全局配置实例 settings = Settings() def get_pythonpath() -> str: """ 获取 PYTHONPATH 环境变量值 用于子进程启动时设置正确的模块搜索路径 Returns: PYTHONPATH 字符串 """ paths = [ str(PROJECT_ROOT), str(GPT_SOVITS_ROOT), ] return os.pathsep.join(paths) def ensure_data_dirs() -> None: """ 确保必要的数据目录存在 """ settings.DATA_DIR.mkdir(parents=True, exist_ok=True) settings.CONFIGS_DIR.mkdir(parents=True, exist_ok=True)