import os import sys from pathlib import Path def get_base_path() -> Path: if getattr(sys, 'frozen', False): if hasattr(sys, '_MEIPASS'): return Path(sys._MEIPASS) else: return Path(sys.executable).parent return Path(__file__).parent.parent class Config: BASE_PATH = get_base_path() IS_FROZEN = getattr(sys, 'frozen', False) # Server settings HOST = os.environ.get('SUPERTONIC3_HOST', '0.0.0.0') PORT = int(os.environ.get('SUPERTONIC3_PORT', '7860')) # Model settings LANGUAGE = os.environ.get('SUPERTONIC3_LANGUAGE', None) AUTO_DOWNLOAD = os.environ.get('SUPERTONIC3_AUTO_DOWNLOAD', 'true').lower() == 'true' # Sample rate (supertonic3 outputs 44100 Hz) SAMPLE_RATE = 44100 # SuperTonic3 supported languages SUPPORTED_LANGUAGES = [ 'afrikaans', 'arabic', 'bengali', 'bulgarian', 'czech', 'danish', 'german', 'greek', 'english', 'spanish', 'finnish', 'french', 'hindi', 'hungarian', 'indonesian', 'italian', 'japanese', 'korean', 'malayalam', 'dutch', 'polish', 'portuguese', 'romanian', 'russian', 'swahili', 'swedish', 'tamil', 'telugu', 'thai', 'turkish', 'ukrainian', 'urdu', 'vietnamese', 'chinese', ] # Voice directory for custom voice samples VOICES_DIR = os.environ.get('SUPERTONIC3_VOICES_DIR', None) # Voice presets directory (JSON style embeddings, tracked in git) VOICE_PRESETS_DIR = os.environ.get( 'SUPERTONIC3_VOICE_PRESETS_DIR', str(BASE_PATH / 'voice_presets'), ) DEFAULT_VOICE = os.environ.get('SUPERTONIC3_DEFAULT_VOICE', 'M1') # Built-in voice names (M1-M5 = male, F1-F5 = female) BUILTIN_VOICES = ['M1', 'M2', 'M3', 'M4', 'M5', 'F1', 'F2', 'F3', 'F4', 'F5'] # Supported extensions for custom voice samples VOICE_EXTENSIONS = ('.wav', '.mp3', '.flac') # Supported extensions for voice preset files (JSON style embeddings) VOICE_PRESET_EXTENSIONS = ('.json',) # Streaming default STREAM_DEFAULT = os.environ.get('SUPERTONIC3_STREAM_DEFAULT', 'false').lower() == 'true' # Text preprocessing default TEXT_PREPROCESS_DEFAULT = ( os.environ.get('SUPERTONIC3_TEXT_PREPROCESS_DEFAULT', 'false').lower() == 'true' ) # Docker detection @staticmethod def _is_docker() -> bool: if os.path.exists('/.dockerenv'): return True try: with open('/proc/1/cgroup') as f: return any('docker' in line or 'containerd' in line for line in f) except (FileNotFoundError, PermissionError): return False IS_DOCKER = _is_docker.__func__() # Logging LOG_LEVEL = os.environ.get('SUPERTONIC3_LOG_LEVEL', 'INFO') LOG_DIR = os.environ.get('SUPERTONIC3_LOG_DIR', str(BASE_PATH / 'logs')) LOG_FILE = os.environ.get('SUPERTONIC3_LOG_FILE', 'supertonic3.log') LOG_MAX_BYTES = int(os.environ.get('SUPERTONIC3_LOG_MAX_BYTES', str(10 * 1024 * 1024))) LOG_BACKUP_COUNT = int(os.environ.get('SUPERTONIC3_LOG_BACKUP_COUNT', '5')) @classmethod def get_template_folder(cls) -> str: return str(cls.BASE_PATH / 'templates') @classmethod def get_static_folder(cls) -> str: return str(cls.BASE_PATH / 'static')