Raspberry Pi Domotique par commande vocale avec Wit.ai Raspberry Pi Domotique par commande vocale avec Wit.ai
Menu

Raspberry Pi Domotique par commande vocale avec Wit.ai

19 juillet 2015 - Domotique, Python, Raspberry Pi

Un nouveau petit tuto cette fois sur des commandes vocales.

Voilà le résultat en image et son :

Dans un précédent tuto (VOIR ICI) j’avais fait avec un arduino, une carte ethernet et une commande par page WEB en PHP AJAX de la domotique me permettant d’allumer ou d’éteindre des prises ou lumières en 433Mhz. Après j’ai ajouté une connexion avec une base de données pour avoir sur tous les accès (ordi, tablette, téléphone) la valeur de la commande à l’affichage.

Tout cela fonctionne bien et vous trouverez tous les scripts sur GITHUB

 

Ensuite j’ai voulu me lancer dans la commande vocale !!! C’était simple à partir d’un raspberry pi je lançais une commande et lui il passe une URL avec cette commande à mon arduino comme le fait ma page WEB. Simple non !!!

J’ai d’abord voulu faire cela « en circuit fermé » reconnaissance et parole le tout sur le PI mais j’ai rien trouvé de très concluant pour le moment. Soit trop lourd pour un raspberry B+ soit ne fonctionne pas voir même impossible à installer. Le seul produit prometteur étant VOXgenerator de Benoit.  Mais pour l’instant il est en court de mise au point.

Donc j’ai cherché sur un autre système avec la reconnaissance vocale par le net (non pas google) mais wit.ai.  Bon maintenant il y a du facebook derrière car la boite des petits français a été acheté par le géant Américain 🙁

Donc sur wit il est possible de créer des commandes et d’utiliser du python pour le fonctionnement donc je me suis mis au python. Puissant le truc !!!

Logo smartCoin

Le site n’est pas dès plus simple à comprendre pour un francophone mais j’ai réussit à faire des commandes et à installer le wit sur mon Raspberry et j’ai eu quelques échanges de mail sur le site de wit avec Laurent dans un Français impeccable je pense que c’est sa langue maternelle !

Vous trouverez sur wit.ai toute la doc sur l’installation et les commandes de wit.  Il faut bien installer les dépendances au début avec -dev (libcurl, libbox, pyhon-dev) et ca roule. Sur le REDME du GITHUB j’ai indiqué toutes les commande pour l’installation sur un Raspberry PI tout « neuf ».

Une fois que wit reçoit une commande il vous retourne une réponse en JSON composée de plusieurs éléments dont votre texte écouté, l’instance qui si rattache et si c’est on ou off. Il suffit d’analyser cela 🙂

Un exemple de retour :  { « entities« : { « on_off« : [ { « value« : « off », « entity« : « on_off » } ] }, « confidence« : 0.653, « _text« : « éteindre l’écran », « intent« : « ecran », « intent_id« : « d355498f-c6c1-4663-a347-280a5e7cf2f6 » }

Mon instance c’est : écran

Mon texte c’est : éteindre l’écran (il écoute bien !)

Ma commande c’est : off

Pour la conception du programme en python qui va écouter, analyser le retour, envoyer la commande à l’arduino j’ai fait plusieurs version avant de trouver la bonne et finalement je passe par la création d’une classe qui me permet de créer autant d’objet que j’ai d’instance a commander (dans mon cas trois pour l’instant).

Vous trouverez tous les fichier sur GITHUB.

Avant de rentrer dans le détail des scripts j’ai aussi voulu lui donner de la voix… C’est bien quand tu dis « tu m’écoutes » d’avoir comme réponse : »je suis à ton service »  🙂

Là aussi je suis passé par espeek et mbrola mais franchement les voix font peur aux enfants c’est pas encore cela et le mieux c’est Google Translate rapide et avec une voix très claire même si elle manque un peu d’intonation mais bon. Pour cela j’utilise un fichier speech.sh avec comme argument le texte qui au retour est lu.

Pour les scripts, il y a un programme d’entrée : domotic.py il va créer les différents objets à partir d’un fichier config.xml et se mettre en écoute il va gérer les différents cas : pas de texte je re-écoute, texte pas compris je le dis et je re-écoute et si une instance est bonne il ouvre la commande de l’objet correspondant. En fait j’ai une liste d’objet et l’indice est le nom de l’instance. Dans mon exemple de réception plus haut mon object est : domotic[ecran]. A cette commande je passe la commande on ou off et les variable de connexion à la base de données qui sont dans un fichier configSQL.xml

Ensuite l’objet va faire quelques vérification : Si je demande d’allumer l’écran n’est il pas déjà allumé ? Je vérifie dans la base de données si oui je le dis et j’attends un autre ordre. Si non j’envoie la commande par l’URL et si tout va bien je change la valeur dans la base et je dis ce que j’ai fait « j’ai allumé l’écran ».

 Le tout fonctionne bien avec un lancement du programme au démarrage du raspberry même après plusieurs heures de fonctionnement. Mais j’ai encore des choses à améliorer:

L’écoute de wit n’est pas permanente donc à la coupure je vérifie si j’ai un texte et si non je relance donc sur 10 secondes je dois avoir environ 6 secondes d’écoute et quand je parle pendant les 4 secondes et ben il se passe rien !

J’ai un micro USB sur le raspberry acheté un euro  (1 €) sur Ebay donc je dois parler au micro impossible de passer une commande de mon canapé…

Je vous tiendrais au courant des améliorations mais si vous avez des questions je suis a votre écoute et si vous avez des idées pour améliorer cela je suis aussi à votre écoute.

  • yves

    bonsoir je suis nouveau dans le développement raspberry je suis super étonné par votre travail en fait je souhaite me former dans ce secteur et acquérir des connaissances pour pouvoir mener des projets personnelles, je serais super content si vous avez un lien a me donner.encore c’est super ce que vous avez fait

    regards