Une IA comme ChatGPT peut-elle passer le test de Turing ? Nous explorons cette question avec un ESP32, un clavier, un écran TFT et la synthèse vocale de Google. Est-il évident qu'il s'agit d'une machine ? Découvrez ce projet de terminal d'IA.

Il ne fait aucun doute que les outils d'IA tels que ChatGPT d'OpenAI et Gemini de Google ont le potentiel de révolutionner de nombreux domaines. J'ai utilisé ChatGPT pour développer des solutions de contrôle assez complexes. Je commence par présenter l'idée initiale et, puis je fournis progressivement des informations supplémentaires, ce qui permet à l'outil d'affiner et d'améliorer le code à chaque itération. Il est même capable de convertir un code Python en MicroPython ou en croquis Arduino. Il est crucial de diriger minutieusement le processus pour s'assurer qu'il ne dévie pas de l'objectif initial. Il arrive qu'il dévie et répète les mêmes erreurs, mais j'aime bien trouver ces bogues et réajuster les résultats de ChatGPT pour qu'il corresponde mieux à mon objectif.

AI terminal main
AI terminal

Matériel

Le cœur de ce projet est le module de développement ESP32 d'Espressif. Grâce à son architecture à double cœur, ce module dispose d'une capacité de traitement suffisante pour gérer les communications Wifi, gérer l'entrée série d'un clavier PS2, envoyer des données à l'écran TFT de 3,5 pouces et sortir des données audio numériques vers le module I2S. Le schéma complet du terminal ChatGPT est présenté dans la figure 1.

Schematic of the talking ChatGPT AI terminal.
Figure 1. Schéma du terminal ChatGPT parlant.

L'utilisation d'un clavier PS2 pourrait sembler surprenante ; la raison en est simplement que je n'ai pas réussi à implémenter un port USB à cet effet sur l'ESP32. Dans le temps limité dont je disposais, j'ai choisi une interface PS2 pour sa simplicité et sa faible consommation de ressources. Les connecteurs PS2 pour claviers sont disponibles chez plusieurs fournisseurs de composants électroniques en ligne. L'affectation des broches du clavier PS2 est indiquée dans le schéma du circuit. Il est probable que certains développeurs souhaitent évoluer vers une interface USB, et je suis impatient de lire leurs retours.

L'écran tactile TFT de 3,5 pouces utilisé a une interface parallèle plutôt que la version SPI alternative. Cela nécessite plus de fils de connexion, mais dans cette application, nous avons suffisamment de GPIO de rechange et l'interface offre un temps de réponse significativement plus rapide. Les fonctionnalités tactiles de l'écran ne sont pas utilisées ici.

The audio amp module converts I2S digital audio to 3◦W of audio.
Figure 2. Le module amplificateur audio convertit l'audio numérique I2S en 3 W d'audio.

Un module amplificateur MAX98357A I2S (figure 2) convertit le signal audio numérique I2S produit par l'ESP32 en audio analogique. Un amplificateur intégré de classe D de 3 W amplifie le signal pour obtenir un bon niveau sonore. L'entrée de gain est liée à la masse, ce qui produit un volume maximal de l'ampli. La sortie de l'amplificateur de classe D peut alimenter un haut-parleur de 4 Ω.

Je m'abonne
Abonnez-vous à la balise thématique Embedded & AI pour être averti dès qu'une information relative à ce sujet sera publiée par Elektor !

Ne perdez pas la clé

ChatGPT, développé par OpenAI, est capable de générer des réponses textuelles à des invitations ou questions fournies par les utilisateurs. Il fonctionne généralement via une interface de navigateur. L'API OpenAI a été conçue pour être utilisée par les développeurs et les entreprises afin qu'ils puissent intégrer des fonctions d'IA dans leurs propres applications, logiciels ou sites web. Il ne s'agit pas seulement d'une interface de chatbot, mais d'une interface de programmation flexible permettant aux entreprises d'intégrer les fonctionnalités de chatGPT dans leurs produits. Les développeurs envoient des données à l'API de manière programmatique et obtiennent des réponses en retour. Pour accéder à l’API OpenAI, une clé unique est nécessaire ; celle-ci est générée lors de votre inscription sur le site web d’OpenAI où il faut cliquer sur Sign up.

Remplissez le formulaire d'inscription avec votre adresse électronique, votre mot de passe et d'autres informations requises. Une fois ces informations saisies, accédez au tableau de bord de votre compte OpenAI et cliquez sur le bouton NEW PROJECT. Donnez un nom et une description à votre projet (facultatif). Dans les paramètres de votre projet, cliquez sur l'onglet API KEYS. Vous verrez une liste des clés secrètes existantes (Figure 3). Cliquez sur le bouton Create a new secret Key pour générer une nouvelle clé. Faites une copie de cette clé API générée et conservez-la en sécurité, car elle ne pourra plus être récupérée ultérieurement pour des raisons de sécurité. Vous aurez besoin de cette clé pour authentifier vos applications avec les services d'OpenAI. Le site propose également un tutoriel de démarrage rapide pour les développeurs qui vous guide dans le processus de génération d'une réponse via l'API en utilisant la clé générée pour autoriser votre accès.

The OpenAI page to register for the OpenAI API.
Figure 3. Page d'inscription à l'API de l'OpenAI.

Au moment de la rédaction de cet article, OpenAI fournit des crédits gratuits lors de la première inscription, qui permettent d'expérimenter avec l'API. Après avoir utilisé tous ces crédits, vous devrez payer en fonction de votre utilisation. Si vous n'avez pas encore mis en place une méthode de paiement pour la facturation, il sera nécessaire de le faire. Assurez-vous de lire attentivement les directives d’utilisation et les conditions de service d’OpenAI.

Synthèse vocale

Une API de synthèse vocale (TTS) est utilisée pour convertir la réponse textuelle de OpenAI en un flux de données audio numériques. Il existe plusieurs API de synthèse vocale que nous pouvons utiliser à cette fin. OpenAI possède sa propre API TTS qui propose une variété de voix naturelles. Pour accéder à cette API, vous devez utiliser la même clé que celle qui vous a été attribuée pour utiliser l'API OpenAI.

Pour notre projet, nous utilisons l'API Google Cloud Text-to-Speech. Elle offre une gamme variée de voix disponibles en plusieurs langues et dialectes. Bien que les voix fournies par Google puissent parfois paraître légèrement plus mécaniques que celles d'OpenAI et que de longs textes puissent entraîner des interruptions dans l'audio, l'utilisation de l'API Google est gratuite pour le moment, contrairement à l'API TTS d'OpenAI qui est payante.

Pour démarrer avec Google TTS, nous devons d'abord créer le projet sur Google Cloud et activer l'API Google TTS pour obtenir notre clé API. Les chaînes de texte peuvent maintenant être envoyées à l'API à l'aide d'une requête HTTP POST accompagnée de la clé. Le flux audio numérique I2S résultant est ensuite stocké et lu pour produire un signal audio analogique via le MAX98357A.

Je m'abonne
Abonnez-vous à la balise thématique OpenAI pour être averti dès qu'une information relative à ce sujet sera publiée par Elektor !

Logiciel : bibliothèques

Le croquis Arduino est fourni . Vérifiez toutes les bibliothèques référencées dans l'en-tête du croquis pour vous assurer qu'elles sont installées dans votre environnement, si ce n'est pas le cas, installez-les maintenant en utilisant le gestionnaire de bibliothèques de l'EDI Arduino. En utilisant les méthodes disponibles dans la bibliothèque Audio.h, nous avons pu facilement produire une sortie audio pour accompagner les mots écrits sur l'écran TFT. Il a suffi d'ajouter quelques lignes dans la boucle pour générer l'audio. Découvrez-le dans le croquis Arduino.

#include <PS2Keyboard.h>//Keyboard specific

#include <WiFi.h>

#include <HTTPClient.h>

#include <ArduinoJson.h>

#include <SPI.h>

#include <TFT_eSPI.h>// Hardware-specific library

#include "Audio.h"   //Audio header file

 

// GPIO connections to I2S board

#define I2S_DOUT  21

#define I2S_BCLK  22

#define I2S_LRC   23

 

Audio audio;  //audio instance creation

 

Le fichier ArduinoJSON.h est utilisé pour analyser les données de réponse au format JSON de l'API OpenAI dans un format utilisable par le code Arduino.

 

Logiciel : Requête de l'API ChatGPT

Le processus d'interaction avec l'API OpenAI est inclus dans la fonction makeApiRequest(String prompt1) :

 

1. Nous commençons par configurer un HTTP client:

 

HTTPClient http;

http.setTimeout(24000); // 24 seconds timeout

http.begin("https://api.openai.com/v1/chat/completions");

http.addHeader("Content-Type", "application/json");

http.addHeader("Authorization", "Bearer " +

                   String(api_key));

 

2. Ensuite, nous préparons la charge utile qui sera au format JSON :

 

StaticJsonDocument<1024> jsonPayload; 

    // setting a maximum size of 1KB

jsonPayload["model"] = "gpt-3.5-turbo";    

    // model is gpt-3.5-turbo,

  ​  ​​​​​​// change if you have access to 4 or 4.5

jsonPayload["temperature"] = 0.8;

    // randomness of response, the higher

   ​​​​​ // the value, the higher the randomness

jsonPayload["max_tokens"] = 2000;

    // maximum words & punctuations

    // limit to be generated by response

 

3. Préparez le message (un tableau de messages imbriqués), utilisez le format JSON et envoyez la demande :

 

JsonArray messages = jsonPayload.

    createNestedArray("messages"); 

    //put in a nested format not random

JsonObject userMessage = messages.createNestedObject();

userMessage["role"] = "user";

userMessage["content"] = prompt1;

String payloadString;

serializeJson(jsonPayload, payloadString);

 

4. Envoyez la demande et recevez la réponse :

 

int httpResponseCode = http.POST(payloadString);  

    //transfer to the open page

if (httpResponseCode == HTTP_CODE_OK) {  

  String response = http.getString();   

    // if everything goes OK get the

    // reply = output and put in a string

...

 

5. TLa page web comprendra généralement une jungle d'informations parasites (toutes dans le code HTML) qui ne sont pas utiles pour notre application et qui peuvent être supprimées. Ici, nous normalisons la réponse - en supprimant les balises JSON, etc. afin qu'elle puisse être lue sur l'écran TFT :

 

StaticJsonDocument<1024> jsonResponse; 

    //parse the tags etc of the response string.

deserializeJson(jsonResponse, response);

    // and put in a simple stripped string & return

String assistantReply = jsonResponse

    ["choices"][0]["message"]["content"].

    as<String>(); 

    // select the first part which contains our reply

return assistantReply;

 

Logiciel : Setup et Loop

Dans la fonction setup nous initialisons la carte TFT, I2S, connectée à Internet avec nos identifiants Wifi.

 

void setup() {

  delay(300);

  …

  audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);

//I2S board initialised

  audio.setVolume(50);

 

Dans la fonction loop nous envoyons des questions à ChatGPT. Lorsque la session est terminée, nous restons à l'intérieur loop:

 

String response = makeApiRequest(msg);

    // sent to Chatgpt

...

if (l1>200) {

  response = response.substring(0, 200);

    // truncate first 200 characters

}

audio.connecttospeech(response.c_str(), "en");

    //speak up the 200 characters

 

Google TTS impose une restriction de 200 caractères, refusant de traiter des textes plus longs. Pour surmonter cette limite, la réponse est tronquée à 200 caractères spécifiquement pour la synthèse vocale. Ainsi, bien que la réponse intégrale soit visible à l'écran, seule la portion initiale est convertie en audio. Pour les textes excédant cette longueur, le contenu défile sur l'écran, mais cela peut être ajusté en apportant de légères modifications au croquis.

Test du projet

Les délais que j'ai utilisés dans les boucles du logiciel sont assez spécifiques. Vous pouvez les ajuster, mais je vous recommande de commencer par les valeurs par défaut utilisées dans le code. Une fois que vous êtes à l'aise avec les réponses, n'hésitez pas à les modifier. J'ai commencé par des questions simples comme « Qui êtes-vous ? » ChatGPT a répondu de manière appropriée, en affichant l'introduction à l'écran, tandis que l'interlocuteur l'articulait clairement.

J'ai ensuite testé le système en utilisant des questions telles que : « Écrivez 5 phrases sur le magazine Elektor « (figure 4) et je lui ai même demandé d'écrire des sketches blink pour Arduino UNO, ESP32, et Raspberry Pi Pico.

Testing the system with prompts asking for blink sketches for Arduino UNO, ESP32, and Raspberry Pi Pico.
Figure 4. Test du système avec des requêtes demandant des croquis de clignotement pour Arduino UNO, ESP32 et Raspberry Pi Pico.

Dans tous les cas, ChatGPT s'est parfaitement comporté, a parfaitement compris le contexte et a répondu avec précision, le locuteur délivrant la sortie vocale haut et fort.

Pour conclure

Tous les fichiers associés à ce projet se trouvent à l'adresse . Internet et les navigateurs web tels que Google ont totalement révolutionné notre accès à l'information et remplacé ces encyclopédies encombrantes qui garnissaient nos étagères à la maison. Aujourd'hui, nous assistons à la montée en puissance de logiciels et de machines d'IA basés sur ChatGPT API, TensorFlow Lite Micro, Edge Impulse, OpenMV, TinyML, qui sont prêts à perturber les modèles commerciaux existants et les méthodes plus traditionnelles de résolution de problèmes. Nous nous trouvons à l'aube d'une ère intéressante.


Questions ou commentaires ?

Envoyez un courriel à l'auteur berasomnath@gmail.com, ou contactez Elektor redaction@elektor.fr.


Cet article (230536-04) figure dans l'édition bonus AI 2024 d'Elektor.


Je m'abonne
Abonnez-vous à la balise thématique Espressif pour être averti dès qu'une information relative à ce sujet sera publiée par Elektor !