chore(voice): log wake-word lifecycle at INFO for diagnosability

The detector logged listen/detect/close at debug, invisible at the
default level. Promote listen-start, phrase-detected, stream-closed, and
the wake.start outcome (disabled / unavailable / listening) to INFO, and
log wake.detected emission, so a non-triggering setup is diagnosable from
gateway/gui.log without flipping global log levels.
This commit is contained in:
Brooklyn Nicholson 2026-06-26 22:18:10 -05:00 • committed by Teknium
parent 8a4d58287e
commit d2fab75ffb
No known key found for this signature in database
2 changed files with 12 additions and 3 deletions

View file

@ -356,13 +356,13 @@ class WakeWordDetector:
logger.error("wake word: failed to open microphone: %s", e)
return
logger.debug("wake word: listening (frame=%d)", frame_length)
logger.info("wake word: listening (frame=%d, rate=%d)", frame_length, SAMPLE_RATE)
try:
while not self._stop.is_set():
try:
data, _overflow = stream.read(frame_length)
except Exception as e:
logger.debug("wake word: stream read error: %s", e)
logger.warning("wake word: stream read error: %s", e)
break
frame = data[:, 0] if getattr(data, "ndim", 1) == 2 else data
try:
@ -374,17 +374,20 @@ class WakeWordDetector:
now = time.monotonic()
if now - self._last_fire >= self.cooldown:
self._last_fire = now
logger.info("wake word: phrase detected — firing callback")
try:
self.on_wake()
except Exception as e:
logger.warning("wake word callback failed: %s", e)
else:
logger.debug("wake word: detection within cooldown — ignored")
finally:
try:
stream.stop()
stream.close()
except Exception:
pass
logger.debug("wake word: stream closed")
logger.info("wake word: stream closed")
# ---------------------------------------------------------------------------

View file

@ -17628,6 +17628,7 @@ def _wake_on_detect() -> None:
phrase = wake_phrase()
except Exception:
phrase = ""
logger.info("wake.detected: emitting to sid=%r", sid)
_emit("wake.detected", sid, {"phrase": phrase})
@ -17652,9 +17653,12 @@ def _(rid, params: dict) -> dict:
cfg = load_wake_word_config()
if not wake_surface_enabled(surface, cfg):
logger.info("wake.start(%s): disabled for surface (enabled=%s, surface=%s)",
surface, cfg.get("enabled"), cfg.get("surface"))
return _ok(rid, {"started": False, "reason": "disabled_for_surface"})
reqs = check_wake_word_requirements(cfg)
if not reqs["available"]:
logger.warning("wake.start(%s): not available — %s", surface, reqs.get("hint"))
return _ok(rid, {"started": False, "reason": reqs.get("hint") or "unavailable"})
with _wake_lock:
@ -17662,9 +17666,11 @@ def _(rid, params: dict) -> dict:
try:
start_listening(_wake_on_detect, config=cfg)
except Exception as e:
logger.warning("wake.start(%s): failed to start listener: %s", surface, e)
return _err(rid, 5026, str(e))
with _wake_lock:
_wake_active = True
logger.info("wake.start(%s): listening for %r (%s)", surface, reqs["phrase"], reqs["provider"])
return _ok(rid, {"started": True, "phrase": reqs["phrase"], "provider": reqs["provider"]})