from functools import lru_cache from typing import Literal from pydantic import field_validator from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore" ) host: str = "0.0.0.0" port: int = 7860 model_dir: str = "/app/models/supertonic-2" kitten_model_name: str = "KittenML/kitten-tts-micro-0.8" kitten_cache_dir: str = "/app/models/hf-cache" enable_melo_tts: bool = False melo_device: Literal["cpu"] = "cpu" melo_fail_fast: bool = True custom_voice_dir: str = "/app/voices" kokoro_model_dir: str = "/app/models/kokoro" kokoro_model_file: str = "model_q8f16.onnx" default_model: str = "supertonic-2" default_voice: str = "alloy" default_response_format: Literal["wav"] = "wav" default_speed: float = 1.05 default_quality: Literal["low", "balanced", "high"] = "balanced" default_language: Literal["en", "ko", "es", "pt", "fr"] = "en" require_auth: bool = False api_key: str = "" log_level: str = "info" omp_num_threads: int = 1 ort_intra_op_num_threads: int = 1 ort_inter_op_num_threads: int = 1 max_input_length: int = 5000 job_poll_interval: float = 2.0 workspace_dir: str = "/tmp/tts-server" persistent_output_dir: str = "/store" @field_validator("default_speed") @classmethod def validate_default_speed(cls, value: float) -> float: if not 0.25 <= value <= 4.0: raise ValueError("default_speed must be between 0.25 and 4.0") return value @lru_cache(maxsize=1) def get_settings() -> Settings: return Settings()