S.A.R.A.H. , Contrôler votre domotique autrement

Un retour à la domotique en attendant la suite de mon billet système qui me prend plus de temps de rédaction que prévu :p
Que voulez-vous, on se laisse aller à tester plein de trucs et le temps file plus vite que l’on ne le souhaiterait…

Aujourd’hui je vais vous présenter un projet dont vous avez sûrement entendu parler si vous côtoyez l’actualité domotique, S.A.R.A.H.

S.A.R.A.H. (Self Actuated Residential Automated Habitat) est un framework écrit en C# pour Windows, basé sur les API de reconnaissance vocale Speech API et le SDK de la Kinect de Microsoft.

Et la vous vous dites, le GuiguiAbloc, il a pété un câble, il parle de windows sur son blog et il met même des liens vers Micro$oft !!!

C’est pas faux…

J’avoue que j’ai trainé des pieds avant de tester le projet de Jean-Philippe Encausse à cause de ma révulsion envers celui dont on peut pas citer le nom, mais il faut bien se rendre à l’évidence, la reconnaissance vocale sous Linux, c’est une horreur.
A part des POCs a 2 balles ou des démos du M.I.T., je n’ai pour l’instant vu personne faire un(e) tuto/démonstration tout simple pour faire de la reconnaissance vocale sous mon OS fétiche (si toi aussi tu as essayer de te configurer Sphinx le soir au fond des bois, tu me comprendras…)

Bref, mes aversions mises de côté, il faut se rendre a l’évidence, ce Monsieur a fait un travail époustouflant.

Ca me réconcilierais presque avec Micro$oft (nan j’déconne).

S.A.R.A.H. permet de contrôler votre domotique par la voix, par les gestes, par la reconnaissance faciale (en cours), par des QR codes etc…
En gros, toutes les possibilités énormes de la Kinect sont exploitées pour interagir avec votre domotique et bonus, elle vous répond (bon d’accord ça fait une femme de plus a causer dans la maison, je vous l’accorde)

En gros, il suffit de dire « Sarah, allume la lumière du salon » et « Sarah, lis le film la Cambrioleuse » pour que xbmc lance votre film favori sous le doux éclairage de votre halogène.

Intéressant, non ?

Concernant l’architecture de S.A.R.AH., vous trouverez tout ce qu’il vous faut ici:

http://encausse.wordpress.com/s-a-r-a-h/s-a-r-a-h-architecture/

Je ne rentrerais pas dans les détail du projet, le site de l’auteur vous l’expliquera mieux que moi, vidéo à l’appui, mais je vais plutôt vous parlez de sa mise en oeuvre ainsi que de la création d’un plugin tout simple pour s’intercaler avec un webservice qui interrogera une base de données.

Car si j’ai une remarque à formuler, c’est le côté léger de la documentation pour l’installation et l’utilisation, surtout quand, comme moi, on n’a pas toucher un Windows depuis 1993…

Tout d’abord, il vous faut un windows, Seven de préférence.
J’ai personnellement installé un windows 7 32bits tout ce qu’il y a de plus basique, sans fioritures, sur un ordinateur portable avec 2Go de RAM (ce qui me permet de profiter du micro intégré).

Ensuite, les pré-requis (bien sûr, installer les versions x64 si vous êtes sous un windows en 64bits) :

- Le framework Microsoft .Net 4.5

- Le SDK Microsoft Speech Platform (j’ai installé la version 11)

- Le Speech Platform Runtime (version 11 également)

- Le pack de langue Française

- les runtime Kinect

En résumé, voici ce que j’ai d’installer pour faire tourner S.A.R.A.H.

 

Ensuite je vous conseille fortement de configurer la reconnaissance vocale de Windows 7  pour être sur que tout fonctionne correctement.

http://windows.microsoft.com/fr-fr/windows7/set-up-speech-recognition

Ne reste qu’a récupérer le programme S.AR.A.H

Dézipper le (j’ai tout mis dans c:\sarah).

- Installer la voix française « Virginie » inclus dans le répertoire README/ScanSoftTTS
(je vous conseille d’ailleurs de régler la voix de synthèse vocale dans les paramètres Windows http://windows.microsoft.com/fr-fr/windows7/setting-speech-options )

Puis lancer le WSRNode.bat

Si vous n’avez pas autant de plugins qui se lance, rassurez vous, cela s’installe après

Puis le WSRMicro.bat (si comme moi vous n’avez qu’un micro, sinon le WSRKinect.bat si vous avez la kinect).

L’icône d’une petite maison doit apparaître dans la barre des tâches et si vous faites un clic droit dessus, vous pouvez lancer « Sentinel » qui permet de visualiser en direct les logs du programmes.

A vous de jouer maintenant pour essayer S.A.R.A.H en testant le plugin « time » déjà inclus :

Dites « Sarah, quelle heure est-il ? » et elle devrait vous donner l’heure :D Magique non ?

Si cela ne fonctionne pas, regarder ce qui défile dans la console Sentinel, cela devrait vous aider a débugger. Sachez que le groupe de discussion est là pour vous aider :)

Maintenant que cela fonctionne, vous pouvez ajouter des plugins via l’interface web (http://127.0.0.1:8080), dans le « Store ».
Ces plugins s’installeront dans le répertoire « plugins » (dingue, non) et leur structure est toute simple.

Nous allons donc ensemble créer un plugin tout simple qui va me permettre d’interroger S.A.R.A.H pour connaître la température ou le degré d’hygrométrie dans une pièce de la maison.

Toutes les données de mes sondes de températures sont enregistrées dans une base MySQL grâce au client xpl-mysql-logger.
La structure de la table est toute simple :

mysql> desc sensor ;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| idx            | int(11)      | NO   | PRI | NULL    | auto_increment |
| curDate        | date         | YES  |     | NULL    |                |
| curTime        | time         | YES  |     | NULL    |                |
| sensorType     | varchar(10)  | YES  |     | NULL    |                |
| sensorLocation | varchar(255) | YES  |     | NULL    |                |
| sensorValue    | varchar(25)  | YES  |     | NULL    |                |
| sensorUnit     | varchar(25)  | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

Pour interroger cette base de données, on va vite fait s’écrire un Webservice en python :

simplews.py

#!/usr/bin/env python
# Grouik coded by GuiguiAbloc
 
import web, MySQLdb
import re,socket,sys,os
web.config.debug = False
urls = (
'/', 'index',
'/temp/(.*)', 'temp'
)
 
render = web.template.render('templates/', globals={'re':re})
app = web.application(urls, globals())
 
class index:
def GET(self):
return web.HTTPError(403)
def POST(self):
return web.HTTPError(403)
 
class temp:
def GET(self,id):
db = web.database(dbn='mysql', user='sensor', pw='sensor', db='sensor')
todos = db.query("SELECT * from sensor where sensorType=$toto ORDER BY idx DESC limit 1", vars={ 'toto' : id})
for todo in todos:
return todo.sensorValue
 
if __name__ == '__main__':
app.run()

Ne reste qu’a le lancer en spécificant le port d’écoute:

python simplews.py 8085

et une simple requête http du type :

http://serveur;8085/temp/TempSalon interrogera la base de données et vous retournera la valeur associée à l’entrée TempSalon :

$ curl http://serveur:8085/temp/TempSalon
20.7
 
# python simplews.py 8085
http://0.0.0.0:8085/
192.168.0.10:58311 - - [10/Mar/2013 17:30:49] "HTTP/1.1 GET /temp/TempSalon" - 200 OK

Maintenant que nous avons un webservice, écrivons un petit plugin pour S.A.R.A.H.

Dans c:\sarah\plugins, nous allons créer le répertoire « temperature ».

Ce répertoire contiendra 3 fichiers :

temperature.prop (qui est le descriptif du plugin)

{
"modules" : {
"temperature":     {
"description": "Lit des infos provenant de la bdd",
"version"    : "0.1",
"api_url"    : "http://serveur:8085/temp"
}
}
}

temperature.js (qui est le script js qu’exécutera S.A.R.A.H)

exports.action = function(data, callback, config){
 
// Retrieve config
config = config.modules.temperature;
if (!config.api_url){
console.log("Missing temperature config");
return;
}
 
console.log("temperature config complete");
var periphId;
if (data.room == "salon") {
var place = "le salon";
if (data.type == "T") {
var mesure = "la température";
periphId = "TempSalon";
}
}
 
if (data.room == "dehors") {
var place = "le jardin";
if (data.type == "T") {
var mesure = "la température";
periphId = "TempExt";
}
if (data.type == "H") {
var mesure = "le taux d'humidité";
periphId = "HygroExt";
}
}
 
// Build URL
var url = config.api_url;
url += '/'+periphId;
 
console.log('URL:' + url);
 
// Send Request
var request = require('request');
request({ 'uri' : url }, function (err, response, body){
 
if (err || response.statusCode != 200) {
callback({'tts': "Désolé , je ne parviens pas récupérer  " + mesure + "dans " + place});
 
return;
}
// Callback with TTS
console.log("Page : " + body);
console.log(data.type + " : " +body);
var value = body;
callback({'tts': mesure + " est de " + value + data.unit + " dans " + place});
});
}

Et enfin, le temperature.xml qui configure les phrases sur lesquelles S.A.R.A.H. doit réagir :

<grammar version="1.0" xml:lang="fr-FR" mode="voice" root="ruletemperature" xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
  <rule id="ruletemperature" scope="public">
 
<example>Sarah combien fait-il dans le salon</example>
    <tag>out.action=new Object(); </tag>
    <item weight="2">Sarah</item>
    <one-of>
<item>Quelle est la temperature dans out.action.type="T"out.action.unit="degrés"
</tag></item>
<item>Quelle est la temperature out.action.type="T"out.action.unit="degrés"
</tag></item>
<item>Combien fait-il dans out.action.type="T"out.action.unit="degrés"
</tag></item>
<item>Combien fait-il out.action.type="T"out.action.unit="degrés"
</tag></item>
<item>Quel est le taux d'humidité out.action.type="H"out.action.unit="pourcents"
</tag></item>
<item>Quelle est l'humidité out.action.type="H"out.action.unit="pourcents"
</tag></item>
<item>Quelle est l'hygrométrie out.action.type="H"out.action.unit="pourcents"
</tag></item>
 
</one-of>
    <one-of>
 
<item>le salonout.action.room="salon"
</tag></item>
<item>dehorsout.action.room="dehors"
</tag></item>
</one-of>
<tag>out.action._attributes.tts="Je regarde tout de suite";
</tag>
<tag>out.action._attributes.uri="http://127.0.0.1:8080/sarah/temperature";
</tag>
</rule>
</grammar>

Vraiment tout simple non ?

Pour vous donner un aperçu de ce que cela donne, je vous colle une petite vidéo vite faite :)


Démonstration S.A.R.A.H. par Guiguiabloc

Bref un excellent projet, qui fonctionne parfaitement et je compte continuer mes expérimentations avec une Kinect, histoire de voir ce que cela donne :D

Amusez-vous bien :D

Ce billet a été posté dans domotique et taggé , . Bookmark ce permalink.

15 commentaires sur “S.A.R.A.H. , Contrôler votre domotique autrement

  1. Passionnant. Excellent billet vraiment.

    Mais tu devrai avoir honte de donner envie à des gars comme moi de ré-installer un windows :p

    Après, entre utiliser les API de google et envoyer notre voix sur leurs serveurs, ou mettre en place du propriétaire en local…

    Sachant que la il n’y a « que » l’OS qui est propriétaire, car tu as oublié de signaler que Sarah est sous licence WTFPL (Do What The Fuck You Want To Public License), ce qui n’est pas rien ! (Immense merci à l’auteur)

    Un jour…. Si j’ai le courage… moi aussi j’aurai ma sarah :)

  2. Le plus fort dans tout ça, c’est qu’Android le fait très bien, et me semble t’il, qu’il le fait en mode offline (pas en mode cloud, comme certains semble le faire). Et que je sache Android et open-source. Il doit donc avoir moyen de récupérer le code ?

  3. Android fait de la reconnaissance vocale en offline ??? C’est nouveau ? Jamais vu ca perso, si tu as une piste/lien, je suis preneur.
    Si tu trouves un moyen de configurer des evenements (post/get) suivant la phrase dictée sous Android, sans accès internet, je suis très curieux de savoir comment ?
    Pour le moment je le fais avec Tasker et google, mais le temps de traitement n’a rien a voir avec S.A.R.A.H

  4. Bonjour je n’arrive pas à passer la langue en français, sarah parle en anglais
    avez vous une idée pour corriger ce problème ?

    cdlt

  5. Salut,

    Merci pour l’aide pour installer ce qu’il faut pour la Kinect car j’ai bien galéré…
    Pourrais-tu préciser dans ton billet qu’il faut bien installer les versions « x64″ de SDK Microsoft Speech Platform et Speech Platform Runtime pour les versions 64bits de Windows 7 stp ?

  6. Pas de soucis même si cela me parait carrément évident d’installer des packages 64bits pour un système 64 bits ^^
    ;)

  7. Salut et merci pour ce tuto qui manque en effet sur le site de Jean-Philippe :)
    J’ai une question concernant la kinect, j’ai cru comprendre que la version qu’on trouve sur le bon coin pour xbox n’est pas suffisante ? Qu’il manque un câble ou un truc du genre ?
    Tu peux nous en dire plus ?
    Merci d’avance.
    Nico33

  8. Salut Nico33,
    En fait il te faut une kinect avec un adaptateur USB alimenté. J’ai acheté la mienne sur ebay et cet adaptateur était livré avec, donc ca dépend du modèle vendu (et du vendeur) (je crois que les kinect vendu avec les xbox n’ont pas cette adaptateur, par contre quand tu achetes la kinect toute seule, tu as cette apadateur avec).
    Mais pas d’inquiétudes, l’adaptateur usb alimenté pour kinect se vend aussi à l’unité.

  9. Bonjour,

    je voudrais bien utiliser votre tuto, mais, sauf erreur de ma part, le fichier température.xml, ne contient plus aucun tag XML.
    J’ai essayé avec différents browser au cas ou.

    Pouvez vous le mettre a disposition complétement ?

    Merci

    Olivier

  10. bonsoir , impossible de sélectionner la langue francaise sur win 7 64 bits auriez vous une idée ?

  11. Bonjour a tous , alors même si la réponse a la question de HUB

    et un peut trop tare cela pourra servir a d’autre.

    Alors pour mettre la voix de Virginie sur Windows 7 64 bits on

    procède de cette façon.

    Aller dans le répertoire : Windows\sysWOW64\speech\SpeechUX\
    Double-cliquer sur le fichier « SAPI.cpl »
    Sélectionner « Voix de Virginie » (ScanSoft Virginie_Dri40_16kHz)
    Tester la voix et régler la vitesse
    Cliquer sur « OK »

    Voilà.

  12. J’en avais entendu parler mais pas aussi bien expliqué ! merci !