Birdnet : écouter et reconnaitre les oiseaux du jardin

Découvrez quels oiseaux chantent dans votre jardin avec Birdnet et un raspberry PI et visualisez le résultat dans Home Assistant.
Birdnet : écouter et reconnaitre les oiseaux du jardin

Sommaire

Introduction

Un rougequeue, un merle, une mésange, un pinson… Combien d'espèces chantent réellement autour de votre maison ? La plupart d'entre nous seraient bien incapables de le dire.

BirdNET répond à cette question. Développé par l'université Cornell et l'institut Chemnitz, cet algorithme d'identification analyse en continu les sons captés par un micro et reconnaît les espèces à leur chant. Associé à Home Assistant, il transforme votre domotique en une mine d'or naturaliste : la dernière espèce détectée, sa photo, l'heure, l'indice de confiance, et le journal des espèces entendues depuis minuit.

Cet article décrit le montage complet : un Raspberry Pi équipé d'un micro posé au jardin, qui publie ses détections en MQTT, et une intégration dédiée installée via HACS côté Home Assistant.

Prérequis :

  • Un Raspberry Pi 4 (ou 5) avec une carte SD et une alimentation
  • Un micro USB, idéalement déporté par une rallonge
  • Un broker MQTT fonctionnel dans Home Assistant (add-on Mosquitto)
  • HACS installé pour la partie Home Assistant
Cet article est né d'un fil de discussion du forum HACF qui s'est enrichi pendant des mois grâce aux contributions de nombreux membres. Le résultat présenté ici est un travail collectif, dont vous retrouverez les auteurs en fin d'article.

Quelle version de BirdNET choisir ?

Trois types de BirdNET existent :

  • BirdNET-Pi est une distribution complète pour Raspberry Pi : analyse en temps réel, interface web, base de données des détections, spectrogrammes et extraits audio conservés. C'est la solution retenue dans cet article.
  • BirdNET-Go est une réécriture en Go, plus légère, capable d'utiliser un flux audio distant — comme l'audio d'une caméra. Elle existe sous forme d'add-on Home Assistant, ce qui évite complètement le Raspberry Pi dédié.
  • L'application mobile BirdNET sur les téléphones, très pratique en balade, mais qui ne remonte évidemment rien dans votre domotique.

Le choix dépend surtout de votre installation.
Si un micro ou une caméra se trouve déjà à portée de votre serveur Home Assistant, l'add-on BirdNET-Go est le chemin le plus court.
Si le jardin est loin de la baie technique, le Pi autonome dehors reste la solution la plus simple.

hassio-addons/birdnet-go at master · alexbelgium/hassio-addons
My homeassistant addons. Contribute to alexbelgium/hassio-addons development by creating an account on GitHub.
L'add-on BirdNET-Go peut être gourmand selon la machine qui héberge Home Assistant. Sur une installation modeste déjà chargée, un Raspberry Pi dédié soulagera le serveur principal.

Le matériel

Le Raspberry Pi 4 fait très bien l'affaire. Un modèle 3B+ fonctionne également, l'analyse étant simplement plus lente.

Pour le micro, inutile de viser du matériel professionnel. Un petit micro USB à moins de dix euros donne déjà de très bons résultats. Un micro-cravate relié à une carte son USB constitue l'autre option courante, avec l'avantage d'un câble de deux mètres qui permet d'éloigner la capsule.

Deux points font vraiment la différence sur la qualité des détections :

  • Déporter le micro du Pi avec une rallonge USB. Collée au boîtier, la capsule capte les parasites électroniques de la carte.
  • Protéger l'ensemble de la pluie sans enfermer le micro : un boîtier étanche dont seule la capsule dépasse, orientée vers le bas.
Une webcam ancienne peut servir de micro de dépannage, mais le gain est spectaculaire en passant à un vrai micro : les membres du forum rapportent jusqu'à vingt fois plus de détections après ce simple remplacement.

Étape 1 : installer BirdNET-Pi

Le dépôt maintenu par Nachtzuster est celui qui reçoit les mises à jour.

GitHub - Nachtzuster/BirdNET-Pi: A realtime acoustic bird classification system for the Raspberry Pi 5, 4B 3B+ 0W2 and more. Built on the TFLite version of BirdNET.
A realtime acoustic bird classification system for the Raspberry Pi 5, 4B 3B+ 0W2 and more. Built on the TFLite version of BirdNET. - Nachtzuster/BirdNET-Pi

Préparer le système

Installez Raspberry Pi OS avec Pi Imager, puis mettez la machine à jour :

sudo apt-get update
sudo apt-get upgrade

Vérifier la locale de l'OS

Cette étape évite bien des ennuis avec les noms d'oiseaux accentués, entre BirdNET et Home Assistant. Lancez sudo raspi-config, puis Localisation OptionsLocale, et choisissez une locale en UTF-8 (par exemple fr_FR.UTF-8) plutôt que la variante ISO-8859. Redémarrez ensuite.

Lancer l'installation

Dans le terminal du Raspberry pi, lancer l'installation :

curl -s https://raw.githubusercontent.com/Nachtzuster/BirdNET-Pi/main/newinstaller.sh | bash

L'installation est longue : comptez un bon moment, et redémarrez à la fin. L'interface web est alors disponible à l'adresse du Pi, sous la forme http://192.168.1.xx.
Avec xx l'ip attribuée par votre box.
Pensez à fixer cette adresse IP dans votre box.

Vous pouvez d'or et déjà accéder à BirdNET depuis l'adresse ip en tapant l'adresse dans votre navigateur.

Dans les réglages (Tools / Settings), renseignez votre latitude et votre longitude, BirdNET s'en sert, avec la semaine de l'année, pour pondérer les espèces plausibles à cet endroit et à cette saison. Le seuil de confiance par défaut de 0,7 constitue un bon compromis pour démarrer.

Le nom d'utilisateur n'est plus pi
Depuis 2022, Raspberry Pi OS demande de créer un utilisateur à l'installation. Les chemins de ce tutoriel utilisent /home/pi/, mais adaptez-les au nom que vous avez choisi. En cas de doute, la commande whoami vous le rappelle.

Étape 2 : publier les détections en MQTT

C'est ici que se joue la liaison avec Home Assistant. BirdNET-Pi embarque Apprise, une bibliothèque de notifications qui sait parler MQTT nativement : aucun script à écrire, aucun service à créer.

Dans l'interface web, ouvrez ToolsSettingsNotifications et activez-les.

Renseignez l'URL de votre broker au format Apprise :

mqtt://utilisateur:motdepasse@192.168.1.XXX:1883/birdnet/detection

Remplacez l'utilisateur, le mot de passe et l'adresse par ceux de votre broker Mosquitto. Le dernier segment est le topic, que vous retrouverez côté Home Assistant.

Dans le corps du message, collez ce modèle JSON :

{
"common_name": "$comname",
"scientific_name": "$sciname",
"confidence_score": "$confidence",
"link": "$listenurl",
"date": "$date",
"time": "$time",
"week": "$week",
"latitude": "$latitude",
"longitude": "$longitude",
"minimum_confidence": "$cutoff",
"sigmoid_sensitivity": "$sens",
"overlap": "$overlap",
"image": "$flickrimage"
}

Cochez enfin l'option qui déclenche une notification à chaque détection, et pas seulement pour les nouvelles espèces du jour.

Vous devriez avoir une configuration comme cela :

Le champ $flickrimage fournit l'URL de la photo de l'espèce, que la carte affichera. Selon les versions, l'image provient de Flickr — qui demande alors une clé d'API — ou directement de Wikimedia Commons, sans rien à configurer.

Vérifier que ça sort bien

Depuis une machine du réseau, écoutez le topic :

mosquitto_sub -h 192.168.1.XXX -u utilisateur -P motdepasse -t 'birdnet/#' -v

À la prochaine détection, le JSON doit s'afficher. Si rien ne vient, patientez : par temps calme, un oiseau peut se faire attendre.

Une seule méthode de publication à la fois
Les premières versions de ce tutoriel passaient par un script Python et le client paho-mqtt, avec un service systemd. Cette approche fonctionne toujours, mais elle est devenue inutile. Surtout, ne cumulez pas les deux! Apprise et un script maison qui publient sur le même topic produisent des doublons et des messages d'erreur difficiles à interpréter.

Étape 3 : l'intégration BirdNET dans Home Assistant

Il est tout à fait possible de traiter ces messages avec un capteur template à déclencheur et un empilement de cartes. C'était d'ailleurs la méthode du fil d'origine, et elle est décrite plus bas.

Mais une intégration dédiée existe désormais, développée par un membre de la communauté à partir de ce même fil. Elle s'installe par HACS, se configure entièrement dans l'interface, et embarque sa propre carte Lovelace.

GitHub - Pulpyyyy/ha-birdnet: Home Assistant integration and Lovelace card for BirdNET-Pi / BirdNET-Go over MQTT
Home Assistant integration and Lovelace card for BirdNET-Pi / BirdNET-Go over MQTT - Pulpyyyy/ha-birdnet

Installation

En mode automatique, le plus simple est de cliquer sur le bouton :

En alternative manuelle :

  1. ouvrez HACS → Intégrations → menu ⋮ → Dépôt personnalisé
  2. Collez l'URL du dépôt, catégorie Intégration
  3. Installez BirdNET, puis redémarrez Home Assistant
  4. ParamètresAppareils et servicesAjouter une intégrationBirdNET

Configuration

Quatre champs, tous modifiables ensuite par le bouton Configurer :

Champ Défaut Rôle
Topic MQTT birdnet/detection Le topic renseigné à l'étape précédente
Confiance minimale 70 % En dessous, la détection est écartée
Espèces ignorées Nom commun ou scientifique
URL BirdNET BirdNET-Go uniquement, à laisser vide pour BirdNET-Pi

L'intégration crée alors plusieurs entités, dont la principale porte tout le détail en attributs : photo, lien d'écoute, fiabilité, journal du jour. S'y ajoutent des compteurs de détections et d'espèces, une entité image et une entité event qui se déclenche une fois par détection retenue — parfaite pour les automatisations.

Le journal du jour est conservé sur disque et remis à zéro à minuit. Un redémarrage de Home Assistant ne l'efface plus, et il est exclu du recorder pour ne pas gonfler la base de données.

La carte Lovelace

Elle est livrée avec l'intégration et s'enregistre toute seule dans les ressources Lovelace. Rien à déclarer, elle apparaît directement dans le sélecteur de cartes et suit votre thème.

type: custom:birdnet-card
entity: sensor.birdnet_last_detection

La photo de l'espèce sert de fond, avec le nom commun, le nom latin, l'heure et la fiabilité en incrustation.
En dessous, le journal du jour affiche une ligne par espèce : heure, nom cliquable, nombre de détections et meilleure fiabilité.

Un bouton d'écoute apparaît en haut à droite lorsque l'extrait audio est disponible. Il rejoue les quelques secondes sur lesquelles BirdNET a fondé son identification — le vrai plaisir d'enfin pouvoir associer le sifflement entendu tout l'après-midi à un rougegorge ou à un autre oiseau.

L'extrait ne pointe pas directement vers le Raspberry Pi : Home Assistant sert de relais. Sans cela, l'audio serait injouable depuis l'extérieur ou en HTTPS, le navigateur refusant de charger un contenu en http:// sur une adresse privée.

Un éditeur visuel donne accès à toutes les options. Les principales :

type: custom:birdnet-card
entity: sensor.birdnet_last_detection
layout: hero# hero | compact | minimal
aspect_ratio: "16:9"
show_audio: true# bouton d'écoute
show_log: true# journal du jour
log_min_confidence: 70
max_rows: 10
emphasis: confidence# confidence | count
sort: auto# auto | time | count | confidence
tap_action: url # url | wikipedia | more-info | none

Trois mises en page sont disponibles : hero avec la grande photo, compact avec une vignette pour les tableaux de bord denses, et minimal réduite à une seule bande de 80 pixels.
La carte se mesure elle-même et s'adapte à la largeur de sa colonne : au-delà de 520 pixels, le journal passe sur deux colonnes.

Ci-dessous les cartes compactes et minimales :

Avec BirdNET-Go, les photos proviennent d'une source en 320 × 240.
Le cadrage 16:9 par défaut en rogne alors un quart de la hauteur : réglez aspect_ratio: "4:3" pour ne rien perdre.

Recevoir une notification pour une espèce précise

L'entité event fournit un déclencheur propre. Cet exemple prévient sur mobile, photo à l'appui, quand une chouette hulotte se manifeste :

triggers:
- trigger: state
entity_id: event.birdnet_detection
conditions:
- condition: template
value_template: "{{ trigger.to_state.attributes.common_name == 'Chouette hulotte' }}"
actions:
- action: notify.mobile_app
data:
title: "{{ trigger.to_state.attributes.common_name }}"
message: >-
{{ trigger.to_state.attributes.confidence }} % à
{{ trigger.to_state.attributes.time }}
data:
image: "{{ trigger.to_state.attributes.image }}"

La méthode YAML, sans intégration

Pour ceux qui préfèrent rester en configuration manuelle, voici l'approche d'origine du fil de discussion. Elle repose sur un capteur template à déclencheur, qui empile les détections dans un attribut.

template:
- trigger:
- platform: mqtt
topic: "birdnet/detection"
sensor:
- name: "BirdNET Events"
unique_id: birdnet_events
state: "{{ trigger.payload_json.common_name }}"
icon: mdi:bird
attributes:
scientific_name: "{{ trigger.payload_json.scientific_name }}"
confidence_score: "{{ trigger.payload_json.confidence_score }}"
link: "{{ trigger.payload_json.link }}"
time: "{{ trigger.payload_json.time }}"
image: "{{ trigger.payload_json.image }}"
bird_events: >
{% set current = state_attr('sensor.birdnet_events', 'bird_events') %}
{% set current_list = current if current is iterable and current is not string else [] %}
{% set new_event = {
"name": trigger.payload_json.common_name,
"confidence": (trigger.payload_json.confidence_score | float * 100) | round(0),
"time": trigger.payload_json.time[:5]
} %}
{{ ([new_event] + current_list)[:20] }}

L'affichage se construit ensuite avec une carte markdown, éventuellement combinée à stack-in-card et mushroom.

Les deux approches cohabitent sans conflit, MQTT fonctionnant en publication/abonnement. La carte de l'intégration sait d'ailleurs lire un capteur de ce type, et le nouveau capteur expose un attribut bird_events au même format. Vous pouvez donc tester avant de basculer — un fichier MIGRATION.md accompagne le dépôt.

En cas de souci

Rien ne remonte dans Home Assistant. Vérifiez d'abord que le message sort du Pi avec mosquitto_sub. S'il n'y a rien sur le topic, le problème est côté BirdNET ; s'il y a des messages mais aucune entité, il est côté Home Assistant.

Utilisez l'adresse IP, jamais le nom en .local. La résolution mDNS est capricieuse et provoque des erreurs de connexion difficiles à diagnostiquer.

Les détections sont filtrées. Le seuil de confiance s'applique deux fois : dans BirdNET puis dans l'intégration. Abaissez celui de l'intégration pour vérifier. BirdNET-Go publie d'ailleurs en dessous de son propre seuil, ce qui rend ce second filtre nécessaire.

Attention au volume de données. Une installation bien placée dépasse facilement le millier de détections quotidiennes, et les extraits audio remplissent vite une carte SD. Prévoyez de les basculer sur un NAS, ou de purger régulièrement.

Conclusion

Il y a toujours une petite excitation à consulter son tableau de bord et à découvrir qu'un grimpereau ou un pic vert fréquentent votre jardin depuis toujours, sans que vous l'ayez jamais remarqué. Au-delà de la prouesse technique de BirdNET, ce projet change réellement le regard qu'on porte sur son environnement immédiat — et l'oreille finit par reconnaître les chants sans l'aide de la machine.

De plus rien de mieux qu'associer les images et le son pour éveiller la curiosité des enfants et des plus grands sur le monde qui nous entoure.

Le dispositif reste modeste : un Raspberry Pi, un micro à dix euros et un peu de configuration. Le reste appartient aux oiseaux.

Merci à la communauté

Ce montage doit beaucoup aux échanges du forum : à Marsupilami pour la piste Apprise qui a rendu le script Python inutile, à bentou et R_hum1 pour le débogage patient et les retours terrain, à Jeffodilo pour l'exploration de l'add-on BirdNET-Go, et à Pulpy-Luke qui a transformé l'ensemble en une intégration propre, documentée et facile à installer. C'est exactement ce qui fait la valeur d'un forum vivant.

Une question ?

N'hésitez pas à venir poser vos questions sur le forum HACF.

Et vous, quelles espèces avez-vous découvertes autour de chez vous ? Partagez vos détections et vos montages dans les commentaires.