- Pi-C.A.R.D est un assistant vocal IA qui s’exécute entièrement en local sur Raspberry Pi, un projet visant à faire tourner des fonctions de LLM conversationnel sur du matériel Raspberry Pi
- Il propose deux modes d’interaction : un
main.py basé sur un wake word et un main_button.py basé sur un bouton GPIO ; une fois la conversation lancée, il n’est pas nécessaire de répéter le wake word
- L’historique de conversation peut être ajusté dans
config.py, et réduire la taille de la mémoire permet d’obtenir des réponses plus rapides
- Pour rester rapide et léger, le projet utilise des implémentations C++ comme whisper.cpp et llama.cpp, et s’appuie sur
tool-bert2, un BERT fine-tuné, pour décider quand accéder à des informations externes
- Les fonctionnalités basées sur la caméra sont configurées à plusieurs endroits du README, mais un avertissement indique qu’elles ont été temporairement retirées en raison des changements de prise en charge des modèles de vision dans llama.cpp
Ce que fait Pi-C.A.R.D
- Pi-C.A.R.D est un assistant basé sur l’IA qui tourne sur Raspberry Pi et vise à exécuter localement ce que des LLM standard comme ChatGPT font dans un contexte conversationnel
- Son nom signifie Raspberry Pi - Camera Audio Recognition Device
- Le projet est toujours en cours de développement et indique accueillir des issues et des pull requests
- Il précise espérer que la prise en charge récemment ajoutée de Docker facilitera la configuration et les modifications
- Aucune vidéo de présentation n’est encore disponible, mais elle est prévue ultérieurement
Fonctionnement
-
Mode wake word
- En lançant
main.py, le système écoute un wake word et démarre la conversation
- Les wake words par défaut sont
"raspberry", "barry", "razbear"
- Une fois la conversation commencée, il n’est pas nécessaire de répéter le wake word à chaque fois
- Dire
"stop", "exit", "goodbye" ou équivalent met fin à la conversation
- Le wake word et les comportements associés peuvent être modifiés dans
config.py
-
Mode bouton
- Avec une breadboard, des câbles et un bouton, il est possible de démarrer une conversation via un bouton GPIO
- Le fonctionnement consiste à appuyer sur le bouton puis à énoncer une commande, et le README le présente comme une interaction plus fluide
- La configuration du bouton suit les instructions de
main_button.py
- Dans la version bouton, il est possible de lancer une conversation avec le bouton ou d’interrompre l’assistant à tout moment
-
Mémoire de conversation
- Le chatbot dispose d’une mémoire de conversation configurable
- Elle permet de faire référence à des échanges précédents ou d’approfondir un sujet déjà abordé
- Pour des réponses plus rapides, il est possible de réduire la valeur de mémoire dans
config.py
Objectif du fonctionnement local et limites
- Le but du projet est de vérifier à quel point il est possible de créer efficacement un assistant vocal entièrement hors ligne sur un matériel relativement abordable comme le Raspberry Pi
- Comme tous les traitements sont effectués en local, il n’est ni aussi puissant ni aussi rapide qu’un système cloud
- Le README estime que de grands progrès ont été réalisés sur les petits modèles de LLM au cours de l’année écoulée et que ce projet peut lui aussi continuer à s’améliorer
- La raison de ne pas en avoir fait une application est que la partie la plus difficile semblait être l’exécution rapide d’un assistant vocal totalement hors ligne sur Raspberry Pi
- Il explique que si cette approche fonctionne, un système similaire pourrait tourner plus rapidement sur un matériel plus puissant
Exécution et configuration
- Après avoir téléchargé le dépôt et terminé les prérequis et la configuration, l’exécution se fait avec la commande suivante
python main.py
- La version bouton se lance avec la commande suivante
python main_button.py
- L’exécution via Docker est présentée comme la méthode recommandée et utilise les commandes suivantes
sudo docker-compose build
sudo docker-compose up
- La prise en charge de Docker a été ajoutée récemment et peut ne pas être totalement fonctionnelle
- Le mode Docker ne fonctionne que pour la version wake word, et la méthode pour transmettre l’accès GPIO au conteneur n’est pas encore clairement établie
Logiciels et outils utilisés
- Pour construire un système rapide et léger, le projet utilise autant que possible des implémentations C++
- La transcription audio utilise whisper.cpp, à configurer en suivant son guide de démarrage rapide
- Le README indique que les fonctions de vision utilisent llama.cpp, mais l’avertissement en haut précise que les fonctions caméra ont été temporairement retirées parce que llama.cpp ne prend plus activement en charge les modèles de vision
- Quelques fonctions d’accès à des outils sont proposées afin que l’assistant se comporte davantage comme un véritable assistant
- La décision d’utiliser un outil passe par tool-bert
tool-bert2 est un BERT fine-tuné qui détermine quand accéder à des informations externes
- La méthode de création de ce modèle est décrite dans le dépôt tool-bert
- Pour activer l’accès aux outils, il faut vérifier dans
.env.example les clés et secrets nécessaires
État des fonctions caméra et vision
- Le corps du README explique qu’en connectant une caméra au Raspberry Pi, il est possible de prendre des photos, de décrire ce qui est visible et de poser des questions sur l’image
- La configuration de la vision consiste à remplacer
vision_model par vlm dans config.py
- Le modèle mentionné est Qwen2-VL-2B-Instruct
- Comme la taille des tokens d’image en entrée est dynamique, réduire la taille des photos prises peut raccourcir le temps d’inférence
- Mais selon l’avertissement placé en haut du projet, la fonction caméra est actuellement temporairement retirée
Matériel nécessaire
- La configuration matérielle de base comprend un Raspberry Pi 5 Model B, un micro USB et un haut-parleur
- Le micro USB et le haut-parleur se branchent sur les ports USB du Raspberry Pi
- La caméra se connecte au port caméra du Raspberry Pi
- Les composants utilisés dans le README sont les suivants
- Le Raspberry Pi 5 utilise un nouveau port caméra, ce qui nécessite un nouveau connecteur pour caméra
- Le connecteur caméra est optionnel, mais doit être acheté pour utiliser les fonctions caméra
- Pour la configuration du bouton GPIO, le README indique que le début de ce tutoriel a été utile
- Le projet se concentre sur un fonctionnement optimisé pour Raspberry Pi 5, mais explique qu’il pourrait aussi fonctionner sur d’autres appareils
Feuille de route et état d’avancement
- Parmi les éléments marqués comme terminés figurent les fonctions de conversation de base, les fonctions caméra, les benchmarks du temps de réponse, les tests d’overclocking et l’exploration de moyens pour réduire le temps de whisper
- La possibilité d’interrompre l’assistant et de poser une nouvelle question, l’utilisation d’un modèle personnalisé ajusté et l’amélioration du modèle de fonctions de services externes
tool-bert sont également indiquées comme terminées
- Les tests avec alimentation portable ainsi que la conteneurisation avec Docker pour tester davantage d’appareils sont aussi marqués comme terminés
- Parmi les éléments restants figurent un meilleur tutoriel et une vidéo, une génération de modèles optionnelle avec entropix, des tests dans d’autres langues et l’ajout de davantage de services externes
- Le tableau Notion de suivi d’avancement n’est pas encore finalisé, mais ce lien est fourni
1 commentaires
Avis de Hacker News
L’objectif était de créer un assistant vocal entièrement hors ligne, ne nécessitant aucune connexion Internet, afin de protéger la vie privée de l’utilisateur et d’éviter que les données partent vers des serveurs tiers
Belle initiative, merci
Je me demande si ça ne tourne que sur Pi5, ou aussi sur d’autres cartes que le Raspberry Pi
Plus sérieusement, le nom a attiré mon attention, et en lisant la présentation je me suis dit : « une Alexa qui n’upload pas tout ce que je dis chez Amazon, ça pourrait m’être utile »
Si le mot d’activation par défaut est “hey assistant”, je recommande “Computer” :) bien sûr, la voix devrait ressembler à https://en.wikipedia.org/wiki/Majel_Barrett
Ce qu’il me faut, c’est un assistant vocal capable de tourner sur un RPi 4, intégré à HomeAssistant, uniquement hors ligne, et qui n’envoie mes données nulle part
Comparé à tout ce que j’ai vu jusqu’ici, ce projet semble cocher presque toutes les cases, donc ça a l’air bien fait
Au passage, si quelqu’un a une recommandation de micro compatible RPi et utilisable pour un cas d’usage type Alexa, ça m’intéresse
Faire tourner un grand modèle de langage de manière pratique sur un 4B est difficile, mais il n’est pas forcément nécessaire que ce soit basé sur un grand modèle de langage
Dans la communauté Rhasspy, un schéma courant consiste à faire une détection locale, bon marché et légère du mot d’activation sur des appareils satellites équipés d’un micro (un 4B devrait largement suffire pour ça), puis à streamer l’enregistrement réel vers un hub central sur le réseau local pour de meilleurs résultats
On en trouve sur eBay pour environ 15 à 20 dollars
NabuCasa a embauché le principal développeur de Rhasspy pour travailler dessus, et ça s’améliore à chaque mise à jour
« Pourquoi Pi-card ? Raspberry Pi - Camera Audio Recognition Device » : on dirait qu’ils ont raté l’occasion de faire LCARS
Ils auraient pu l’appeler LLM Camera Audio Recognition Service et, évidemment, le faire réagir au mot-clé “computer”. Si ça tourne aussi ailleurs que sur un Pi, ça pourrait devenir LCARS
Ça se lit à 100 % comme Picard, et c’est plus reconnaissable que LCARS
J’ai hâte d’essayer ça
À ma connaissance, il manque encore cruellement d’assistants vocaux ouverts, stables, flexibles et centrés sur la vie privée, donc j’espère que ce projet prendra de l’ampleur
Il y a environ un an, ma famille voulait vraiment faire entrer Alexa à la maison, mais comme je ne voulais pas d’un dispositif de surveillance de Bezos chez moi, je les ai convaincus d’essayer d’en fabriquer un nous-mêmes. J’avais choisi Mycroft sur un Pi 4, mais ça n’a pas bien marché : la détection du mot d’activation était irrégulière, les intégrations manquaient, et à ce moment-là le projet semblait pratiquement abandonné. J’ai essayé de contribuer au projet et aux intégrations qui me bloquaient, mais la vie m’a rattrapé et je n’y suis jamais revenu ; heureusement, ma famille a aussi oublié Alexa
Je ne sais plus si c’était un nano ou un pico, mais en tout cas la carte faisait à peu près la taille d’un SO-DIMM. Il n’y avait pas de mot d’activation : on appuyait sur le bouton allumé en blanc, il changeait deux fois de couleur — une fois pour confirmer l’appui, puis une autre pour indiquer qu’il écoutait. Quand on avait fini de parler, il changeait encore de couleur et donnait sa réponse
Le backend utilisait quelque chose de chez Google, et c’était vraiment pénible à configurer et à maintenir en marche, mais ça fonctionnait. J’en avais deux, et j’attendais quelque chose qui me permette d’auto-héberger un équivalent
Je prévois de travailler davantage dessus. Il y a quelques courtes démos de fonctionnement sur YouTube qui permettent de se faire une idée de la qualité actuelle : https://www.youtube.com/watch?v=OryGVbh5JZE
Je me demande si on peut faire tourner ça sur une machine Linux classique
Ou si quelqu’un connaît un projet similaire qui le permette
J’avais cherché par le passé, mais ce domaine est compliqué et les contraintes sont subtiles
Globalement, Pi-C.A.R.D semble utiliser Python et C++, donc je ne pense pas qu’il y ait beaucoup de problèmes à le faire tourner n’importe où où l’on peut exécuter et compiler du Python et du C++
Il y a environ trois ans, j’avais essayé de construire quelque chose comme ça sur une RPI 4 de première génération, mais je m’étais heurté aux limites du matériel et à celles de mes connaissances
Voir que ça fonctionne vraiment maintenant, c’est génial
Ce serait chouette d’avoir un raspi hat sur lequel on pourrait brancher un GPU, mais je ne sais pas trop si ce serait pratique ni même faisable
Les cartes graphiques d’aujourd’hui sont les déchets électroniques de demain ; elles pourraient donc trouver une seconde vie en renforçant ce genre de projets DIY sur raspi
Si l’on ajoute un GPU, un adaptateur et une alimentation pour exploiter des cœurs CUDA bon marché, on risque d’obtenir quelque chose de moins bon, en consommation, en prix et en encombrement, que de meilleures solutions SoC ou x86 NUC
Je ne sais pas quelle magie se cache dans le PCIe, mais au moins une carte du commerce, l’Atomic Pi, avait une interface PCIe « exposée »
Dans tous les cas, le GPU était sur un petit PCB, relié par un câble USB3 au plus petit PCB placé dans le slot PCIe de la carte mère. L’idée, c’est que quel que soit ce qu’est PCIe, on peut le faire passer par un câble USB3 jusqu’au GPU pour qu’il travaille
Je vois un haut-parleur dans la liste du matériel ; je me demande s’il répond aussi à l’oral
Pour l’instant, j’utilise https://espeak.sourceforge.net/, donc ce n’est pas très agréable à écouter
En plus, je streame les réponses du grand modèle de langage, donc il ne faut pas attendre longtemps avant d’avoir une réponse. Comme c’est traité par morceaux, il arrive qu’une partie d’un mot soit brièvement prononcée. Bien sûr, le temps d’attente dépend aussi du modèle utilisé et de la taille du contexte
Pourquoi Picard doit-il toujours préciser jusqu’à sa préférence de température pour le thé Earl Grey ?
Une IA aussi intelligente n’aurait-elle pas déjà dû apprendre ses goûts ?
Dans la série, beaucoup de personnages donnent des instructions plus souples au réplicateur. « Tea, Earl Grey, Hot » ressemble à une habitude de Picard, peut-être héritée d’appareils à nourriture et boissons plus primitifs que le réplicateur de l’Enterprise-D
Les procès existent-ils encore dans un monde post-pénurie ? Probablement
La plupart des gens de Starfleet n’ont pas l’air de savoir bien utiliser un réplicateur. Ils ont un appareil aussi intelligent, mais s’en servent comme d’un électroménager ordinaire dont ils n’ont jamais lu le manuel, ratent 90 % des fonctionnalités, puis se plaignent que la nourriture répliquée a mauvais goût
https://i.redd.it/hluqexh3oqc91.jpg
Je me demande comment fonctionne le mot d’activation
Est-ce que ça écoute en continu, puis ignore tout s’il n’y a pas le mot ou la phrase d’activation dans les dernières secondes ?
Plus précisément, il stocke plusieurs morceaux d’audio et jette le plus ancien : autrement dit, une fenêtre glissante (rolling window)