# -*- coding: utf-8 -*- """ Client/Satellite-Konfiguration. """ from dataclasses import dataclass, field @dataclass class ServerConnectionConfig: """Server-Verbindungs-Konfiguration.""" host: str = "localhost" port: int = 2101 reconnect_interval_seconds: float = 5.0 connection_timeout_seconds: float = 10.0 @dataclass class ClientAudioConfig: """Audio-Konfiguration für den Client.""" # Sprach-Audio (Wakeword-Erkennung) sample_rate: int = 16000 channels: int = 1 bit_depth: int = 16 # Musik-Wiedergabe (sollte mit Server übereinstimmen) music_sample_rate: int = 44100 # 44.1kHz - Standard für die meisten Geräte music_channels: int = 2 music_bit_depth: int = 16 # Geräte input_device: str | None = None output_device: str | None = None buffer_size: int = 1024 @dataclass class ClientWakewordConfig: """Wakeword-Konfiguration für den Client.""" models: list[str] = field(default_factory=lambda: ["custom", "system_command"]) threshold: float = 0.5 model_directory: str = "models/wakeword" use_onnx: bool = True enabled: bool = True silence_timeout_seconds: float = 3.0 max_recording_seconds: float = 60.0 no_speech_timeout_seconds: float = 5.0 pre_buffer_seconds: float = 0.5 wakeword_cooldown_seconds: float = 3.0 @dataclass class SatelliteIdentityConfig: """Satelliten-Identität.""" room: str = "" alias: str = "" mac_address: str = "" # Wird automatisch ermittelt wenn leer @dataclass class ClientLoggingConfig: """Logging-Konfiguration für den Client.""" level: str = "INFO" log_directory: str = "logs" @dataclass class ClientConfig: """Haupt-Client-Konfiguration.""" server: ServerConnectionConfig = field(default_factory=ServerConnectionConfig) audio: ClientAudioConfig = field(default_factory=ClientAudioConfig) wakeword: ClientWakewordConfig = field(default_factory=ClientWakewordConfig) identity: SatelliteIdentityConfig = field(default_factory=SatelliteIdentityConfig) logging: ClientLoggingConfig = field(default_factory=ClientLoggingConfig) config_port: int = 2105 config_listener_enabled: bool = True assets_directory: str = "assets" profile: str = "default"