| """ |
| 环境变量和配置模块 |
| |
| 统一管理项目路径、环境配置等 |
| 供整个项目共用 |
| """ |
|
|
| import os |
| from pathlib import Path |
| from typing import Literal |
|
|
| |
| |
| |
|
|
| USER_HOME_ROOT = Path.home() |
|
|
| |
| PROJECT_ROOT = Path(__file__).parent.resolve() |
|
|
| |
| API_SERVER_ROOT = PROJECT_ROOT / "api_server" |
|
|
| |
| 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_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_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") |
| ) |
|
|
| |
| @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) |
|
|