Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Aurélien GALTIER

The dark world of .Net

Kinect + Speech Recognition + Eedomus = Dommy

Dommy c'est quoi ?

Il y a quelque temps j'ai voulus faire un peu de domotique. Contrôler la lumière, le chauffage, et bien d'autre chose à distance.

J'ai donc acheté une box Eedomus (http://www.eedomus.com/fr/). C'est une box de domotique française et très bien pensée. Cette box utilise le protocole Zwave sans fil pour transmettre ces ordres à différents composants dans la maison. Ces composants peuvent être un micro module derrière un interrupteur, un capteur de présence, de température, …

Mais voilà utiliser son smartphone pour allumer la lumière ce n’était pas suffisant. Pourquoi ne pas brancher la Kinect et faire de la reconnaissance vocale ?

J'ai donc développé Dommy une application qui permet de faire de la reconnaissance vocale et exécuter des scenarios. Le nom Dommy est une référence à la B.D. Travis dans laquelle une intelligence artificielle (Dommy) contrôle toute la maison.

Et c'est là que cela devient intéressant. D'un petit programme j'ai maintenant une solution complexe. http://dommy.codeplex.com/

 

Comment cela marche ?

En trois grandes parties :

- Listeners : Qui écoute sur différentes sources (Audio, REST, UIRT, Kinect Skeleton, …)

- Un moteur de scénarios : Qui permet de décrire des scénarios plus ou moins complexe (Utilisation de Roslyn)

- Des actions : Déclenchements d'actions (API Eedomus, API Samsung, …)

Et pour lier tous cela j'utilise Ninject.

Le cœur de mon application c'est la class Engine dans la méthode "Init" elle va :

- Lire tous les scripts.

- Initialiser tous les listeners.

- Construire les scénarios lus dans les scripts.

- Initialiser les scénarios.

- Démarrer tous les listeners.

 

Pourquoi Kinect ?

Parceque c'est fun. Non ce n’est pas la bonne réponse. Kinect parce que c'est un Microphone Array http://en.wikipedia.org/wiki/Microphone_array

En pratique il permet d'isoler les voix et de supprimer les bruits parasitaires. De plus le SDK Speech Recognition associé est l'une des dernières versions de chez Microsoft que l'on peut utiliser dans nos applications. (A pars Bing Speech qui ne marche que dans les applications WP8 et W8)

Et plus tard je compte rajouter la détection de mouvement, QRCode, …

 

Et maintenant

D'un côté on a Kinect de l'autre une box domotique avec une API la plus simple possible. Une requête HTTP pour exécuter une action. (Exemple allumer la lumière)

La première version de l'application était très simple. Mes scénarios étaient codés en dure dans le code. Mais j'ai voulue abstraire un peu tous cela.

Contraintes que je me suis fixé :

- Mes scénarios sont fortement typés

- Je peux les créées sans recompiler l'application

- Le déploiement des scenarios se fais par copier/coller.

Et c'est là que j'ai eu l'idée d'utiliser Roslyn.

Avec Roslyn rien de plus facile pour exécuter un fichier de code.

   1: var engine = new Roslyn.Scripting.CSharp.ScriptEngine();
   2: engine.AddReference("System.Core");
   3: var session = engine.CreateSession(this);
   4: session.SetReferenceSearchPaths(Environment.CurrentDirectory);
   5: session.ExecuteFile(file);

Jusque l'à il y a rien de bien compliqué. Sauf que : Comment je vais décrire des scénarios ?

La syntaxe des scénarios

Souvent quand je ne sais pas comment démarrer le développement je me dis : qu'est-ce que je veux écrire comme code à la fin ?

Dans un premier temps il faut créer le scenario. Facile :

   1: Scenario.Create()

Ensuite un scenario sa doit démarrer sur un déclencheur :

   1: Scenario.Create()
   2:  .SpeechTrigger("redemarre")

Mon scenario va se déclencher sur un SpeechTrigger. Lorsque l'application entendra "redemarre" alors j'exécute le code. Mais quel code ?

C'est là que j'ai quelque actions toutes faite dont une : .Say()

   1: Scenario.Create()
   2:  .SpeechTrigger("redemarre")
   3:  .Say("Redémarage", "Je redémare", "a dans 2 secondes")

Ce qui aura pour effet de prendre aléatoirement une des phrases en paramètre et de la lire vocalement grâce au TextToSpeech.

Et pour terminer le code de mon scénario est :

   1: Scenario.Create()
   2:  .SpeechTrigger("redemarre")
   3:  .Say("Redémarage", "Je redémare", "a dans 2 secondes")
   4:  .Action(() =>
   5:  {
   6:     Application.Restart();     
   7:     Environment.Exit(0);
   8:      return true;
   9:  })
  10:  .Start();

Le start c'est pour indiquer à l'environnement d'exécution d'ajouter le scenario dans la liste des scenarios à exécuter.

Maintenant quand mon application entend "Dommy redemarre" alors l'application redémarre.

 

Et après ?

Maintenant que j'ai un moteur je vais pouvoir ajouter des scénarios. Et un scénario que j'utilise régulièrement c'est :

   1: Scenario.Create("Je pars")
   2: .SpeechTrigger("je pars", "je m'envais")
   3: .UsbUirtTrigger("261236020F0")
   4: .Say("Je ferme la maison", "A plus", "A bientôt")
   5: .EedomusOnOff("902331", false) // Eteint la lumière
   6: .EedomusOnOff("834522", false) // Ferme le volet
   7: .TVCommand(TVCommand.PowerOff)
   8: .UsbUirt(irOffVentilo)
   9: .Start();

A la final quand je pars de chez moi je dis "dommy je pars" et à ce moment-là Dommy :

- Me dis "a plus"

- Eteint la lumière du salon (bientôt tous l'appartement)

- Ferme le volet de la salle

- Eteint la télévision

- Eteint le ventilateur en simulant la commande infra rouge.

Et si je ne veux pas parler je peux prendre une vielle télécommande infra rouge qui me permet de déclencher le même scénario grâce au UsbUirtTrigger. Qui s’inscrit sur le listener infra rouge.

 

Mais finalement à quoi ça sert ?

Ce projet n'a pas d'autre but que d'être un projet gadget ! Je rajoute d’autres fonctionnalités au fur et à mesure de mes idées et envies :

- Ajout de la Kinect 2.0

- Multi langues

- Je développe une interface web de contrôle et de suivis de Dommy qui je l'espère un jour ressemblera à cela :

image

- …

 

En résumer beaucoup de boulot pour éteindre la lumière.

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mercredi 16 avril 2014 17:17 par agaltier

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01