| # BirdNET Audio Prediction Script | |
| This script loads a WAV file and uses the BirdNET ONNX model to predict bird species from audio recordings. It supports both single-window analysis (first 3 seconds) and moving window analysis (entire file) with species name mapping. | |
| ## Features | |
| - **Species Name Mapping**: Uses `BirdNET_GLOBAL_6K_V2.4_Labels.txt` to display actual bird species names instead of class indices | |
| - **Moving Window Analysis**: Analyzes entire audio files using overlapping 3-second windows | |
| - **Single Window Mode**: Quick analysis of just the first 3 seconds | |
| - **Configurable Parameters**: Adjustable confidence thresholds, overlap ratios, and result counts | |
| - **Detection Summary**: Comprehensive overview of all detections with timestamps and confidence scores | |
| ## Requirements | |
| - Python 3.7+ | |
| - The model expects audio input of exactly 3 seconds duration at 48kHz sample rate (144,000 samples) | |
| - BirdNET labels file: `BirdNET_GLOBAL_6K_V2.4_Labels.txt` | |
| ## Installation | |
| Install the required dependencies: | |
| ```bash | |
| pip install -r requirements.txt | |
| ``` | |
| Required packages: | |
| - `numpy>=1.21.0` | |
| - `librosa>=0.9.0` | |
| - `onnxruntime>=1.12.0` | |
| ## Usage | |
| ### Moving Window Analysis (Full File) | |
| Analyze the entire audio file with overlapping windows: | |
| ```bash | |
| python predict_audio.py audio.wav | |
| ``` | |
| ### Single Window Analysis (First 3 seconds only) | |
| Quick analysis of just the beginning: | |
| ```bash | |
| python predict_audio.py audio.wav --single-window | |
| ``` | |
| ### Advanced Usage Examples | |
| ```bash | |
| # High sensitivity analysis with more results | |
| python predict_audio.py audio.wav --confidence 0.1 --top-k 15 | |
| # Fine-grained analysis with 75% window overlap | |
| python predict_audio.py audio.wav --overlap 0.75 --confidence 0.3 | |
| # Custom model and labels files | |
| python predict_audio.py audio.wav --model custom_model.onnx --labels custom_labels.txt | |
| ``` | |
| ### Command Line Arguments | |
| - `audio_file`: Path to the WAV audio file (required) | |
| - `--model`: Path to the ONNX model file (default: `model.onnx`) | |
| - `--labels`: Path to the species labels file (default: `BirdNET_GLOBAL_6K_V2.4_Labels.txt`) | |
| - `--top-k`: Number of top predictions to show (default: 5) | |
| - `--overlap`: Window overlap ratio 0.0-1.0 (default: 0.5 = 50% overlap) | |
| - `--confidence`: Minimum confidence threshold for detections (default: 0.1) | |
| - `--batch-size`: Batch size for inference processing (default: 128) | |
| - `--single-window`: Analyze only first 3 seconds instead of full file | |
| ## Output Examples | |
| ### Single Window Output | |
| ``` | |
| Loading labels from: BirdNET_GLOBAL_6K_V2.4_Labels.txt | |
| Loaded 6522 species labels | |
| Loading ONNX model: model.onnx | |
| Loading first 3 seconds of audio file: bird_recording.wav | |
| Audio loaded successfully. Shape: (144000,) | |
| Running inference on single window... | |
| Top 5 predictions for first 3 seconds: | |
| 1. American Robin: 0.892456 | |
| 2. Song Sparrow: 0.234567 | |
| 3. House Finch: 0.123789 | |
| 4. Northern Cardinal: 0.089234 | |
| 5. Blue Jay: 0.056789 | |
| ``` | |
| ### Moving Window Output | |
| ``` | |
| Loading labels from: BirdNET_GLOBAL_6K_V2.4_Labels.txt | |
| Loaded 6522 species labels | |
| Loading ONNX model: model.onnx | |
| Loading full audio file: long_recording.wav | |
| Audio loaded successfully. Duration: 45.32 seconds | |
| Creating windows with 50% overlap... | |
| Created 28 windows of 3 seconds each | |
| Running inference on all windows... | |
| Processing window 1/28 (t=0.0s) | |
| Processing window 11/28 (t=15.0s) | |
| Processing window 21/28 (t=30.0s) | |
| Completed inference on 28 windows | |
| Analyzing detections with confidence threshold 0.1... | |
| === DETECTION SUMMARY === | |
| Audio duration: 45.32 seconds | |
| Windows analyzed: 28 | |
| Species detected (>0.10 confidence): 4 | |
| Top detections: | |
| American Robin | |
| Max confidence: 0.892456 | |
| Detections: 12 | |
| Time range: 0.0s - 18.0s | |
| 1.5s: 0.892456 | |
| 3.0s: 0.845231 | |
| 4.5s: 0.723456 | |
| Song Sparrow | |
| Max confidence: 0.567890 | |
| Detections: 6 | |
| Time range: 22.5s - 36.0s | |
| 24.0s: 0.567890 | |
| 25.5s: 0.445678 | |
| 27.0s: 0.334567 | |
| House Finch | |
| Max confidence: 0.345678 | |
| Detections: 3 | |
| Time range: 38.5s - 42.0s | |
| 39.0s: 0.345678 | |
| ``` | |
| ## Technical Details | |
| ### Model Input/Output | |
| - **Input**: Audio array of shape `[batch_size, 144000]` (3 seconds at 48kHz) | |
| - **Output**: Classification scores for 6522 bird species | |
| ### Audio Preprocessing | |
| The script automatically handles: | |
| - Loading audio files with librosa (supports WAV, MP3, FLAC, etc.) | |
| - Resampling to 48kHz if necessary | |
| - Padding with zeros or truncating to exactly 3 seconds (144,000 samples) | |
| - Converting to float32 format | |
| ### Moving Window Analysis | |
| - Creates overlapping 3-second windows from the full audio | |
| - Default 50% overlap means windows at 0s, 1.5s, 3s, 4.5s, etc. | |
| - Higher overlap (e.g., 75%) provides more fine-grained analysis but takes longer | |
| - Each window is analyzed independently, then results are aggregated | |
| ### Batch Processing | |
| - Windows are processed in configurable batches (default: 128 windows per batch) | |
| - Significantly improves performance by utilizing vectorized operations | |
| - Automatically handles memory management and progress reporting | |
| - Optimal batch size depends on available system memory and model complexity | |
| ### Species Labels | |
| - Uses the official BirdNET labels file with 6522 species | |
| - Format: `Scientific_name_Common Name` per line | |
| - Script extracts and displays the common names (part after underscore) | |
| ## Performance Tips | |
| - Use `--single-window` for quick identification of prominent species | |
| - Increase `--overlap` (0.75-0.9) for detailed analysis of complex recordings | |
| - Lower `--confidence` (0.05-0.1) to catch weaker signals | |
| - Higher `--confidence` (0.3-0.5) for only very confident detections | |
| - Use `--top-k 1` to see only the most confident detection per analysis | |
| - **Batch Processing**: Default `--batch-size 128` provides optimal performance | |
| - Increase batch size (256, 512) if you have more GPU/RAM memory | |
| - Decrease batch size (32, 64) if you encounter memory issues | |
| - Batch processing significantly improves performance on longer audio files | |