Instructions to use stratus-labs/nocturne-v1-teacher with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use stratus-labs/nocturne-v1-teacher with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("audio-classification", model="stratus-labs/nocturne-v1-teacher")# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("stratus-labs/nocturne-v1-teacher", device_map="auto") - Notebooks
- Google Colab
- Kaggle
Nocturne v1.1 (Teacher) β Bioacoustic Species Recognition for Non-Bird Taxa
Nocturne is a bioacoustic species classifier trained by Stratus Labs covering the taxa that BirdNET and Perch don't: insects, amphibians, non-bird mammals, and reptiles. It's the "night side" of the soundscape β the taxa that are dominantly nocturnal or crepuscular, whose acoustic signal is the half of biodiversity monitoring bird-focused models leave behind.
v1.1 (this revision) uses a 3Γ higher learning rate than v1 during backbone fine-tuning. Independent runs at both LRs plateaued around macro-F1 0.10; v1.1 edged past by ~3 %. Prior v1 weights are preserved in the commit history if you want to pin to revision=<v1-commit-sha>.
Try it live (no install)
Live public endpoint hosted on Stratus Labs infra (Apple M4 Max, MPS-backed):
- UI: https://nocturne.runstratus.com/ β drag-and-drop upload
- API:
curl -X POST "https://nocturne.runstratus.com/predict?top_k=5&threshold=0.15" \
-F "file=@your_clip.wav"
Rate-limited to 10 requests per minute per IP. Uploads capped at 25 MB / 5 minutes per request.
Model at a glance
| Backbone | Audio Spectrogram Transformer (AST), initialized from MIT/ast-finetuned-audioset-10-10-0.4593 |
| Head | Linear over 2182 species (multi-label BCE) |
| Input | 10-second mono waveform @ 16 kHz -> 128-band log-mel |
| Params | ~86M |
| Precision | bf16 for training and inference |
| Trained on | 1x NVIDIA GB10 (DGX Spark), unified 128 GB memory |
| License (weights) | CC-BY-4.0 |
| License (code) | Apache-2.0 |
See stratus-labs/nocturne-v1-mini for a distilled 7M-parameter EfficientNet-B1 student for CPU / edge deployment.
Evaluation
Real numbers, run on the held-out splits. Earlier drafts of this card cited macro-F1 at threshold 0.5 (too high β kills recall). These are the corrected numbers at threshold 0.3 (default) and with per-class thresholds calibrated on val:
| split | metric | threshold 0.3 (default) | calibrated per-class |
|---|---|---|---|
| val (13,391 samples) | macro-F1 | 0.139 | 0.184 |
| micro-F1 | 0.525 | 0.485 | |
| mAP (macro) | 0.152 | 0.152 | |
| test (13,710 samples) | macro-F1 | 0.137 | 0.149 |
| micro-F1 | 0.508 | 0.433 | |
| mAP (macro) | 0.150 | 0.150 |
Per-class thresholds are shipped as thresholds.json in this repo. Use them for best F1; use sigmoid > 0.3 (or 0.15 for higher recall) as a simple default. mAP is threshold-independent and the honest number for downstream ranking-quality use cases (top-k, similarity search).
Class coverage: 2,182 species in vocab; 732 have positives in the val split (long-tail β many rare species have zero test-set representation). Median calibrated threshold: 0.30. Range: 0.02β0.94.
Full report at eval_report.json in this repo. Reproduce with:
python -m soundscape.calibrate_and_eval \
--config soundscape/configs/ast_nonbird.yaml \
--checkpoint model.safetensors --arch ast \
--out-dir report/
vs BirdNET on non-bird taxa (release headline)
Head-to-head on 300 randomly-sampled non-bird test clips (insects, amphibians, mammals, reptiles). Top-1 species identification:
| model | non-bird top-1 accuracy |
|---|---|
| BirdNET (v2.4, bird-focused) | 6.7% |
| Nocturne v1.1 teacher | 76.7% |
That's an 11.5Γ lift. BirdNET catches ~7% because a handful of amphibians and mammals slip into its vocab, but for the non-avian half of the soundscape it's the wrong tool and Nocturne is the fit-for-purpose one. This is the point of the release.
Taxonomic coverage (unchanged from v1)
| Taxonomic class | Species in vocab | Source |
|---|---|---|
| Insecta | 745 (iNat) + 459 (InsectSet459) | iNat 2024 non-bird subset + InsectSet459 |
| Amphibia | 650 | iNat 2024 |
| Mammalia | 296 | iNat 2024 |
| Reptilia | 32 | iNat 2024 |
| Total (merged) | 2182 | β |
Intended use
- Passive acoustic monitoring for biodiversity surveys, especially where BirdNET/Perch leave gaps.
- Agricultural pest early warning (Orthoptera + Cicadidae are heavily represented via InsectSet459).
- Amphibian presence surveys.
- Ecological research and citizen-science integration.
Out of scope
- Absence detection β a negative prediction means "no confident detection," not "the species is absent."
- Bird identification β use BirdNET / Perch. Nocturne can separate bird from non-bird signal but is not tuned for species-level bird ID.
- Bat echolocation β most is > 8 kHz relative to our 16 kHz sample rate. Use a dedicated ultrasonic pipeline.
- Legal or conservation determinations without human review.
Training data
| Dataset | Files | Species | License | Role |
|---|---|---|---|---|
| InsectSet459 (Zenodo 18554693) | 26,298 | 459 | CC-BY-4.0 | Insect head fine-tune |
| iNat Sounds 2024 non-bird | 25,983 | 1,723 | MIT | Multi-taxon head |
| iNat Sounds 2024 birds | 111,029 | 3,846 | MIT | Backbone exposure only, not in output vocab |
Total training exposure: ~42k annotated non-bird clips across 2182 species.
Training recipe (v1.1)
- Backbone: AudioSet-pretrained AST (86M params). 3-epoch head warm-up with backbone frozen; then joint fine-tune.
- Optimizer: AdamW β backbone 1.5e-4, head 3.0e-3 (3Γ v1), cosine schedule, weight decay 0.01, grad clip 1.0.
- Loss: focal BCE (Ξ³=2.0) for long-tail multi-label imbalance.
- Augmentation: SpecAugment (2Γ32 freq masks, 2Γ40 time masks), MixUp (Ξ±=0.3).
- Sampler: β-frequency class-balanced.
- Precision: bf16 mixed precision + gradient checkpointing.
- Batch: 32.
- 40 epochs total, best-of-N by val macro-F1 tracked.
Inference (Python)
import torch, soundfile as sf, torchaudio.functional as AF
from safetensors.torch import load_file
import json
from huggingface_hub import snapshot_download
local = snapshot_download("stratus-labs/nocturne-v1-teacher")
state = load_file(f"{local}/model.safetensors")
vocab = json.loads(open(f"{local}/vocab.json").read_text())
# Then reconstruct the ASTClassifier from soundscape/model.py and load_state_dict(state, strict=False)
Or just hit the public endpoint (curl example above).
Limitations and ethical considerations
- Coverage bias. Over-represents temperate-zone Orthoptera and Cicadidae (via InsectSet459) and geographies over-represented on iNaturalist. Under-represented: tropical arthropods, deep-forest amphibians, most reptiles.
- Recording bias. iNat recordings are opportunistic. Do not interpret model confidence as population density.
- Absence != silence. Many target species have narrow calling windows (breeding season, temperature, time of day). A survey without detections is not a survey without species.
- Dual-use. Species localization from acoustic recordings can be misused (e.g. locating rare taxa for illegal collection). Consider redacting precise GPS in public datasets built with this model.
- Data licensing. Downstream users must comply with InsectSet459 (CC-BY-4.0) and iNat 2024 (MIT). Redistribution of raw training clips is not permitted; this model is a derived work.
Citation
@misc{stratuslabs2026nocturne,
title = {Nocturne: Bioacoustic Species Recognition for Non-Bird Taxa},
author = {Stratus Labs},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/stratus-labs/nocturne-v1-teacher}}
}
Please also cite the training datasets:
- InsectSet459 (Zenodo 10.5281/zenodo.18554693)
- iNat Sounds 2024 (Chasmai et al., NeurIPS 2024)
- Downloads last month
- 45