languagetool_layer.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. # -*- coding: utf-8 -*-
  2. """
  3. LanguageTool-Korrekturschicht.
  4. Volle Grammatik-Korrektur ueber lokalen JVM-Server (~30ms/Satz).
  5. Maechtiges Fallback fuer komplexe Fehler.
  6. """
  7. from trixy_core.stt.layers.base import CorrectionLayer
  8. from trixy_core.utils.debug import pdebug, pwarn
  9. try:
  10. import language_tool_python
  11. _HAS_LANGUAGETOOL = True
  12. except ImportError:
  13. _HAS_LANGUAGETOOL = False
  14. class LanguageToolLayer(CorrectionLayer):
  15. """LanguageTool Grammatik-Korrektur."""
  16. NAME = "languagetool"
  17. def __init__(self) -> None:
  18. self._tool: "language_tool_python.LanguageTool | None" = None
  19. def is_available(self) -> bool:
  20. """Prueft ob language_tool_python installiert ist."""
  21. return _HAS_LANGUAGETOOL
  22. def initialize(self, config: dict, language: str, protected_words: list[str]) -> bool:
  23. """Startet lokalen LanguageTool-Server."""
  24. if not _HAS_LANGUAGETOOL:
  25. return False
  26. lt_language = config.get("languagetool_language", f"{language}-DE")
  27. try:
  28. self._tool = language_tool_python.LanguageTool(lt_language)
  29. pdebug(f"[LanguageTool] Server gestartet fuer '{lt_language}'")
  30. return True
  31. except Exception as e:
  32. pwarn(f"[LanguageTool] Initialisierung fehlgeschlagen: {e}")
  33. self._tool = None
  34. return False
  35. def correct(self, text: str) -> str:
  36. """Korrigiert Text mit LanguageTool (volle Grammatik-Pruefung)."""
  37. if not self._tool or not text.strip():
  38. return text
  39. try:
  40. corrected = self._tool.correct(text)
  41. if corrected != text:
  42. pdebug(f"[LanguageTool] '{text}' → '{corrected}'")
  43. return corrected
  44. return text
  45. except Exception as e:
  46. pdebug(f"[LanguageTool] Fehler bei Korrektur: {e}")
  47. return text
  48. def shutdown(self) -> None:
  49. """Stoppt den LanguageTool-Server."""
  50. if self._tool:
  51. try:
  52. self._tool.close()
  53. except Exception:
  54. pass
  55. self._tool = None