from __future__ import annotations from dataclasses import dataclass DEFAULT_SPEACHES_URL = "http://192.168.86.150:8000" DEFAULT_HERMES_COMMAND = "hermes" DEFAULT_HERMES_SOURCE = "friday-voice" DEFAULT_CONFIRMED_THRESHOLD = 0.85 DEFAULT_PROBABLE_THRESHOLD = 0.70 DEFAULT_DATA_DIR = "/data" DEFAULT_WHISPER_MODEL = "deepdml/faster-whisper-large-v3-turbo-ct2" DEFAULT_TTS_MODEL = "speaches-ai/Kokoro-82M-v1.0-ONNX" DEFAULT_TTS_VOICE = "af_nova" @dataclass(slots=True) class Settings: """Runtime settings for the FRIDAY voice gateway. Defaults match Jeremy's residence services from the wiki crawl. """ speaches_url: str = DEFAULT_SPEACHES_URL hermes_command: str = DEFAULT_HERMES_COMMAND hermes_source: str = DEFAULT_HERMES_SOURCE speaker_confirmed_threshold: float = DEFAULT_CONFIRMED_THRESHOLD speaker_probable_threshold: float = DEFAULT_PROBABLE_THRESHOLD data_dir: str = DEFAULT_DATA_DIR whisper_model: str = DEFAULT_WHISPER_MODEL tts_model: str = DEFAULT_TTS_MODEL tts_voice: str = DEFAULT_TTS_VOICE @classmethod def from_env(cls, environ: dict[str, str] | None = None) -> "Settings": import os env = os.environ if environ is None else environ return cls( speaches_url=env.get("SPEACHES_URL", DEFAULT_SPEACHES_URL), hermes_command=env.get("HERMES_COMMAND", DEFAULT_HERMES_COMMAND), hermes_source=env.get("HERMES_SOURCE", DEFAULT_HERMES_SOURCE), data_dir=env.get("DATA_DIR", DEFAULT_DATA_DIR), whisper_model=env.get("WHISPER_MODEL", DEFAULT_WHISPER_MODEL), tts_model=env.get("TTS_MODEL", DEFAULT_TTS_MODEL), tts_voice=env.get("TTS_VOICE", DEFAULT_TTS_VOICE), speaker_confirmed_threshold=float( env.get("SPEAKER_CONFIRMED_THRESHOLD", DEFAULT_CONFIRMED_THRESHOLD) ), speaker_probable_threshold=float( env.get("SPEAKER_PROBABLE_THRESHOLD", DEFAULT_PROBABLE_THRESHOLD) ), )