Création d’un assistant conversationnel avec Python et Raspberry Pi

L’histoire de eLVis, conception d’un assistant conversationnel

CBTW
L’Actualité Tech — Blog CBTW
5 min readApr 11, 2017

--

Dans la continuité d’un précédent article où nous vous faisions part du test d’une librairie Python permettant d’implémenter son chatbot sur mesure, nous nous sommes lancés dans le projet un peu fou de construire de toutes pièces notre assistant conversationnel pour nos locaux. Ce compagnon, à qui l’on dira “allume la lumière à l’étage” ou bien “comment aller à Gallieni ?” et qui éclairera la pièce ou nous répondra “Prends la ligne 3 jusqu’au bout !”, s’appelle eLVis. Voici son histoire…

Alors oui, peut-être que Tony Stark l’a déjà fait dans Iron Man, peut-être que Mark Zuckerberg a essayé de s’en inspirer pour en développer un chez lui ou encore qu’Alexa d’Amazon ou le Home de Google sont en train de s’arracher les parts de ce marché en pleine explosion. Mais notre motivation est avant tout fondée sur notre volonté de développer nous-même les briques de ce petit assistant et de pouvoir lui ajouter les features qu’on veut, quand on veut.

Commençons par une présentation globale d’abord : eLVis a été implémenté sur un Raspberry Pi 3 sur lequel tourne une Raspbian Jessie. Python a été choisi comme langage de base du projet. Parmi les librairies utilisées, certaines sont compilées en local et d’autres permettent d’aller faire des requêtes vers des APIs externes.

D’un point de vue hardware, nous utilisons un micro JABRA qui a l’avantage d’être omnidirectionnel et d’intégrer un petit speaker. Pour les premiers tests de domotique, nous interagissons avec des prises WeMo, des ampoules Philips Hue et des enceintes Sonos (wifi) et Marshall (Bluetooth).

De manière concrète, le projet s’articule en plusieurs briques comme le montre le schéma ci-dessous :

  • HotWord Loop : Une boucle qui écoute et attend la reconaissance d’un Hotword (défini à “Dis eLVis ! “) afin d’écouter une requête derrière.
  • NLP Analyzer : Cette brique analyse la requête qui est donnée à l’oral à eLVis (elle inclut une partie de Speech-to-Text). Cet analyseur doit pouvoir activer un Trigger qui commandera un objet et/ou répondra avec une information à l’interlocuteur.
  • Action Trigger : Le rôle de cette brique est de gérer les différentes features d’eLVis : gestion de la musique, des lumières, prise d’information auprès de différentes API externes (météo, ratp, etc.)
  • Voice Synthetizer : Pour donner une voix à eLVis avec une solution du Text-to-Speech.
  • Le Back-Office : Une web app qui permet monitorer les différentes features, gérer l’ajout/suppression, l’activation/désactivation des objets connectés et tout autre setting liés à eLVis.

La boucle de détection du HotWord

On commence donc avec peut-être un module qui nous a donné le plus de fil à retordre : la détection du HotWord.

La référence parmi les solutions Open Source, c’est Snowboy ! C’est une techno de reconnaissance vocale développée en C++ et compatible Raspberry Pi, Ubuntu et Mac OS X. Grâce à Swig, on peut aisément l’utiliser depuis d’autres langages (et notamment en Python) via ses wrappers.

Elle permet de créer des modèles custom et de les entraîner à reconnaître ses propres mots soit depuis leur plateforme web, soit depuis leur API !

Ensuite, on charge le modèle en local et on l’utilise via une classe HotwordDetector disponible en Python dans leur repository.

La difficulté venait d’une part du fait que la compilation varie logiquement en fonction de l’OS. Il faut donc faire attention à la version compilée utilisée quand on travaille en local sur les tests ou quand on l’implémente sur le Raspberry.

Et d’autre part, il a fallu effectuer soigneusement l’entraînement en ligne du HotWord. Habitué à devoir détecter le “Dis eLVis” dans un environnement bruyant, il ne fallait pas effectuer trop d’enregistrements dans une salle isolée pour l’entraînement car sinon le modèle n’est pas capable de détecter le son avec un fond sonore non nul. Inversement, ne l’entraîner qu’avec un même type de bruit peut créer un biais dans l’apprentissage du HotWord et amener le modèle à ne s’activer que dans un fond sonore identique à celui de la phase d’entraînement.

L’analyse du langage naturel (NLP)

C’est le cœur de l’intelligence de notre petit camarade.

Un premier classifieur nous permet de situer le contexte de la requête :

  • “Mets-moi du Jul” : contexte MUSIQUE
  • “Allume là-haut” : contexte LUMIÈRE
  • “Fais-moi rire” : contexte HUMOUR
  • “Coupe le son” : contexte MUSIQUE

En parallèle, plusieurs autres classifieurs et algorithmes de reconnaissance d’entités (Named Entity Recognition) nous permettent d’avoir des informations supplémentaires au contexte reconnu. Bien que tous les sous-modèles soient interrogés en parallèle, le contexte indique quels sont ceux qu’on écoute en plus. Si nous reprenons les exemples ci-dessus :

  • “Mets-moi du Jul” : le NER extrait “Jul” qui deviendra la requête musicale.
  • “Allume là-haut” : un classifieur interrupteur comprend qu’il s’agit de tourner en ON une lumière. “là-haut” est reconnu comme un lieu associé à un objet.

Un futur article rentrera dans le détail de la gestion des modèles, de leur entraînement et de leur intégration dans l’architecture d’eLVis.

Le déclencheur d’actions

Il prend en entrée les résultats de l’analyse NLP et déclenche les actions pour les objets associés.

Chaque objet ayant ses propres méthodes de communication, nous avons standardisé les classes de contrôle. Elles permettent généralement d’exécuter l’action (mettre l’état d’une lumière à ON, effectuer une recherche de musique sur un streamer et diffuser le résultat sur une enceinte, etc.)

Le Back Office développé en Flask nous permet de garder la main sur l’activation/désactivation ou l’ajout/suppression d’un déclencheur, d’un objet ou simplement d’une action.

La synthèse vocale

Dans l’objectif de ne se baser que sur des technos Open Source, nous étions partis sur l’API publique de Voxygen qui nous offrait plusieurs voix très naturelles et amusantes. Malheureusement, ces derniers ont décidé de la fermer au grand public… Nous nous sommes donc tournés vers une implémentation en local via la plateforme MaryTTS développée en Java.

Nous avons donc un serveur local qui tourne dans une jvm avec lequel on interagit en envoyant du texte et recevant des fichiers audio. Une des difficultés ici a été d’adapter la synthèse des sons à la bonne fréquence pour que la librairie de lecture PortAudio lise le son correctement.

Nous publions régulièrement des articles sur des sujets de développement produit web et mobile, data et analytics, sécurité, cloud, hyperautomatisation et digital workplace.
Suivez-nous pour être notifié des prochains articles et réaliser votre veille professionnelle.

Retrouvez aussi nos publications et notre actualité via notre newsletter, ainsi que nos différents réseaux sociaux : LinkedIn, Twitter, Youtube, Twitch et Instagram

Vous souhaitez en savoir plus ? Consultez notre site web et nos offres d’emploi.

L’auteur

Arnaud,
Data Scientist
Data enthusiast for social good

--

--

CBTW
L’Actualité Tech — Blog CBTW

Nos experts partagent leur vision et leur veille en développement web et mobile, data et analytics, sécurité, cloud, hyperautomation et digital workplace.