MoYoYo.tts / project_config.py
liumaolin
refactor(config): centralize configuration management in `project_config`
8f68d0a
"""
环境变量和配置模块
统一管理项目路径、环境配置等
供整个项目共用
"""
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)