Passive Acoustic Monitoring for Bird Species Detection
PAM Analyzer is a desktop application designed for processing Autonomous Recording Unit (ARU) field recordings to detect bird species. It covers the full workflow: importing SD card contents, running BirdNET species detection, reviewing and annotating detections, and exporting results. Data is organized into hierarchical projects and campaigns.
Pre-built binaries are available for the following platforms:
- macOS (Apple Silicon): PAM-Analyzer-macos-arm64.zip
- Windows (x86_64): PAM-Analyzer-windows-x86_64.zip
- Linux (x86_64): PAM-Analyzer-linux-x86_64.tar.gz
- Linux (arm64): PAM-Analyzer-linux-arm64.tar.gz
Note: On any supported OS you can also easily run PAM Analyzer from source using uv run pam-analyzer
- Project & campaign management: Organizes monitoring deployments into projects (
.pamproj) and campaigns, each supporting independent species filters (via geographic coordinates or custom species lists). - SD card import: Automatically detects ARU SD cards matching a configured volume name pattern and imports audio into a structured
campaign/ARU/weekdirectory layout with built-in deduplication and conflict resolution. - BirdNET analysis: Integrates BirdNET for per-campaign or batch processing across all campaigns, with configurable confidence threshold and segment overlap. Generates per-ARU and summary CSV outputs.
- Detection review: Provides a tabular interface for detections with multi-column sorting, filtering, inline annotation (verification status, species correction, comments), and integrated audio playback.
- Data export: Supports exporting filtered detections to CSV format and extracting annotated audio snippets with metadata embedded in filenames.
The largest organisational unit. A project represents a study or monitoring programme, e.g. "Bird survey of Lake Constance wetlands 2026". It holds project-wide configuration (audio recordings root path, ARU SD card volume name pattern, preferred species name language) and groups all campaigns belonging to that study. A project maps to one .pamproj file on disk.
Note: Species filter settings (lat/lon location or species list) are campaign-scoped, not project-scoped.
A campaign is a time-bounded field deployment during which a set of ARUs were active. The campaign name is chosen by the researcher and typically encodes start date, end date, and study area, e.g. Campaign-20260114-20260216-Federsee. On the file system each campaign lives in its own subdirectory under the audio recordings root and carries a campaign.toml sidecar that stores its species filter configuration. Because the sidecar travels with the audio, campaigns are self-contained and can be moved, archived, or shared independently of the project file. Campaigns are discovered automatically from the audio root. Individual ARUs within a campaign may be deployed at distinct locations within the study area.
species_filter_mode = "location" # "location" or "list"
latitude = 47.94
longitude = 9.32
species_list_path = "" # relative path to .txt, empty when using location modeThe combination of campaign + ARU device ID uniquely identifies a recording set within a project while the same physical ARU redeployed at a different time usually belongs to a different campaign.
An individual recording device, identified by its SD card volume name (e.g. MSD-109). Within a campaign folder, each ARU gets its own subfolder. Recordings are further organised into weekly subfolders (week_08) derived from the file timestamps.
After setting up a project and importing ARU SD cards, the resulting directory structure looks like this:
{audio_recordings_root_path}/
└── {campaign}/
├── campaign.toml
└── {aru}/
Example:
~/Studies/2026-SW-Germany-PAM-Project/
├── Campaign-20260114-20260216-Federsee/
│ ├── campaign.toml
│ ├── MSD-109/
│ │ ├── week_02/
│ │ ├── week_03/
│ │ ├── week_04/
│ │ ├── week_05/
│ │ └── week_06/
│ └── MSD-110/
│ ├── week_02/
│ ├── week_03/
│ ├── week_04/
│ ├── week_05/
│ ├── week_06/
│ └── week_07/
└── Campaign-20260317-20260328-Lake-Constance/
├── campaign.toml
├── MSD-109/
│ ├── week_11/
│ └── week_12/
└── MSD-110/
├── week_11/
└── week_12/
Download and execute the binary for your platform from the Download section. No installation is required.
Upon first launch, use New Project to initialize a project and configure the audio root and output paths. Use File -> Save Project (or ⌘S / Ctrl+S) to persist this configuration as a .pamproj file. Then create at least one campaign in the Campaigns panel, import audio from SD cards in the Import panel, run analysis in the BirdNET panel, and review detections in the Examine panel.
The application is organized into five panels that map to the steps of a typical PAM analysis workflow.
Configure a study. Set the audio recordings root directory, the SD card volume name pattern (regex), the detections output path, and the preferred species language for labels. Settings persist automatically to the .pamproj file.
Create and manage the campaigns that belong to a project. The panel shows all discovered campaigns in a scrollable list; clicking a campaign opens its settings in an inline form on the right. From here you can:
- Create a new campaign using the
+button. Each campaign must be configured with a species filter:- Location mode: specify a lat/lon on a map or enter coordinates manually; BirdNET derives the species list from this location.
- Species list mode: provide a
.txtspecies list file, which is copied into the campaign folder alongside the audio.
- Rename a campaign by editing its name in the form and saving.
- Edit species filter settings at any time.
- Delete a campaign via the trash icon on its list card, with an inline confirmation step.
Campaigns are discovered automatically from the audio recordings root: any subdirectory containing a campaign.toml sidecar is treated as a campaign.
Import audio from SD cards into a campaign. Select the target campaign, then start monitoring for SD card volumes matching the configured name pattern. When a matching card is inserted, files are copied into the campaign/ARU/week directory structure with deduplication and conflict resolution.
Run bird species detection using BirdNET-Analyzer. Configurable parameters include minimum confidence threshold, segment overlap, and additional language columns for species names. Each 3-second detection is assigned a within-segment Rank (1 = highest-confidence species in that window), useful for deprioritising detections that are consistently outcompeted by other species in the same clip. Analyses can be run per-campaign or across all campaigns, producing per-campaign detection CSVs (grouped by ARU and week), per-ARU and all-ARUs summary CSVs, and project-level rollups when running all campaigns at once.
Review and annotate results. Detection CSVs are loaded into a grid with multi-column sorting and filtering, inline annotation editing (Verified, Corrected_Species, Comment), and audio playback per detection. Annotations are written back to the source CSVs automatically. Filtered results can be exported to a new CSV, and audio snippets for selected detections can be extracted with configurable padding.
When exporting audio snippets, annotation values are reflected in the output filenames:
- Verified: appends
_confirmed,_incorrect, or_uncertaindepending on the value. - Corrected_Species: replaces the original species name in the filename with the corrected one (scientific name looked up from the project language) and appends
_corrected.
Both suffixes can appear together, e.g. …_corrected_confirmed.wav.
| Windows/Linux | macOS | Action | Description |
|---|---|---|---|
| Ctrl+N | ⌘N | New Project | Create a new empty in-memory project |
| Ctrl+O | ⌘O | Open Project... | Open an existing .pamproj file |
| Ctrl+S | ⌘S | Save Project | Save to the current file, or prompt if unsaved |
| Ctrl+Shift+S | ⇧⌘S | Save Project As... | Save to a new location |
| Ctrl+W | ⌘W | Close Project | Close the current project and return to the welcome screen |
| Ctrl+Q | ⌘Q | Quit | Exit the application |
The changelog can be found at the CHANGELOG page.
This project is licensed under the AGPL-3.0 license. See the LICENSE file for the full text.
