Skip to content

Annotation de spectrogrammes : rectangles temps-fréquence sur l'audio

Tracez des rectangles temps-fréquence étiquetés sur un spectrogramme dans Potato pour les cris d'oiseaux, de chauves-souris, de grenouilles et de mammifères marins, avec export Raven et Audacity.

Nouveau dans la v2.12.0

Un schéma spectrogram_annotation affiche un spectrogramme de l'audio de l'item. Les annotateurs y tracent des rectangles temps-fréquence et attribuent à chacun une étiquette de la liste du schéma, comme des espèces ou des types de cris. Il est conçu pour la bioacoustique : cris d'oiseaux, de chauves-souris, de grenouilles et de mammifères marins, où un cri se décrit par son début, sa fin et sa plage de fréquences.

L'annotation audio ne marque des segments que dans le temps. Utilisez spectrogram_annotation quand la plage de fréquences de chaque événement compte, ou quand vous importez des rectangles depuis Raven, Audacity ou BirdNET-Analyzer (Bioacoustique).

Le spectrogramme est calculé dans le navigateur : la page décode l'audio avec Web Audio et applique une transformée de Fourier à court terme avec une colonne par pixel du tracé. Aucune bibliothèque tierce n'est chargée, et le serveur n'a besoin d'aucun outil audio.

Configuration

yaml
item_properties:
  id_key: id
  text_key: recording
 
annotation_schemes:
  - annotation_type: spectrogram_annotation
    name: calls
    description: Draw a box around every call and label it
    source_field: audio_url
    labels:
      - name: Turdus migratorius
        color: "#2563eb"
      - name: Cardinalis cardinalis
        color: "#dc2626"
      - unknown
    max_freq: 12000
json
{"id": "site3_0612", "recording": "site3_0612.wav", "audio_url": "/media/site3_0612.wav"}

source_field désigne le champ de l'item qui contient l'URL de l'audio, et les fichiers du dossier media/ du projet sont servis à /media/<name>. Tout format que le navigateur sait décoder fonctionne (WAV, FLAC, MP3, Ogg, M4A). Pour un fichier WAV, la page lit la fréquence d'échantillonnage dans l'en-tête du fichier ; l'axe des fréquences s'arrête donc à la fréquence de Nyquist propre à l'enregistrement. Pour les autres formats, indiquez la fréquence dans un champ de l'item nommé sample_rate, faute de quoi la fréquence propre du navigateur est utilisée.

CléValeur par défautSignification
labelsobligatoireNoms d'étiquettes, ou objets {name, color, key_value}. Les étiquettes 1 à 9 reçoivent les touches 1 à 9, sauf si key_value définit une autre touche
source_fieldaudio_urlChamp de l'item contenant l'URL de l'audio
min_freq0Fréquence la plus basse affichée, en Hz
max_freqfréquence de NyquistFréquence la plus haute affichée, en Hz
fft_size1024Longueur de la fenêtre de la FFT en échantillons : 256, 512, 1024, 2048 ou 4096. Des fenêtres plus longues donnent une résolution plus fine en fréquence et plus grossière en temps
colormapviridisviridis, magma ou grayscale
height280Hauteur du spectrogramme en pixels
min_boxes0Nombre de rectangles requis pour que l'item compte comme terminé
max_boxesaucuneNombre maximal de rectangles autorisés sur un item
label_requirementaucunerequired: true fait compter le schéma comme sans réponse tant que l'annotateur ne l'a pas enregistré une fois. Enregistrer sans aucun rectangle compte comme une réponse ; utilisez donc min_boxes pour exiger des rectangles

Commandes

ActionSouris ou toucherClavier (focus dans le widget)
Tracer un rectangleFaire glisser sur une zone vide du spectrogrammeN ajoute un rectangle à la position de lecture
Choisir l'étiquette des nouveaux rectanglesCliquer sur un bouton d'étiquette1 à 9
Réétiqueter un rectangleLe sélectionner, puis cliquer sur un bouton d'étiquette, ou utiliser son menu dans la listeLe sélectionner, puis 1 à 9
Déplacer un rectangleLe faire glisserTouches fléchées
Redimensionner un rectangleFaire glisser son coin supérieur gauche ou inférieur droitShift et les touches fléchées
Supprimer un rectangleDelete dans la listeDelete ou Backspace
Lire ou mettre en pauseBouton de lectureSpace
Lire un seul rectanglePlay dans la listeP
Zoomer dans le tempsBoutons + et -, jusqu'à 16×

La liste sous le spectrogramme montre chaque rectangle avec ses temps et ses fréquences, un menu d'étiquette, et des boutons Play et Delete. Un rectangle importé depuis un détecteur est tracé avec une bordure en tirets et sa confiance à côté de l'étiquette, jusqu'à ce que quelqu'un le modifie.

Réponse stockée

json
[{"start_s": 0.5, "end_s": 1.1, "low_hz": 2900.0, "high_hz": 3100.0, "label": "whistle"},
 {"start_s": 3.0, "end_s": 3.8, "low_hz": 5900.0, "high_hz": 6600.0, "label": "trill",
  "source": "import", "import_format": "raven", "edited": true}]

Les temps sont en secondes depuis le début du fichier, et les fréquences en Hz. low_hz et high_hz valent null pour un rectangle qui couvre toutes les fréquences, ce qui est la façon dont s'importent une étiquette Audacity sans sélection spectrale ou une ligne de CSV BirdNET. Les rectangles tracés par l'annotateur reçoivent "source": "human". Les rectangles importés conservent source, ai_model, confidence et import_format, et reçoivent "edited": true dès qu'ils sont déplacés, redimensionnés ou réétiquetés.

Les pré-annotations utilisent la même liste, sous le nom du schéma dans le champ pre_annotation. Un rectangle prérempli compte comme la réponse de l'annotateur : s'il clique sur Next sans toucher à un clip, les rectangles sont enregistrés comme sa réponse revue, sans indicateur edited ; une étude de revue peut donc les compter comme acceptés sans changement.

Export

FormatSortie
ravenUne table de sélection Raven par enregistrement, avec l'étiquette dans une colonne Annotation (--option label_column=Species la renomme) et Confidence quand un rectangle en possède une
audacity_labelsUn fichier d'étiquettes Audacity par enregistrement, avec une ligne spectrale sous chaque rectangle doté d'une plage de fréquences
jsonl, csv et les autres formats générauxLa liste JSON comme valeur du schéma
bash
python -m potato.export -c config.yaml -f raven -o export/
python -m potato.export -c config.yaml -f audacity_labels -o export/

Un rectangle sans plage de fréquences est écrit dans Raven de 0 Hz à la fréquence de Nyquist, tirée du sample_rate de l'item, de l'en-tête d'un fichier WAV ou de max_freq. Sans aucune de ces valeurs, High Freq (Hz) reste vide et l'export émet un avertissement.

Le fichier entier est décodé dans le navigateur, et le spectrogramme compte au plus 4096 colonnes ; un long enregistrement est donc tracé grossièrement dans le temps. Découpez les enregistrements en clips de quelques minutes au plus.

Exemple

bash
python potato/flask_server.py start examples/audio/bioacoustics-boxes/config.yaml -p 8000

Pour aller plus loin

Pour les détails d'implémentation, consultez la documentation source.