4 points par GN⁺ 2024-05-14 | 1 commentaires | Partager sur WhatsApp
  • 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

 
GN⁺ 2024-05-14
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

    • J’aimerais qu’Apple/Google intègrent une technologie permettant de prouver et vérifier que la caméra/le micro de l’appareil ne peuvent capturer que lorsque le voyant est allumé, et qu’aucune app ni couche supérieure du système d’exploitation ne puisse le contourner
    • La fonctionnalité numéro un que je veux dans n’importe quel « assistant », c’est le fonctionnement hors ligne
      Je me demande si ça ne tourne que sur Pi5, ou aussi sur d’autres cartes que le Raspberry Pi
    • Le nom est bon, et l’utilisation du vieux mème Picard facepalm est encore mieux
      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

    • Vous devriez jeter un œil à Rhasspy
      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
    • https://www.robotshop.com/products/respeaker-usb-microphone-...
    • Les caméras Playstation 3/4 ont aussi des micros, et les résultats étaient corrects
      On en trouve sur eBay pour environ 15 à 20 dollars
    • Je me demande si vous avez regardé la fonctionnalité Voice Assistant intégrée à HA : https://www.home-assistant.io/voice_control/
      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

    • Pi-C.A.R.D est parfait
      Ça se lit à 100 % comme Picard, et c’est plus reconnaissable que LCARS
    • C’est pour ça qu’on ne peut pas avoir de beaux trucs LCARS : https://en.wikipedia.org/wiki/LCARS#Legal
    • Ou alors LLM Offline Camera, User Trained Understanding Speech, pour faire LOCUTUS
    • Il faudrait un nom du genre Beneficial Audio Realtime Recognition Electronic Transformer
  • 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

    • Certains produits maker vendus chez Target contenaient une boîte en carton, un bouton arcade RGB-LED sur le dessus, un haut-parleur, et quatre micros sur un “hat” pour RPi
      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
    • Lire ceci m’a vraiment encouragé, et j’espère que ça sera utile
      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

    • Un Raspberry Pi ressemble beaucoup à une machine Linux classique ; la principale différence est qu’il utilise ARM plutôt qu’un CPU Intel/AMD, ce qui réduit un peu le périmètre de support
      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

    • En dehors de l’écosystème autour d’une plateforme unique, la plupart des atouts différenciants du Raspberry Pi tiennent au format et à la consommation électrique
      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
    • Pour le minage de cryptomonnaies, on utilisait souvent un emplacement PCIe transformé en quatre emplacements PCIe x1, voire des cartes avec directement 12 emplacements PCIe x1 ou plus
      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

    • Oui
      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 ?

    • C’est complètement hors sujet, mais en réalité il n’a probablement pas besoin de le faire
      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
    • Peut-être qu’il faut être précis pour écraser une valeur par défaut très tiède, choisie prudemment pour éviter les procès plutôt que par préférence
      Les procès existent-ils encore dans un monde post-pénurie ? Probablement
    • C’est peut-être simplement la force de l’habitude
      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
    • Au contraire, il n’est pas assez précis
      https://i.redd.it/hluqexh3oqc91.jpg
    • Une fois, quand il a seulement dit « Tea, Earl Grey », l’ordinateur a compris « Tea, Earl Grey, luke warm »
  • 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 ?

    • C’est globalement l’idée
      Plus précisément, il stocke plusieurs morceaux d’audio et jette le plus ancien : autrement dit, une fenêtre glissante (rolling window)