github tphakala/birdnet-go nightly-20260511
Nightly Build nightly-20260511

50 minutes ago

BirdNET-Go now supports multiple AI models running simultaneously. A new Model Gallery lets you browse, install, and remove classifiers without restarting the server. This release adds Google Perch v2 and 11 BattyBirdNET regional bat classifiers as downloadable models with SHA256 integrity verification. When multiple models are active, a cross-model consensus engine merges their detections so independent agreement strengthens confidence. High sample rate audio capture (up to 384 kHz) on Linux enables bat detection with ultrasonic-capable USB microphones.

New Features

Model Gallery

A new model gallery in the Analysis settings page lets you install additional AI models alongside the default BirdNET v2.4 classifier. Models download from HuggingFace with SHA256 integrity verification (#2982, #2989, #2993, #2994).

Models available for download in this release:

  • Google Perch v2 - multi-taxa wildlife classifier (14,795 species). Species scope is currently limited to BirdNET v2.4 species; Perch scientific names are mapped to common names using BirdNET labels.
  • BattyBirdNET - 11 regional bat classifiers (Africa, Americas, East Asia, Europe Central, Europe North, Europe South, Middle East, South Asia, Southeast Asia, USA-East, USA-West), each sharing BirdNET v2.4 embeddings

Flexible Model-to-Source Assignment

You can assign one or multiple models to a single audio source, or dedicate separate audio sources to different models. For example, a standard microphone can run BirdNET and Perch simultaneously for bird detection, while a separate ultrasonic USB microphone runs BattyBirdNET for bat detection. Sample rate compatibility badges warn when a bat model is assigned to a source below the recommended 192 kHz capture rate (#2991).

Bat Detection Pipeline

Full support for ultrasonic bat detection using BattyBirdNET classifiers. Bat detection requires an ultrasonic-capable audio capture device (e.g., USB bat detector) with a sample rate of 192 kHz or higher recommended. The audio pipeline routes high sample rate audio directly to bat models while resampling the same source down to 48 kHz for BirdNET and 32 kHz for Perch, all running concurrently. A configurable bat confidence threshold filters low-confidence detections. Bat detections are stored with Chiroptera taxonomic class and correct model type for proper label resolution (#2971).

Cross-Model Detection Consensus

When multiple AI models identify the same species on the same audio source, their detections merge into a single pending entry with per-model contribution tracking (hit count, max confidence). The combined hit count across all models is used for false positive threshold checks, so cross-model agreement strengthens confidence. Per-model breakdowns are included in SSE broadcasts for the dashboard (#3007).

High Sample Rate Audio Capture (Linux Only)

Sound card configuration now includes a sample rate dropdown with device capability probing. The system queries each audio device for its supported rates at startup, caching results for the settings UI. Rates above 48 kHz automatically switch to ALSA exclusive mode (direct hardware access), bypassing dsnoop's silent software resampling. A stereo retry fallback handles USB devices that only support stereo on the hw: interface. Validated rates: 48, 96, 192, 256, and 384 kHz. Exclusive sound card mode is currently Linux-only; Windows and macOS support for high sample rates is planned for a future release (#2997, #3001).

Format-Aware Audio Export

Bird detections captured at high sample rates (96 kHz+) are automatically downsampled to 48 kHz before encoding, reducing file sizes 4-8x with no information loss since bird vocalizations top out around 12 kHz. Bat detections export at native rate to preserve ultrasonic content. When bat audio is configured for a format that caps at 48 kHz (MP3, Opus, AAC), the export silently falls back to WAV (#3014).

Per-Model Inference Time Tracking

The system overview card now shows stacked, color-coded sparklines for each active model's inference time. Each model displays its own timing, threshold status, and performance badge. Previously only BirdNET had inference visibility; Perch v2 and bat models now have full observability (#3012).

Consolidated Analysis Settings

All detection-related settings (confidence threshold, locale, false positive filter, range filter, dynamic threshold, processing threads, custom classifier) have moved from the main Settings page into the new Analysis page. The settings UI is still work in progress; feedback on layout and usability is welcome (#2985).

Security

  • SQL injection in backup temp path - the backup export handler now uses parameterized temp path construction instead of string interpolation, and generates unpredictable filenames (#2997).

Bug Fixes

Installer

  • Block root execution and detect cross-user installations - install.sh now refuses to run as root or with sudo, and detects existing installations under a different user (via systemd service, Docker mounts, and filesystem scan) before creating a duplicate (#2969, fixes #2952).

Audio & Streaming

  • Windows live audio and spectrogram streaming broken - FFmpeg was told to read from a Windows named pipe that nothing wrote to; fixed to read from stdin. Switched to MPEG-TS segments on Windows since FFmpeg cannot create fMP4 init segments from non-seekable stdin. Added init.mp4 in-memory cache on Linux/macOS as defense against segment rotation races (#2975, fixes #2973).

Dashboard & UI

  • Species settings crash before config loads - added null guards for species settings that prevented a TypeError when the page rendered before the config API response arrived (#2970).
  • Modal map crash when WebGL unavailable - the location settings modal map now checks DOM connection state before MapLibre initialization, with a cancellation flag to prevent instance leaks on rapid open/close (#2974).

Configuration

  • Home directory resolution fails under systemd - centralized all 6+ independent os.UserHomeDir()/os.Getenv("HOME") calls into a single GetUserHomeDir() helper with proper fallback chain (getpwuid_r -> os.UserHomeDir() -> $HOME env). When $HOME is unset in systemd services, this eliminates 8 separate Sentry errors from a single startup (#2972).

Database

  • Dual-write filter conversion dropped fields - GetBySpecies silently dropped Confidence, Verified, Locked, and Query filters. GetHourly hardcoded a 1-hour window ignoring the duration parameter. DeleteBatch could delete locked entries. Lock had a TOCTOU race. SaveReview had a TOCTOU race. All fixed with proper filter conversion, lock-check subqueries, and atomic upserts (#3009, #3010).

Performance

  • Metrics lock contention on inference hot path - replaced sync.RWMutex with atomic.Pointer for the global metrics singleton, eliminating lock acquisition on every StartSpan, Finish, and Predict call (#3015, fixes #583, #585).

Don't miss a new birdnet-go release

NewReleases is sending notifications on new releases.