Beta 9.7.16 - March 10, 2026
New Features
Audio Fingerprinting for Content-Based Duplicate Detection
The existing duplicate detection relied purely on metadata (system, talkgroup, timestamp window). This release adds a full spectral fingerprinting engine that catches duplicates metadata alone can't handle.
How it works:
- Normalises audio to 11025 Hz mono via FFmpeg
dynaudnorm(removes volume/noise differences between recorders) - Divides audio into overlapping ~0.37s frames, computes FFT across 8 log-spaced frequency bands (200–3500 Hz)
- Encodes temporal spectral changes as bits packed into
[]int32fingerprints - Two recordings of the same transmission produce low Hamming distance; unrelated audio produces ~50% bit difference
Three detection layers:
- In-memory cache — atomic mutex-protected check catches simultaneous uploads before DB write (race condition fix). Uses both timestamp window and Hamming distance — P25 digital audio decoded by different receivers can look spectrally different, so the timestamp check handles that case unconditionally
- DB fingerprint query — 30-second window catches delayed/out-of-order uploads
- Emit suppression for patches — when FINDLAY and POST41 are patched, both calls are saved to DB (history preserved) but only the first is streamed to clients
Robustness improvements:
- Bidirectional sliding window (±5 positions ≈ ±4 seconds) handles one recorder starting a few seconds earlier/later
- Adaptive threshold relaxes matching for short clips (<5 integers = <2s audio) where noise has outsized impact
New admin options (all on by default): Audio Fingerprint Enabled, Fingerprint Threshold (default 0.25), Fingerprint Time Frame (default 30000ms)
Log messages: duplicate (fingerprint-cache), duplicate (fingerprint), patch duplicate suppressed at emit