From f37f034b6ad5168923700e386dfe47a6ce0eb3c4 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Sat, 8 Jul 2023 06:16:24 -0600 Subject: [PATCH] Only run audio detection when audio is above noise threshold (#7078) * Only run audio detection when audio is above noise threshold * Formatting * Fix event parsing * Update frigate/events/audio.py Co-authored-by: Blake Blackshear --------- Co-authored-by: Blake Blackshear --- docs/docs/configuration/index.md | 6 ++++++ frigate/config.py | 3 +++ frigate/events/audio.py | 18 +++++++++++------- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/docs/docs/configuration/index.md b/docs/docs/configuration/index.md index bdfb55d38..271b8a4e5 100644 --- a/docs/docs/configuration/index.md +++ b/docs/docs/configuration/index.md @@ -145,6 +145,12 @@ audio: enabled: False # Optional: Configure the amount of seconds without detected audio to end the event (default: shown below) max_not_heard: 30 + # Optional: Configure the min rms volume required to run audio detection (default: shown below) + # As a rule of thumb: + # - 200 - high sensitivity + # - 500 - medium sensitivity + # - 1000 - low sensitivity + min_volume: 500 # Optional: Types of audio to listen for (default: shown below) listen: - bark diff --git a/frigate/config.py b/frigate/config.py index 499b51497..11ef1b9ee 100644 --- a/frigate/config.py +++ b/frigate/config.py @@ -413,6 +413,9 @@ class AudioConfig(FrigateBaseModel): max_not_heard: int = Field( default=30, title="Seconds of not hearing the type of audio to end the event." ) + min_volume: int = Field( + default=500, title="Min volume required to run audio detection." + ) listen: List[str] = Field( default=DEFAULT_LISTEN_AUDIO, title="Audio to listen for." ) diff --git a/frigate/events/audio.py b/frigate/events/audio.py index de0f07e0c..decd17ca4 100644 --- a/frigate/events/audio.py +++ b/frigate/events/audio.py @@ -169,14 +169,18 @@ class AudioEventMaintainer(threading.Thread): if not self.feature_metrics[self.config.name]["audio_enabled"].value: return - waveform = (audio / AUDIO_MAX_BIT_RANGE).astype(np.float32) - model_detections = self.detector.detect(waveform) + rms = np.sqrt(np.mean(np.absolute(np.square(audio.astype(np.float32))))) - for label, score, _ in model_detections: - if label not in self.config.audio.listen: - continue + # only run audio detection when volume is above min_volume + if rms >= self.config.audio.min_volume: + waveform = (audio / AUDIO_MAX_BIT_RANGE).astype(np.float32) + model_detections = self.detector.detect(waveform) - self.handle_detection(label, score) + for label, score, _ in model_detections: + if label not in self.config.audio.listen: + continue + + self.handle_detection(label, score) self.expire_detections() @@ -192,7 +196,7 @@ class AudioEventMaintainer(threading.Thread): ) if resp.status_code == 200: - event_id = resp.json()[0]["event_id"] + event_id = resp.json()["event_id"] self.detections[label] = { "id": event_id, "label": label,