J'ai créé un assistant vocal en temps réel pour mon ESP-32, voici mon parcours - Partie 2 : Node, OpenAI, Langchain

DEV - 20/11
Du matériel au logiciel intelligent : construire le cerveau de notre assistant vocal ESP32 Bienvenue à nouveau...

Du matériel au smartware : construire le cerveau de notre assistant vocal ESP32

Bienvenue dans la deuxième partie de notre série d'assistants vocaux ESP32 ! Dans la première partie, nous avons posé les bases matérielles en configurant l'ESP32 pour capturer les entrées vocales et lire les réponses. Nous plongeons désormais dans le domaine passionnant de la fourniture d'informations à notre assistant à l'aide d'un serveur Node.js alimenté par **LangChain* et OpenAI.*

Le voyage jusqu'à présent

Dans le premier volet, nous avons mis la main à la pâte avec l'aspect matériel : connecter des microphones, configurer des haut-parleurs et nous assurer que notre ESP32 pouvait gérer l'entrée et la sortie audio. Nous avons réussi à faire en sorte que l'ESP32 enregistre l'audio et le restitue, une première étape essentielle.

Mais soyons réalistes, un assistant qui ne fait que répéter ce que vous dites n'est pas particulièrement intelligent. La prochaine étape logique était donc de lui insuffler une certaine intelligence. C'est là que LangChain et OpenAI entrent en jeu.

Si vous avez raté la première partie, voici les médias concernés.

La vilaine bête

Vidéo

Code source

Le code source complet de ce projet est disponible sur GitHub : ESP32 AI Assistant Repository

Le défi du serveur

Au départ, je me suis dit : « J'ai compris : Node.js est mon truc ! » Cependant, en approfondissant, j'ai réalisé que l'intégration du streaming audio en temps réel, la gestion des connexions WebSocket et la gestion du traitement de l'IA étaient... tout un parcours !

Après de nombreuses sessions de débogage alimentées par la caféine, des gribouillages frénétiques sur un tableau blanc et des moments eurêka sous la douche, j'ai développé une architecture de serveur robuste que je suis ravi de partager avec vous.

Dans les coulisses : comment tout cela fonctionne

Imaginez ce flux de travail :

  1. Capture vocale : votre voix est capturée par le microphone de l'ESP32.
  2. Transmission de données : les données audio sont envoyées via des flux WebSocket vers un serveur Node.js.
  3. Traitement de l'IA : le serveur traite l'audio en temps réel, utilise LangChain pour orchestrer l'agent et gérer la communication avec OpenAI.
  4. Lecture de la réponse : le serveur renvoie la réponse à votre ESP32 pour la lecture, le tout en quelques secondes.

Voici les éléments clés qui font fonctionner ce système :

  • Serveur WebSocket : Le serveur WebSocket personnalisé gère les flux audio de manière fluide tout en maintenant des connexions stables avec l'ESP32.
  • Traitement audio : l'audio brut est transformé en formats compatibles OpenAI, avec une gestion minutieuse des tampons pour maintenir le flux du flux.
  • Lecture : le système garantit une lecture fluide des réponses audio sur l'ESP32, ce qui rend les conversations naturelles.
  • Agent LangChain : C'est là que l'intelligence entre en jeu : LangChain vous aide à gérer votre flux IA "facilement".

Examinons comment ces éléments fonctionnent ensemble, en commençant par l'intelligence de base.

Le cerveau de l'opération

Le cœur du serveur est le système de gestion des agents (enlib/agent.ts). Il fait office de centre de commande, traitant la parole entrante et déterminant les réponses appropriées.

Implémentation du serveur Voice Assistant (Node.js/TypeScript)

Composants de base

1. Gestion des agents (lib/agent.ts)

LeOpenAIVoiceReactAgentLa classe encapsule les fonctionnalités de base de l’assistant vocal, y compris la gestion du tampon du début à la fin.

export class OpenAIVoiceReactAgent { // Propriétés protégées connexion protégée : OpenAIWebSocketConnection ; instructions protégées ? : chaîne ; outils protégés : Tool[] ; protégé BUFFER_SIZE = 4800 ; // Propriétés publiques public buffer = new Uint8Array(); public audioBuffer : Tampon | indéfini; // Propriétés privées audioManager privé : AudioManager ; enregistrement privé : booléen = faux ; constructeur (params : OpenAIVoiceReactAgentOptions) { this.audioManager = new AudioManager(); this.connection = new OpenAIWebSocketConnection({ url : params.url, apiKey : params.apiKey, model : params.model, audioConfig : p...
[Courte citation de 8% de l'article original]
Loading...