""" hermes-piper-plugin (piper) Overrides Hermes' default TTS provider from Edge to Piper at plugin load time. Uses runtime monkey-patching — zero modifications to the Hermes repo. """ from __future__ import annotations import logging logger = logging.getLogger(__name__) _PATCHED = False def _apply_piper_patch() -> None: """Replace Edge default with Piper in TTS tool's provider selection. Python module-level constants are mutable — ``DEFAULT_PROVIDER`` is a string that ``_get_provider()`` reads at call time (not import time). Changing it after import is safe and immediately effective. """ global _PATCHED if _PATCHED: return try: import tools.tts_tool old_default = getattr(tools.tts_tool, "DEFAULT_PROVIDER", "edge") tools.tts_tool.DEFAULT_PROVIDER = "piper" logger.info("piper-plugin: DEFAULT_PROVIDER changed from '%s' → 'piper'", old_default) _PATCHED = True except ImportError: logger.warning("piper-plugin: tools.tts_tool not importable — patch deferred") except Exception as exc: logger.warning("piper-plugin: failed to patch DEFAULT_PROVIDER: %s", exc) def _on_session_start(**kw): """Log Piper default status at session start (idempotent).""" if not _PATCHED: _apply_piper_patch() try: import tools.tts_tool current = getattr(tools.tts_tool, "DEFAULT_PROVIDER", "?") logger.info("piper-plugin: TTS default provider = %s (patched=%s)", current, _PATCHED) except Exception: pass def register(ctx) -> None: """Register Piper default override.""" _apply_piper_patch() ctx.register_hook("on_session_start", _on_session_start) logger.info("piper-plugin: registered ✓ (TTS default → piper)")