jeudi 24 mars 2011

Software : Et si on faisait parler notre futur système domotique ?

    L'idée est de rendre communiquant le système, même lorsque l'on est pas devant son écran, portable ...
Donc se faire prévenir par le système que quelqu'un est entré dans l'allée, ou encore qu'un pic de consommation électrique est anormal, tout cela peut nous intéresser.

Je me suis essayé à plusieurs, des softs gratuits avec du copier /coller, des utilitaires en mode ligne de commande, le tts virginie de windows .... bref, toujours à passer par un logiciel tiers à installer sur le PC.

Je suis donc allé voir chez Google et leurs magnifiques services web, et je suis tombé sur Google Translation


Avec une simple URL, on peut se faire dicter du texte dans toutes les langues.


Avantage :


                 Une phonétique plus que séduisante ;)
                 Pas de logiciel à installer en local.
                 Rapide.
                 Choix dans les langues.


Inconvénient : 


                 Connection Internet requise pour traduire.




Allez on y va .... Google Traduction en 1 minute 
Je veux écouter le texte "Monsieur, vous prendrez bien un verre de whisky ! "
Rien de plus simple : faites un copier/coller de cette url dans votre navigateur préféré (N'oubliez pas le son !)

http://translate.google.fr/translate_tts?q=Monsieur, vous prendrez bien un verre de whisky


Pour faire du speech en anglais, il faut ajouter un paramètre dans la request :
Ex : 


http://translate.google.fr/translate_tts?tl=en?q=Baboons are eating some bananas


tl=en pour anglais
tl=fr pour français.
tl=es pour espagnol ...


Implémentation dans le code java :


J'ai donc créé un JDBManager ( qui permet d'ajouter des logs, infos, installation, warning et talk) talk permet non seulement d'écrire dans le journal de bord mais en plus d'appeler un autre manager VocalManager qui va se charger d'aller chercher la traduction de code (Enum) à traduire. Ce dernier se base sur un paramètre la locale de notre application (le multilinguisme est prévu). 

Dans le JDBManager , on a donc la méthode talk qui reçoit en paramètre la classe voulant "talker", un code I18N pour le message, et une liste de paramètres (Au passage fonctionnalité JAVA5)
On pourrait donc passer un message du type 'startSystem %s in %s', new Date(), new Home()
rappel le code passé en paramètre est purement une clé, elle sera traduite à l'aide de notre table i18n lorsqu'on voudra consulter le JDB ou lorsque l'on veut faire parler notre système.

voyons voir la méthode talk du vocalManager :


1. On commence par récupérer dans la table des paramètres la locale (par défaut fr_FR si non renseignée) J'utilise une Enum qui est exploitée dans le parameterManager, Exemple de l'Enum, la valeur par défaut est fournie dans le constructeur.

2.On récupère la traduction du code à annoncer. Si le code n'est pas trouvé dans la table i18n, on retournera le code fourni en entrée.

3.On récupère ensuit le service Google dans les paramètres, il est possible d'utiliser un autre service, dans ce cas on mettra un enregistrement dans la table de paramètre avec comme clé googleSpeech. Par défaut c'est donc notre translate.google.... à notre dans cette url par défaut un %s juste après tl, ce % sera substitué par la locale récupérée.

4.On utilise l'API Apache HttpClient, pour contruire notre requête. ne pas oubliez le User-Agent à positionner ici par défaut à Mozilla, sinon vous allez avoir un belle erreur 403 Forbidden.
Au passage les snippets à ajouter dans le pom :

  <dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.1</version>
</dependency>
<dependency>
<groupId>httpcomponents-httpcore</groupId>
<artifactId>jakarta-httpcore</artifactId>
<version>4.0-alpha2</version>
</dependency>


5. Enfin, on éxecute notre requête et on récupère un InputStream qui sera consommé par un Player MP3 récupéré également à l'aide de ce snippet, et c'est tout !

<dependency>
<groupId>de.huxhorn.sulky</groupId>
<artifactId>de.huxhorn.sulky.3rdparty.jlayer</artifactId>
<version>1.0</version>
</dependency>


Une capture de la table de notre JDB :


Et notre table I18N : 


qui contient une clé i18n, une locale et une traduction.


Notre table des paramètres : 




Et vouala, nos futurs managers (Light, Temperature, Consommation) auront à portée de main ce vocalManager en cas de message à faire passer.

Promis j'attaque la prochaine fois un manager Domotique (RFXCOM, ARDUINO ,...)

1 commentaire:

  1. hello, on pourrait échanger sur le sujet, je travaille en parallèle sur des solutions de reconaissance vocale...

    RépondreSupprimer