Oui, le titre est un peu abscons, je vous laisse découvrir...
Ma femme me dit "tu ronfles!", mais moi je dors, donc je ne peux pas savoir. D'où mon problème : comment savoir si je ronfle et à quels moments de la nuit ?
Je me suis dit que mon ami Arduino pouvait m'aider à trouver une réponse et je me suis lancé dans un projet de : DÉTECTEUR DE RONFLEMENT.
La première idée qui vient est d'analyser le son produit par un ronflement, de trouver des patterns fréquentiels caractéristiques. Une fois identifiés, il suffit de les détecter en phase opérationnelle et de lever une alarme.
D'où mon projet précédent d’analyseur de son. Sauf que... c'est pas si simple. Sur les suggestions d'Al1fch, j'ai installé Audacity et appris à m'en servir pour enregistrer les bruits nocturnes. Un tracé de spectrogramme (le spectre sonore en fonction du temps) montre qu'il est possible en effet de trouver des fréquences caractéristiques de phases de ronflement. Pour moi, elles sont autour de 5 à 8 kHz :
Vous voyez les petites traces bleues - violettes en haut du diagramme, vers 6:21:18 ou 6:21:24 ? C'est ça, un ronflement... Pas très fort, certes, mais suffisamment pour déranger Madame...
J'ai commencé par écrire un code pour chercher ces patterns et envoyer une information de détection sur Thingspeak, mais le résultat n'était pas à la hauteur des attentes : fausses alarmes, mauvaises détections. Bref plus aléatoire que convaincant... De plus, rien ne prouve que mes patterns seront les mêmes pour un autre ronfleur.
Alors je me suis dit : passons à autre chose. Le buzz-word du moment : l'intelligence artificielle ! C'est exactement l'outil idéal pour ce genre de besoin. Un programme apprend à reconnaître un pattern, en fait mieux que ça : une famille de patterns similaires. Une fois l'apprentissage fait, un second programme, bien plus simple, cherche les choses apprises parmi les données qu'il reçoit.
Bingo !
Petit tour d'horizon de l'IA : le principal framework (outil, in french) de développement de logiciels d'IA est basé sur la bibliothèque TensorFlow, avec la couche simplificatrice Keras par dessus. On trouve des centaines de tutos sur Internet pour en savoir plus et apprendre à s'en servir. De plus, je suis amené à l'utiliser au boulot, donc ça baigne.
Mais sur Arduino (et ses amis) : le constat est rapide. RIEN (ou presque). Quelques développements rapides sur ESP32 Cam pour une reconnaissance de visage, mais c'est à peu près tout.
Pour l'analyseur de son je n'avais pas trouvé de bibliothèque FFT qui me plaisait, j'ai donc décidé d'en porter une, écrite en C, que j'ai trouvée sur Internet. Et bien, autant faire la même chose pour l'IA !
J'ai donc cherché des bibliothèques d'IA en C, avec pas ou peu de dépendance, et si possible pas trop lourdes. En voici quelques unes :
- KANN
- TinY-ANN
- Multi-Layer Perceptron Library
Il y en a certainement d'autres. Je ne les ai pas toutes testées bien sûr. Finalement, j'ai opté pour TINN
Tinn (Tiny Neural Network) is a 200 line dependency free neural network library written in C99.
Je l'ai choisie car elle est légère, sans dépendance, le code est simple à comprendre, donc à adapter et le portage a été rapide. Juste une ou deux fonctions à adapter (générateur de nombres aléatoires - ça c'est vrai pour toutes les bibli, lecture et écriture de fichiers).
Comme j'étais déjà sur ESP32 pour l'analyseur de sons, et qu'une partie de ce code serait utilisée, autant rester sur ce SoC pour le reste. De plus, l'ESP32 dispose d'un espace fichiers (SPIFFS) et de pas mal de mémoire, dont les logiciels d'IA sont assez gourmands. Je pense que le porter sur un Arduino aurait été peu efficace.