2 Commentaires

SARAH: Microphone pour The Voice

thevoice

Dans cet article j’ai fais l’exercice d’enregistrer ma voix avec différents périphériques.
Dans le cadre du projet SARAH, la question qui revient toujours sur le tapis est:

  • Est ce qu’un Kinect est vraiment meilleur ?
  • Est ce que le Voice Tracker II est meilleur ?

Les enregistrements ont été réalisés avec Audacity Portable puis compressés en MP3. J’ai Spotify qui tourne en musique de fond.

Lire la Suite »

Poster un commentaire

SARAH gagne quelques Neurones (2/2)


Cet article fait suite à l’article précédent SARAH gagne quelques Neurones (1/2)

Eedomus 2.0

Pour interroger le capteur de luminosité j’ai mis à jour le plugin Eedomus en v2.0. Il est maintenant possible de lire ou modifier des périphériques de la box.

exports.action = function(data, callback, config, SARAH){

  SARAH.call('eedomus', { 'periphId' : LUMENS}, function(options){
    var lumens = options.json.last_value;
    ...
    scenario(state, callback, SARAH); 
  });
}

La méthode SARAH.call est une version simplifiée de SARAH.run qui sera disponible en v2.9

Algorithmique

Le plugin scenario peut prendre 2 états: 1 Allumer et 0 Éteindre les lampes de la pièce.

var scenario= function(state, callback, SARAH){
  var tts = '';

  if (state == 1){
    lights(BUREAU, true, SARAH);
    lights(SALON,  true, SARAH);
    tts = 'Bonjour';
  } 
  else {
    lights(BUREAU, false, SARAH);
    lights(SALON,  false, SARAH);
    tts = 'Aurevoir';
  }
  
  callback({'tts': tts});
}

Learn

Le plugin scenario peut être appelé avec un paramètre learn pour apprendre le comportement.

  • Calendrier: learn=false
  • Mouvement: learn=false
  • Reconnaissance vocale: learn=true
  • QR Code: learn=true

Subtilités

1. Les ordres d’éteindre sont toujours exécutés indépendamment de la luminosité:

  • Je vais me coucher: c’est explicite on va pas négocier
  • Je ne suis pas là: il faut faire des économies d’énergie

2. Le temps est très important ! On peut éteindre ou allumer pour des raisons de luminosité mais aussi d’heure de la journée.

  set.push({'input': {l: lum/100, t: minutes() }, 'output': {s: state}});

Typiquement je vais me coucher, j’éteint explicitement, le réseau apprends mais ce n’est pas lié à la luminosité.

Code

Le code s’initialise avec un set de valeurs prédéterminées.

var brain  = require('./lib/brain');
var set    = [{'input': {l: 100/100, t: 0}, 'output': {s: 0}},
              {'input': {l:   0/100, t: 0}, 'output': {s: 1}}];

var net    = new brain.NeuralNetwork();
    net.train(set);    

La fonction compute() se charge d’améliorer le set et relancer l’apprentissage.
La librairie brain.js impose de refaire tout l’apprentissage. Cela pourrait poser des problèmes de perfs à terme.

var compute = function(learn, state, lum){
  if (learn){
    set.push({'input': {l: lum/100, t: minutes() }, 'output': {s: state}});
    net.train(set);
    return state;
  }
  
  // Guess only for switch 'on'. Not 'off'
  if (state == 1){ 
    return Math.round(net.run({l: lum/100, t: minutes() }).s);
  }
  return state;
}

La fonction minutes() retourne le nombre de minutes écoulées dans la journée.

Sauvegarde du réseau

Au moment de l’apprentissage il faut enregistrer l’ensemble des données:

if (learn){
  fs.writeFileSync(file, JSON.stringify(set), 'utf8');
}

Au chargement du plugin il faut relire le réseau:

if (fs.existsSync(file)){
  set = JSON.parse(fs.readFileSync(file,'utf8'));
}
net.train(set); 

 

Conclusion

Lors d’un mouvement, l’algo détermine en fonction de l’heure et de la luminosité si il faut vraiment allumer les lampes.

Action Apprendre ? Raisonner ?
Mouvement Non Oui
Plus de Mvt Non Non
Vocale On Oui Non
Vocale Off Oui Non

Si SARAH allume alors que ce n’est pas nécessaire. Pour lui apprendre je dois éteindre explicitement.

Mais comme le remarque Giom, SARAH va apprendre qu’il faut éteindre pour (Luminosité + Lampe) alors qu’elle devrait apprendre de ne pas allumer pour (Luminosité)

Il faudra peut-être mémoriser l’état N-1 pendant X minutes. Le code est ici: http://jsfiddle.net/jpencausse/Ukj3t/

Poster un commentaire

SARAH: modules avancés

Cet article fait suite à "Mon premier module" pour préciser des points de développement avancés.

Lancer un plugin

Une bonne pratique est de créer un plugin perso qui va utiliser et appeler des modules génériques: box domotique, service web, …

Cet appel pourra se faire via le moteur de règles ou directement depuis le code:

var lights = function(id, on, SARAH){
  SARAH.run('eedomus', { 'periphId' : id , 'periphValue' : (on?100:0), 'quiet' : true  });
}

var scenario = function(state, callback, SARAH){
  var tts = '';

  if (state == 1){
    lights(BUREAU, true, SARAH);
    lights(SALON,  true, SARAH);
    tts = 'Bonjour';
  } 
  else {
    lights(BUREAU, false, SARAH);
    lights(SALON,  false, SARAH);
    tts = 'Aurevoir';
  }
  
  callback({'tts': tts});
}

Ces appels vont déclencher toute la mécanique du moteur de règles. Dans la version 2.9 il est possible de n’appeler QUE le script et récupérer sa réponse:

SARAH.call('eedomus', { 'periphId' : LUMENS}, function(options){
  var lum = options.json.last_value;
  scenario(lum>50?1:0, callback, SARAH); 
});

Dans cet exemple le code appel le plugin Eedomus v2.0 pour obtenir l’état d’un capteur de luminosité afin de décider si il faut allumer ou éteindre les lampes.

Libraries installées

Les NodeJS, PhantomJS, et ExpressJS installés sont complètement standard. Des librairies supplémentaires sont installées dans script/vendor/:

  • cheerio (pour parser du HTML)
  • moment (pour manipuler des dates)
  • request (pour envoyer des requêtes)

Ainsi que plusieurs librairies bas niveau pour envoyer des mails, parser du RSS, etc,…

Ajouter une librairie

  1. Créer un répertoire plugins/{monplugin}/lib
  2. Ouvrir une commande DOS dans la release
  3. Faire NodeJS\npm install {librarie}
  4. Copier le contenu du répertoire créé node_modules dans plugins/{monplugin}/lib
  5. Dans un plugin.js la librairie est maintenant dispo via require(‘./lib/{librarie}’)
3 Commentaires

PlaySurface at Home !

I just received and mount my PlaysSurface from KickStarter’s project ! According to to Michael White I’m the only one in France :-) . Shipping was more expensive than product itself ! I’m fool !

Some photos !

The fabric is very good, mouting was easy. I do not like the back door that lay on the ground. Not very convenient to calibrate projector. The plexiglass seems to be very delicate and get all bread crum.

 

Lire la Suite »

Un commentaire

SARAH en pleine action !

Un énorme MERCI à Jérôme VEYRET qui vient de mettre en ligne une vidéo de SARAH en pleine action à son domicile.

Quelques détails:

C’est un mini PC qui embarque Homeseer , Sarah, et xbmc. Homeseer communique avec HSTouch (application homeseer dédié "supervision") et avec des IPX800-V3 (CGE Électronique: c’est français) pour le contrôle/commande électrique.

Sinon, oui, la kinect fait vraiment la différence! Mais son emplacement est stratégique, et je cherche encore la bonne place! Lol

Suivre

Recevez les nouvelles publications par mail.

Joignez-vous à 549 followers