import os from dotenv import load_dotenv load_dotenv() MUAPI_API_KEY = os.getenv("MUAPI_API_KEY", "").strip() MUAPI_BASE_URL = os.getenv("MUAPI_BASE_URL", "https://api.muapi.ai/api/v1").rstrip("/") POLL_INTERVAL_SECONDS = float(os.getenv("MUAPI_POLL_INTERVAL", "5")) POLL_TIMEOUT_SECONDS = float(os.getenv("MUAPI_POLL_TIMEOUT", "600")) # Local-mode (--mode local) settings — only consulted when running offline. OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "").strip() OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-4o-mini") GEMINI_API_KEY = os.getenv("GEMINI_API_KEY", "").strip() GEMINI_MODEL = os.getenv("GEMINI_MODEL", "gemini-2.5-flash") LLM_PROVIDER = os.getenv("LLM_PROVIDER", "openai").strip().lower() LOCAL_WHISPER_MODEL = os.getenv("LOCAL_WHISPER_MODEL", "base") LOCAL_WHISPER_DEVICE = os.getenv("LOCAL_WHISPER_DEVICE", "auto") # auto / cpu / cuda LOCAL_OUTPUT_DIR = os.getenv("LOCAL_OUTPUT_DIR", "output") # VAD (Voice Activity Detection) settings for faster-whisper # Default threshold is 0.5; lower = more sensitive, higher = less sensitive # Default min_speech_duration_ms is 250ms; increase to avoid tiny false positives # Default min_silence_duration_ms is 2000ms; increase to avoid splitting mid-sentence # DISABLED by default because VAD is too aggressive on mixed speech/music content LOCAL_WHISPER_VAD_FILTER = os.getenv("LOCAL_WHISPER_VAD_FILTER", "false").strip().lower() == "true" _vad_params_env = os.getenv("LOCAL_WHISPER_VAD_PARAMETERS", "") if _vad_params_env: import json LOCAL_WHISPER_VAD_PARAMETERS = json.loads(_vad_params_env) else: # Match faster-whisper defaults when VAD is enabled LOCAL_WHISPER_VAD_PARAMETERS = { "threshold": 0.5, "min_speech_duration_ms": 250, "max_speech_duration_s": float("inf"), "min_silence_duration_ms": 2000, "speech_pad_ms": 400, } def require_api_key() -> str: if not MUAPI_API_KEY: raise RuntimeError( "MUAPI_API_KEY is not set. Add it to your .env file or export it as an env var." ) return MUAPI_API_KEY def require_openai_key() -> str: if not OPENAI_API_KEY: raise RuntimeError( "OPENAI_API_KEY is not set. Local mode needs an OpenAI key for highlight ranking. " "Add it to your .env or export it, or switch back to --mode api." ) return OPENAI_API_KEY def require_gemini_key() -> str: if not GEMINI_API_KEY: raise RuntimeError( "GEMINI_API_KEY is not set. Local mode needs a Gemini key when LLM_PROVIDER=gemini. " "Add it to your .env or export it, or switch LLM_PROVIDER back to openai." ) return GEMINI_API_KEY