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
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{"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éfaut | Signification |
|---|---|---|
labels | obligatoire | Noms 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_field | audio_url | Champ de l'item contenant l'URL de l'audio |
min_freq | 0 | Fréquence la plus basse affichée, en Hz |
max_freq | fréquence de Nyquist | Fréquence la plus haute affichée, en Hz |
fft_size | 1024 | Longueur 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 |
colormap | viridis | viridis, magma ou grayscale |
height | 280 | Hauteur du spectrogramme en pixels |
min_boxes | 0 | Nombre de rectangles requis pour que l'item compte comme terminé |
max_boxes | aucune | Nombre maximal de rectangles autorisés sur un item |
label_requirement | aucune | required: 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
| Action | Souris ou toucher | Clavier (focus dans le widget) |
|---|---|---|
| Tracer un rectangle | Faire glisser sur une zone vide du spectrogramme | N ajoute un rectangle à la position de lecture |
| Choisir l'étiquette des nouveaux rectangles | Cliquer sur un bouton d'étiquette | 1 à 9 |
| Réétiqueter un rectangle | Le sélectionner, puis cliquer sur un bouton d'étiquette, ou utiliser son menu dans la liste | Le sélectionner, puis 1 à 9 |
| Déplacer un rectangle | Le faire glisser | Touches fléchées |
| Redimensionner un rectangle | Faire glisser son coin supérieur gauche ou inférieur droit | Shift et les touches fléchées |
| Supprimer un rectangle | Delete dans la liste | Delete ou Backspace |
| Lire ou mettre en pause | Bouton de lecture | Space |
| Lire un seul rectangle | Play dans la liste | P |
| Zoomer dans le temps | Boutons + 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
[{"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
| Format | Sortie |
|---|---|
raven | Une 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_labels | Un 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éraux | La liste JSON comme valeur du schéma |
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
python potato/flask_server.py start examples/audio/bioacoustics-boxes/config.yaml -p 8000Pour aller plus loin
- Bioacoustique - Importer les sorties de Raven, Audacity et BirdNET et exporter les rectangles corrigés
- Annotation audio - Segments temporels sur une forme d'onde
- Pièges photographiques - Le versant image du suivi de la faune
Pour les détails d'implémentation, consultez la documentation source.