File size: 2,206 Bytes
1824ea0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Application configuration loaded from .env with defaults."""

from __future__ import annotations

import os
from dataclasses import dataclass, field
from pathlib import Path

from dotenv import load_dotenv


def _load_env() -> None:
    """Load .env from project root (or CWD) if it exists."""
    for candidate in (Path(__file__).resolve().parents[2], Path.cwd()):
        env_path = candidate / ".env"
        if env_path.is_file():
            load_dotenv(env_path)
            return
    load_dotenv()


_load_env()


@dataclass(frozen=True)
class Settings:
    """Immutable application settings."""

    output_dir: str = field(
        default_factory=lambda: os.getenv("STEMSPLITTER_OUTPUT_DIR", "./output")
    )
    model_file_dir: str = field(
        default_factory=lambda: os.getenv(
            "STEMSPLITTER_MODEL_DIR", "/tmp/audio-separator-models/"
        )
    )
    default_2stem_model: str = field(
        default_factory=lambda: os.getenv(
            "STEMSPLITTER_2STEM_MODEL",
            "model_mel_band_roformer_ep_3005_sdr_11.4360.ckpt",
        )
    )
    default_4stem_model: str = field(
        default_factory=lambda: os.getenv(
            "STEMSPLITTER_4STEM_MODEL", "htdemucs_ft.yaml"
        )
    )
    output_format: str = field(
        default_factory=lambda: os.getenv("STEMSPLITTER_OUTPUT_FORMAT", "WAV")
    )
    output_bitrate: str = field(
        default_factory=lambda: os.getenv("STEMSPLITTER_OUTPUT_BITRATE", "320k")
    )
    sample_rate: int = field(
        default_factory=lambda: int(os.getenv("STEMSPLITTER_SAMPLE_RATE", "44100"))
    )
    normalization: float = field(
        default_factory=lambda: float(
            os.getenv("STEMSPLITTER_NORMALIZATION", "0.9")
        )
    )
    log_level: str = field(
        default_factory=lambda: os.getenv("STEMSPLITTER_LOG_LEVEL", "WARNING")
    )
    web_host: str = field(
        default_factory=lambda: os.getenv("STEMSPLITTER_WEB_HOST", "127.0.0.1")
    )
    web_port: int = field(
        default_factory=lambda: int(os.getenv("STEMSPLITTER_WEB_PORT", "7860"))
    )


def get_settings() -> Settings:
    """Return a fresh Settings instance (re-reads env vars)."""
    return Settings()