"""Entry-Point für whisper-local.""" import asyncio import logging import sys from whisper_local.config import Config, load_config from whisper_local.hotkey import create_listener from whisper_local.inserter import create_inserter from whisper_local.recorder import Recorder from whisper_local.transcriber import Transcriber logger = logging.getLogger(__name__) class App: def __init__(self, config: Config | None = None): if config is None: config = load_config() self.recorder = Recorder( sample_rate=config.sample_rate, channels=config.channels, min_duration=config.min_duration, ) self.transcriber = Transcriber( model_name=config.whisper_model, compute_type=config.compute_type, language=config.language, ) self.inserter = create_inserter() self.hotkey = create_listener(key_name=config.hotkey) self.hotkey.on_press = self.on_press self.hotkey.on_release = self.on_release async def on_press(self) -> None: """Callback: Hotkey gedrückt — Aufnahme starten.""" logger.info("Aufnahme startet...") self.recorder.start() async def on_release(self) -> None: """Callback: Hotkey losgelassen — Aufnahme stoppen, transkribieren, einfügen.""" audio = self.recorder.stop() if audio is None: logger.info("Keine Audio-Daten, übersprungen") return logger.info("Transkribiere...") text = self.transcriber.transcribe(audio) if text: await self.inserter.insert(text) async def run(self) -> None: """Startet den Hauptloop.""" logger.info("whisper-local gestartet, warte auf Hotkey...") await self.hotkey.listen() def main(): logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", ) app = App() try: asyncio.run(app.run()) except KeyboardInterrupt: logger.info("Beendet") sys.exit(0) if __name__ == "__main__": main()