Files
whisper-local/whisper_local/__main__.py
T
2026-04-06 20:29:45 +02:00

74 lines
2.1 KiB
Python

"""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 HotkeyListener
from whisper_local.inserter import 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 = Inserter()
self.hotkey = HotkeyListener(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()