From a1d2f98765de5e0d852adb13dbc1d8f189a458e6 Mon Sep 17 00:00:00 2001 From: Nick Mowen Date: Sun, 16 Jul 2023 16:54:23 -0600 Subject: [PATCH] Add audio filters config --- frigate/config.py | 18 +++++++++++++++++- frigate/const.py | 1 + frigate/events/audio.py | 6 ++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/frigate/config.py b/frigate/config.py index bca0ba080..59e086989 100644 --- a/frigate/config.py +++ b/frigate/config.py @@ -11,7 +11,13 @@ import numpy as np from pydantic import BaseModel, Extra, Field, parse_obj_as, validator from pydantic.fields import PrivateAttr -from frigate.const import CACHE_DIR, DEFAULT_DB_PATH, REGEX_CAMERA_NAME, YAML_EXT +from frigate.const import ( + AUDIO_MIN_CONFIDENCE, + CACHE_DIR, + DEFAULT_DB_PATH, + REGEX_CAMERA_NAME, + YAML_EXT, +) from frigate.detectors import DetectorConfig, ModelConfig from frigate.detectors.detector_config import BaseDetectorConfig from frigate.ffmpeg_presets import ( @@ -334,6 +340,15 @@ class FilterConfig(FrigateBaseModel): ) +class AudioFilterConfig(FrigateBaseModel): + threshold: float = Field( + default=0.8, + ge=AUDIO_MIN_CONFIDENCE, + lt=1.0, + title="Minimum detection confidence threshold for audio to be counted.", + ) + + class RuntimeFilterConfig(FilterConfig): mask: Optional[np.ndarray] raw_mask: Optional[Union[str, List[str]]] @@ -424,6 +439,7 @@ class AudioConfig(FrigateBaseModel): listen: List[str] = Field( default=DEFAULT_LISTEN_AUDIO, title="Audio to listen for." ) + filters: Optional[Dict[str, AudioFilterConfig]] = Field(title="Audio filters.") enabled_in_config: Optional[bool] = Field( title="Keep track of original state of audio detection." ) diff --git a/frigate/const.py b/frigate/const.py index b6b0e44bd..4dec7f366 100644 --- a/frigate/const.py +++ b/frigate/const.py @@ -28,6 +28,7 @@ AUDIO_DURATION = 0.975 AUDIO_FORMAT = "s16le" AUDIO_MAX_BIT_RANGE = 32768.0 AUDIO_SAMPLE_RATE = 16000 +AUDIO_MIN_CONFIDENCE = 0.5 # Regex Consts diff --git a/frigate/events/audio.py b/frigate/events/audio.py index 446920c89..abd491ad7 100644 --- a/frigate/events/audio.py +++ b/frigate/events/audio.py @@ -19,6 +19,7 @@ from frigate.const import ( AUDIO_DURATION, AUDIO_FORMAT, AUDIO_MAX_BIT_RANGE, + AUDIO_MIN_CONFIDENCE, AUDIO_SAMPLE_RATE, CACHE_DIR, FRIGATE_LOCALHOST, @@ -130,7 +131,7 @@ class AudioTfl: return detections - def detect(self, tensor_input, threshold=0.8): + def detect(self, tensor_input, threshold=AUDIO_MIN_CONFIDENCE): detections = [] if self.stop_event.is_set(): @@ -200,7 +201,8 @@ class AudioEventMaintainer(threading.Thread): if label not in self.config.audio.listen: continue - self.handle_detection(label, score) + if score > self.config.audio.filters.get(label, {}).get("threshold", 0): + self.handle_detection(label, score) self.expire_detections()