Le contrôle vocal avec Raspberry Pi + S.A.R.A.H.

Bonjour,

Dans cet article, je vais vous montrer comment contrôler les GPIOs de votre Raspberry préféré avec la voix. A la fin de cet article, votre vie peut en être bouleversée à différents niveaux :

  • vous passez pour un fou qui parle tout seul dans son salon
  • vous ne vous levez plus jamais de votre canapé pour allumer une lampe
  • vous quittez votre femme pour une dénommée Sarah

Passons à la présentation de nos deux projets qui vont révolutionner votre vie, vous l’aurez compris dans le titre, je parle du Raspberry Pi et de S.A.R.A.H. Voici un exemple de ce qu’on va obtenir :

S.A.R.A.H. tire son nom de l’excellente série Eureka. Ce projet a pour vocation de rassembler et de faire communiquer tout les objets connectés tels que les SmartTV, Nabaztag, box TV, etc., ainsi que les différentes informations que l’on peut récupérer sur le net grâce à des API voir même sans API (PhantomJS) comme la météo, des infos sur Wikipédia, etc. Un des grands avantages de S.A.R.A.H. est l’intégration de la reconnaissance vocale ou gestuelle ( Kinect ).  Un autre  avantage est l’écriture de plugins qui est extrêmement simple et ne nécessite que des connaissances basiques de XML et de JS.

S.A.R.A.H. sera donc le point central du projet ( le cerveau ?) qui vas nous permettre de connecter notre voix avec les GPIOs de notre Raspberry Pi.

Le Raspberry Pi, quant à lui, n’est plus à présenter mais, si c’est encore le cas, voici quelques liens qui vont vous aider :

Ce petit ordinateur est tellement flexible en termes d’utilisation que ça fait de lui notre meilleur ami pour ce genre de projet. Le contrôle de ses entrées/sorties se font simplement par script python ou même pas simple commande bash.

relaisA partir de là, il suffit de connecter ce que l’on souhaite sur ses entrées/sorties. Personnellement, j’ai branché un capteur de température, 3 DEL, un détecteur de mouvement ainsi qu’une carte relais que j’ai relié à une prise 220 V . Vous trouverez facilement des plans de montage sur Internet. Voici un exemple sur un excellent blog que je vous conseille de suivre : http://blog.idleman.fr/?p=1623.

lego_raspberry
Si vous faites comme moi et que vous branchez votre Raspberry avec du 220 V, je vous conseille la plus grande prudence en ce qui concerne l’isolation et l’accessibilité du circuit. Pour ma part, en plus de l’isolation, je lui ai construit un petit boîtier en LEGO qui évite de laisser la carte à l’air libre.

Une fois nos périphériques connectés aux différents GPIOs de notre Raspberry, il nous faut rendre accessibles les GPIOs à S.A.R.A.H. Pour cela, j’ai écrit un petit projet python https://github.com/bewiwi/py-script qui permet d’exécuter un script depuis une requête HTTP. Il est fourni avec le script rb.py qui permet de contrôler les GPIOs en mode sortie ou de lire le statut d’une entrée.

Pour l’installation et l’utilisation, rendez-vous dans l’article précédent : L’Apéiseur de script

Pour l’utilisation avec les GPIOs, nous utiliserons des requêtes comme celle ci-dessous qui va activer la sortie de la GPIO 23 :

curl "http://192.168.1.2:8080/rb.py?s=1&i=23"

et pour la désactiver :

curl "http://192.168.1.2:8080/rb.py?s=0&i=23"

L’avantage de passer par cette surcouche HTTP est la simplicité d’ajout de nouveaux capteurs. Pour exemple, en plus du contrôle des GPIOs, j’ai aussi un simple script qui me permet de consulter la température de mon capteur.

Une fois le contrôle effectué depuis nos requêtes HTTP, il ne nous reste plus qu’a écrire le lien entre S.A.R.A.H. et notre Raspberry par le biais d’un petit plugin en 3 fichiers tout simple :

  • rb.prop
  • rb.js
  • rb.xml

Le fichier rb.prop définit le plugin avec son type, son nom, ses arguments

{
  "modules" : {
    "rb" : {
      "description": "Sarah controle mon raspberry",
      "version" : "1.0",
      "rb_http": "http://192.168.1.2:8080/"
    }
  }
}

Dans ce fichier on peut définir le lien vers l’API de notre service de contrôle des GPIOs. Ce lien sera aussi modifiable dans l’interface de S.A.R.A.H.

La définition de la grammaire vocale est définie dans le fichier rb.xml :

<grammar version="1.0" xml:lang="fr-FR" mode="voice" root="ruleRb" xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
<rule id="ruleRb" scope="public">
<example>Sarah allume la guirlande</example>
<tag>out.action=new Object(); </tag>
 
<item>Sarah</item>
<one-of>
<item>Allume<tag>out.action.status="1";</tag></item>
<item>Demarre<tag>out.action.status="1";</tag></item>
<item>Stop<tag>out.action.status="0";</tag></item>
<item>Eteint<tag>out.action.status="0";</tag></item>
<item>Arrete<tag>out.action.status="0";</tag></item>
</one-of>
 
<item repeat="0-1">
<one-of>
<item>la guirlande<tag>out.action.gpio="25";</tag></item>
<item>la lampe<tag>out.action.gpio="21";</tag></item>
</one-of>
</item>
 
<tag>out.action._attributes.tts = "En cours";</tag>
<tag>out.action._attributes.uri="http://127.0.0.1:8080/sarah/rb";</tag>
</rule>
</grammar>

La définition de la grammaire est très simple. Ici on définit différentes syntaxes qui définiront les arguments passés au script JS. Ici, les mots « Allume » et « Demarre » vont permettre de spécifier le statut souhaité à 1 et les mots « Stop », »Eteint » et « Arrete » permettent de passer le statut à 0. Dans le même esprit, les mots « la lampe » définissent le GPIO numéro 21 et « la guirlande » le GPIO 25.

Et pour finir le fichier rb.js qui est exécuté et qui appellera notre service :

exports.action = function(data, callback, config, SARAH){
  // Retrieve config
  config = config.modules.rb;
  if (!config.rb_http){
    console.log("No link http found for RB");
    callback({'tts' : 'La config est invalide'});
    return;
  }
  console.log('api :'+config.rb_http);
  var url = config.rb_http+'rb.py?s='+data.status+'&i='+data.gpio;
  var request = require('request');
  request({ 'uri' : url }, function (err, response, body){
 
  if (err || response.statusCode != 200) {
    callback({'tts': "L'action a échoué"});
    return;
  }
    callback({'tts' : 'Fait !'});
  });
}

Concrètement, une fois la configuration ( l’adresse HTTP de l’api ) renseignée dans l’interface de S.A.R.A.H., il suffit de respirer un grand coup et de dire : « Sarah, allume la guirlande ».

Bon bidouillage à tous,

Download :
Le plugin S.A.R.A.H. : rb-sarah
(EDIT : Il manquait un paramètre pour le contrôle des GPIOs dans rb.js merci @guiguiabloc)

Source / Lien externe :

12 comments

  1. bob25 dit :

    Bonjour,
    J’aimerai commander les modules RF chacon mais n’étant pas doué en programmation comment envoyer
    /var/www/yana-server/plugins/relay/radioEmission 0 12325261 1 on
    avec Sarah

    D’avance Merci

  2. Guillaume dit :

    Bonjour

    Quel micro avez vous utiliser pour ce montage ?

    Merci beaucoup

  3. PORCHERET Pierre dit :

    Bonjour, je cherche a récupérer le résultat par texte pour un traitement par le raspberry est ce faisable ?

  4. bibiyanki dit :

    merci pour le tutoriel mais

    ce n’est pas très compréhensible pour l’utilisateur lambda comme moi

    j’ai bien compris que vous vous serviez des ports gpio pour mettre par exemple un capteur pour les prises chacon…

    mais effectivement pour le micro, comment le configurer? vous parlez d’un micro en bluethoot, il marche directement une fois connecter??
    merci d’avance

  5. STEFANINI dit :

    bonjour
    Pour ce tuto, le serveur de sarah doit être sur le raspberry?

    • PORTE Loïc dit :

      Bonjour,
      D’après mes souvenir, le serveur SARAH n’étais pas sur le RB, c’est pour cela que je passais par « l’apéiseur de script »

      • STEFANINI dit :

        Bonjour Loïc
        Alors je vais faire encore appel à tes souvenirs…
        Les script de ton « apéiseur » tu les mets où exactement? et il suffit d’exécuter que le start.py, ou seul rb.py est nécessaire…
        Pour modifier les GPIO (je suis sur le RBI 2) j’ai juste à changer .xml?

        Merci pour ton aide

  6. STEFANINI dit :

    Bonjour,
    Encore un dernier petit coup de pouce :
    Tout est opérationnel coté serveur, j’ai du repasser sur le port 80 pour que ca marche… mais Sarah me dis « fait » mais rien ne se passe sur les gpio… tu as une idée de pourquoi?

  7. folla dit :

    Salut,
    Svp comment je peux connecter Raspberry Pi avec S.A.R.A.H??
    est ce qu’il faut enregistrer le code source dans /var/www???
    merciii

  8. phiphi dit :

    Bonjour quand je fait le test avec

    http://192.x.x.x:8080/rb.py?s=1&i=23 sur le web il me met ERROR : [Errno 2] No such file or directory

    et sur le terminal de mon rasberry : get /favicon.icon http/1.1″ 500

    MERCI

  9. patrick dit :

    bonjour a tous
    j ai un blem avec rb je voudrais couper un enssemble de gpio
    genre « sarah coupe tout »
    si vous avez une idee…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *