Skip to main content

Xeno-Canto bioacoustic corpus downloader for deep learning research

Project description

xc-dl banner

xc-dl

A high-performance, async command-line tool for downloading and curating bioacoustic datasets from Xeno-canto for deep learning research.

xc-dl handles metadata fetching, concurrent audio downloads, format conversion (via ffmpeg), integrity verification, and HPC-scale distributed workflows -- all with resume support and progress tracking.

Installation

pip install xc-dl

Or with uv:

uv add xc-dl

Requirements

Quick Start

# Set your API key
export XC_API_KEY="your-key-here"

# Preview a query (shows species, quality, duration stats)
xc-dl search 'grp:birds cnt:"South Africa" q:">C"' --full

# Download all matching recordings
xc-dl download 'grp:birds cnt:"South Africa" q:">C"'

# Download and convert to 16kHz mono WAV
xc-dl download 'grp:birds cnt:"South Africa" q:">C"' --convert wav

# Download a 10% random sample (deterministic)
xc-dl download 'grp:birds cnt:"South Africa"' --portion 10

# Cap total download size
xc-dl download 'grp:birds' --max-storage 500GB

# Verify dataset integrity
xc-dl check --all --report status.json

# Re-download corrupted or missing files
xc-dl check --all --fix

Configuration

xc-dl reads configuration from a YAML file (default: ./xc-dl.yaml), environment variables, and CLI flags. CLI flags take highest precedence.

Config File

general:
  api_key: "your-key"
  data_dir: "./xc-dataset"
  concurrency: 8
  metadata_concurrency: 4
  rate_limit: 5.0
  log_level: "INFO"
  log_file: "./download.log"

download:
  convert: "wav"
  convert_sample_rate: 16000
  convert_channels: 1
  convert_bit_depth: 16
  max_retries: 3

queries:
  south_africa_birds:
    query: 'grp:birds cnt:"South Africa" q:">C"'
    description: "South African birds, quality > C"

Environment Variables

Variable Description
XC_API_KEY Xeno-canto API key (overrides config file)

CLI Options Reference

Option Default Description
--config, -c ./xc-dl.yaml Path to config file
--data-dir, -d ./xc-dataset Root output directory
--api-key XC API key
--log-level INFO Logging verbosity (DEBUG/INFO/WARNING/ERROR)
--log-file JSON-lines log file path
--concurrency, -j 8 Max download parallelism
--metadata-concurrency 4 Max API fetch parallelism
--rate-limit 5.0 Max API requests/sec
--verbose, -v off Show log output on console
--dry-run off Show plan without executing
--version, -V Show version

Subcommands

search

Preview a query without downloading. Shows species counts, quality distribution, recording types, estimated duration, and disk usage.

xc-dl search 'gen:Tyto sp:alba' --full
xc-dl search 'grp:birds cnt:Brazil' --format json
xc-dl search 'en:"Common Ostrich"' --save-query ostrich
Option Description
--full Fetch all pages for exact statistics
--format Output format: table (default), json, csv
--save-query NAME Save query as a named preset

download

The main pipeline: fetch metadata, download audio, optionally convert. Supports resume -- interrupted downloads can be continued by re-running the same command.

# Basic download
xc-dl download 'grp:birds cnt:"South Africa"'

# Metadata only (no audio download)
xc-dl download 'grp:birds cnt:"South Africa"' --metadata-only

# With conversion to 16kHz mono WAV
xc-dl download 'grp:birds' --convert wav --convert-sample-rate 16000

# From a saved preset
xc-dl download --from-config south_africa_birds

# Random 10% sample (deterministic based on query hash)
xc-dl download 'grp:birds' --portion 10

# Stop after 500GB downloaded
xc-dl download 'grp:birds' --max-storage 500GB
Option Default Description
--metadata-only off Fetch metadata only
--per-page 500 Records per API page
--convert Convert format: wav, flac, ogg
--convert-sample-rate 16000 Target sample rate (Hz)
--convert-channels 1 Target channels (1=mono)
--convert-bit-depth 16 Bit depth (16 or 32)
--skip-existing/--no-skip-existing on Skip already-verified files
--retry-failed/--no-retry-failed on Retry previously failed files
--max-retries 3 Max download retry attempts
--portion Download a random portion (0-100%)
--max-storage Stop after this much data (e.g. 500GB, 1TiB)
--from-config NAME Use a named query preset
--from-file-list PATH Download from HPC file list
--generate-file-lists off Create per-node file lists
--num-nodes 1 Number of HPC nodes

Pipeline Architecture

Downloads, conversions, and verification run concurrently through an asyncio.Queue-based pipeline:

Metadata Fetch ──> Download Queue ──> Convert Queue
                   (N workers)        (N/2 workers)
  • Downloads start as metadata becomes available
  • Conversions begin as soon as each file finishes downloading
  • Ctrl+C triggers graceful shutdown: in-progress items complete, state is saved
  • Re-running the same command resumes from where it stopped

Dataset Config

Each download writes a download-config.yaml to the dataset directory recording the query, parameters, and xc-dl version (never the API key). This makes datasets reproducible.

check

Verify integrity of an existing dataset via SHA-256 checksums and optional deep audio decoding.

xc-dl check --all
xc-dl check --all --deep         # Full decode (slower, catches bitstream corruption)
xc-dl check --all --fix           # Re-download corrupted/missing files
xc-dl check --all --report status.json
Option Description
--all Check all recordings
--query Check only recordings matching query
--deep Full audio decode to detect corruption
--fix Re-download files that fail verification
--report PATH Write JSON report to file

Dataset Structure

xc-dataset/
  catalog.jsonl                                     # Central catalog (one JSON per line)
  download-config.yaml                              # Query and parameters used
  dataset_manifest_south-africa-birds_v1.txt        # Selector file (view over catalog)
  metadata/
    Strigidae/Tyto/Tyto_alba/
      XC00694038_Tyto_alba.json                     # Sidecar metadata (raw API + xc-dl state)
  original_recordings/
    Strigidae/Tyto/Tyto_alba/
      XC00694038_Tyto_alba.mp3                      # Original audio
  resampled_16khz/
    Strigidae/Tyto/Tyto_alba/
      XC00694038_Tyto_alba.wav                      # Converted audio
  .progress/
    metadata-fetch.json                             # Resume state for metadata
    download-state.json                             # Resume state for downloads

Files are organized by Family/Genus/Genus_species/ and named with zero-padded XC IDs (XC00694038).

HPC / Distributed Workflows

For large-scale downloads across multiple nodes (e.g. on a Slurm cluster):

# 1. Fetch metadata on the login node
xc-dl download 'grp:birds' --metadata-only

# 2. Generate per-node file lists
xc-dl download --generate-file-lists --num-nodes 16

# 3. Submit array job (each node downloads its portion)
# In your Slurm script:
xc-dl download --from-file-list file-lists/node-${SLURM_ARRAY_TASK_ID}.txt

File lists are written to xc-dataset/file-lists/:

  • full-list.txt -- all recording IDs
  • node-0.txt through node-N.txt -- per-node chunks

Planned Features

The following features are planned but not yet implemented:

Sonogram Download Support

--include-sonograms and --sonogram-size flags will download sonogram images to a sonogram_<size>/ parallel directory tree.

update-taxonomy Subcommand

Auto-download IOC World Bird List CSV to refresh the genus-to-family mapping cache. Perhaps we could also auto update this based on metadata we pull from Xeno-canto, when a new species with genus/family is discovered update the update the taxonomy.

CSV Output for Search

--format csv option for machine-readable search output.

Interactive Fuzzy Search TUI

xc-dl search --interactive using prompt_toolkit for live query building with auto-complete and preview counts.

Dataset or query visualisation

pip install xc-dl[viz] downloads the visualisation packages (eg. datashaders) that allows the plotting of a map from where all the recordings in a dataset comes from. With perhaps someother figures like, nested pie chart for class composition or a dentogram for call type visualisation.

Disclaimer

  • Code authored by Claude Opus 4.6, fully reviewed by a human
  • Banner generated using Gemini Imagen 3
  • This project is not officially associated with Xeno-canto
  • The authors are not responsible for misuse of this project
  • Users must respect the licenses under which original data contributors provided their recordings
  • For large downloads, please inform the Xeno-canto team and respect their rate limits
  • Special thanks to the Xeno-canto project for hosting the data and to all contributors who further bioacoustic research

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xc_dl-0.1.1.tar.gz (2.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xc_dl-0.1.1-py3-none-any.whl (71.4 kB view details)

Uploaded Python 3

File details

Details for the file xc_dl-0.1.1.tar.gz.

File metadata

  • Download URL: xc_dl-0.1.1.tar.gz
  • Upload date:
  • Size: 2.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for xc_dl-0.1.1.tar.gz
Algorithm Hash digest
SHA256 b9b56bb8c61928e33dfb9eb2013e759b82e95fc252c211c06a6fd859c656e6a9
MD5 cd373d06f943a4a0701ebe030a5d4ca7
BLAKE2b-256 40abd1af1efa0fd86c04592f4c40d1de89dc3d3afeebf214dcb78bba6cfe4d86

See more details on using hashes here.

File details

Details for the file xc_dl-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: xc_dl-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 71.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for xc_dl-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ccd6e9fdd0e6f9ba089f7009fbeff96570935250c7b1d3850bc5f3f3ccb0d206
MD5 4874b120e94e0ddc3dbec56199c7f4af
BLAKE2b-256 9015ad9ae792ceba3fa8fc275696d8702dc03959d826a0b11b1f4c1de3dd8fa8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page