jarvis-cloud / modules /clap.py
Jarvis2345's picture
Squash history — remove all prior commits (secret hygiene, S4)
a31f556
Raw
History Blame
1.59 kB
"""
modules/clap.py — clap / loud-sound trigger detector
Listens for a double-clap pattern to toggle FRIDAY on/off.
"""
import threading
import time
try:
import numpy as np
import sounddevice as sd
AUDIO_OK = True
except ImportError:
AUDIO_OK = False
CLAP_THRESHOLD = 0.55 # RMS amplitude level
CLAP_WINDOW = 0.8 # seconds between two claps to count as double-clap
COOLDOWN = 2.0 # seconds to ignore after trigger
def watch_clap(callback, running_flag: list):
"""
Run in a daemon thread. Calls callback() on double-clap detection.
running_flag is a mutable [True] list; set [False] to stop.
"""
if not AUDIO_OK:
return
last_clap = 0.0
last_trigger = 0.0
def _audio_cb(indata, frames, time_info, status):
nonlocal last_clap, last_trigger
now = time.time()
# cooldown guard
if now - last_trigger < COOLDOWN:
return
rms = float(np.sqrt(np.mean(indata ** 2)))
if rms > CLAP_THRESHOLD:
if now - last_clap < CLAP_WINDOW:
# double clap!
last_trigger = now
threading.Thread(target=callback, daemon=True).start()
last_clap = 0.0 # reset
else:
last_clap = now
try:
with sd.InputStream(channels=1, samplerate=22050,
blocksize=1024, callback=_audio_cb):
while running_flag[0]:
time.sleep(0.1)
except Exception:
pass