Christophe Nowicki

October 27, 2009

Reconnaissance vocale sous GNU/Linux et domotique

L’objectif de cet article est de décrire mon avancement sur le système de reconnaissance vocale dans mon installation domotique. En effet, pour mon usage personnel, j’ai mis au point un chatterbot pour contrôler de manière intuitive l’appartement.
Cette technologie permet de tenir une discutions intuitive avec une maison intelligente pour lui faire exécuter des ordres. (allez Stanley, tu t’es seulement planter de 10 ans ;-) ) :

Moi>Alfred?
Alfred>Oui, monsieur.
Moi>Allume la lumière du salon.
-- run xpl-sender -c x10.basic command=on device=a3
Alfred>C'est fait.

Le nom du bot est un hommage à Alfred Pennyworth. Allons faire un petit tour dans les entrailles de la batcave ;-)

Définition du besoin

L’accumulation des télécommandes sur mon installation domotique, fait chuter mon WAF de manière dramatique.
En effet, pour regarder une chaîne de télévision ou allumer la lumière.
Il est nécessaire d’utiliser deux ou trois télécommandes différentes.
Naviguer dans des interfaces, etc…
Bref, pour des technologies donc l’objectif est d’améliorer la qualité de vie et rendre les taches quotidienne plus facile, j’avais un gros problème ;-)
Après un petite discussion et une mise au point avec ma moitié, j’ai réussi à vendre la solution de contrôle par la voix.
Belle connerie me voilà parti dans un domaine que je ne connais pas ;-)

Première Approche

Je lance une boue à la mer sur le forum “toute la domotique”.

Visiblement, je ne suis pas le seul à chercher ce genre de fonctionnalité. Actuellement, nous avons dans le domaine :

  • l’abominable HomeSeer qui fonctionne très mal en Anglais à l’aide de l’interface de reconnaissance vocale inclue dans Microsoft Windows et la SAPI ;
  • Rien de spécifique à la domotique sous GNU/Linux, mais une belle galaxie de programmes dans le domaine.

Le choix du microphone

Ma petite dame voulais parler librement sans aucune contrainte et il n’étais pas question de l’équiper d’un microphone.
J’ai donc cherché une solution qui permet de capter la parole dans une pièce sans microphone sur la personne.
La solution magique s’appelle la technique du Microphone array.
Le principe est très simple, mettre en commun plusieurs microphones reliés à un DSP qui permet de faire le traitement du signal en fonction de l’orientation physique des microphones.
J’ai donc proposé de mettre en place chez moi le LOUD (non ce n’est pas un radiateur ;-) ).
Bon vous vous doutez bien que lorsque j’ai proposé la solution du LOUD, j’ai faillit passer par la fenêtre ;-)

microphone_array Heureusement, il existe des solutions plus simples telles que le Voice Tracker de chez Acoustic Magic.

Celui-ci permet de capter la parole dans une pièce, retraite le signal et permet d’obtenir sur une prise Jack classique la voix et rien que la voix dans une pièce.
Magique ;-)

Je peux parler le dos tourner au microphone dans une pièce de 20m^2 et l’ordinateur capte ma voix de manière impressionnante ;-)

Le logiciel de reconnaissance vocale

Il y a principalement deux solutions dans le domaine sous GNU/Linux :

  • Le projet CMU Sphinx avec PocketSphinx, Sphinx-[234], etc…
  • Julius, Open-Source Large Vocabulary CSR Engine Julius.

Sur ces deux moteurs de reconnaissance vocale, reposent de nombreux Dialog Manager, qui permettent d’exploiter le moteurs pour faire de la téléphonie, de contrôle vocale, etc…

Ma méthode

Soyons claire, je ne suis pas un expert en reconnaissance vocale et ce domaine est vraiment très difficile d’accès et nécessite la compréhension de nombreuses notions.
J’ai donc adopté la technique EPITECH : c’est à dire faire en sorte que cela fonctionne. ( sans comprendre tout le contexte ;-) )

Un bon informaticien est un informaticien feignant

Pour faire fonctionner Julius, il est nécessaire de lire à haute voix de nombreux mots pour enregistrer les différents phonèmes qui les composent. Afin de créer un Modèle de Markov caché exploitable par le logiciel.
Voici donc comment je m’y suis pris pour éviter cette phase fastidieuse du projet.

Utilisation d’un logiciel de synthèse vocale

1 ère approche une solution assez “laide“, qui consiste à faire lire ces mots par un logiciel de synthèse vocale comme eSpeak. Mais le résultat n’était pas très bon.

Utilisation d’une collection d’enregistrement audio

J’ai par la suite découvert le projet Shtooka, qui est une collection audio libre de mots français.
Tous les termes liés à la domotique ne sont pas disponible dans le projet mais il est très facile d’ajouter ces termes à sa base de données locale.

Conversion texte vers Phonème

Une des étapes de l’apprentissage de Julius est la conversion du texte en Phonèmes, pour résoudre ce problème, j’ai utilisé l’option -X de eSpeak dont voici un exemple de sortie :

$espeak -v fr -q -X "lumière"
Translate 'lumière'
  1     l        [l]

  1     u        [y]

  1     m        [m]

 21     i (A     [j]
  1     i        [i]

 43     è       [E]

  1     r        [r]

 22     e (_     []
  1     e        [@]

 lymj'Er

Un peu de glu

Pour faire fonctionner tout ces éléments ensemble, je me suis fait un script Perl (très sale pour le moment) permettant de réaliser automatiquement toutes ces étapes :

  • analyse des questions posées au robot ;
  • la conversion des mots en phonèmes ;
  • la diction des mots ;
  • la création du modèle accoustique.

Il s’agit de l’automatisation de toutes les étapes de la création d’un modèle acoustique du projet VoxForge.

Les travaux en cours

Mon projet est disponible à cette adresse : Alfred
Il est en cours de développement mais pour l’instant il est possible de donner des ordres simples.

J’utilise RiveScript pour la définition des tâches et de la conversation. Ce langage de chatbot est plus puissant que AIML. Car il permet d’inclure du code Perl assez puissant dans le code de la conversation. Voici un exemple :
$ more lib/Alfred/languages/en/x10.rs
+ switch * on
- do you want me to switch <star> on?
+ yes
% do you want me to switch * on
- <call>xpl_x10_send_on <botstar></botstar></call>

$more lib/Alfred/modules/x10.rs
> object xpl_x10_send_on perl
my ($obj,$method,@args) = @_;
$obj->{'xpl'}->send(
message_type => 'xpl-cmnd', class => 'x10.basic',
body => { command => 'on', device => 'a3' });
< object

Un petit appel à contribution

J'aurais gagné énormément de temps si le projet VoxForge avait reçu plus de contribution de la part des utilisateurs francophones.

En effet, il n'y a pas assez de contribution pour pouvoir faire un modèle accoustique en Français.
Cela permettra de disposer d'un système de reconnaissance vocale libre en Français.
Ce qui intéresse beaucoup de monde à mon avis ;-)
C'est donc un petit appel à contribution aux projets VoxForge et Shtooka.

Références intéressantes

October 23, 2009

Smart by “accident”

Despite The title, This weblog entry is in French. I’m deeply sorry for beening too lazy ;-)

Je viens de finir la lecture de l’étude suivante :
A Spotlight on Security and Privacy Risks with Future Household Robots: Attacks and Lessons.

Celui-ci parle des risques et de la sécurité liés aux robots ménagers (je crois que c’est pas le bon lien ;-) ).

Pour résumer rapidement l’article, celui-ci a évalué le niveau de sécurité des robots : Rovio, Spykee et RoboSapien V2.
Le résultat est une véritable catastrophe d’un point de vue de la sécurité :

  • des connexions sans fil, pas ou faiblement sécurisées ;
  • non chiffrement des informations d’authentification ;
  • apparition de nouvelles attaques.

Mais ce dont j’aimerais vous parler est l’idée que soulève les auteurs au début du document:

both thoses that we encountered and those that we foresee can be attributed partly to the fact that the home is becoming “accidentally” smart and that there is no dedicated, trained system administrator for the home environment.

Je vais dans ce billet illustré cette idée et me permettre de réfléchir à haute voix.

The incoming smart^Wobject

Ils sont minions, petits ou grands, utiles ou futiles.
ils s’appellent Roomba, Nabaztag ou Freebox.
Ils sont arrivés dans nos maisons progressivement.
Et les meilleurs pointent bientôt leur nez ;-)
Ils mettent en place progressivement le paradigme de l’Internet des objets et de l’Intelligence ambiante.

Early adopters

La cible 1ére de ses technologies sont les Geek, ce sont les seuls capables d’adopter ces technologies, d’accepter les problèmes liés à leur jeune âge et de les exploiter.

Les Geeks ont généralement les compétences nécessaires pour comprendre le fonctionnement de ces nouveaux objets.

Mainstream and Mrs. Michu

Ces objets arrivent progressivement chez Madame Michu et c’est la que cela devient intéressant.

Freebox

Commençons par la Freebox, voulez-vous. Car je trouve que c’est l un des meilleurs exemples d’intelligence accidentelle.

Des millions de foyers français ont reçus avec leur abonnement Internet une machin-box.
Celle-ci est équipée d’une liaison Wi-Fi qui n’est pas sécurisée, que cela soit en WEP ou WPA.
Du coup ces milliers de foyer se retrouvent propulsés dans le rôle d’un administrateur réseau.
Et s’ils n’ont pas les compétences nécessaires et que leur connexion est usurpée, ils se trouveront privé de leur droit d’accès Internet grâce à la loi HADOPI.

Roomba

Le robot aspirateur Roomba, dispose d’une forte puissance et il est capable de faire des dégâts important dans une maison si la pièce n’est pas préparée pour son passage.
Le mien dispose en plus d’une connexion Bluetooth dont je doute sérieusement du niveau de sécurité compte-tenu de la complexité du protocole.
Avec une bonne dose de Fuzzing, je pense qu’il est tout à fait envisageable de prendre le contrôle du robot à distance et de me ruiner le salon ;-)

Nabaztag

Continuons avec le Nabaztag.
J’aime beaucoup les lapins, mais je dois avouer que celui-ci me sort particulièrement par les oreilles compte-tenu des problèmes qu’il pose :

  • La connexion Wifi qui pose les mêmes problèmes que la Freebox ;
  • La centralisation, l’ensemble de l’intelligence du lapin se trouve sur les serveurs de Violet, ce qui signifie que si la société fait faillite, alors les lapins mourront ;
  • Ce dernier point soulève de nombreux problèmes liés à la vie privé ;

The rabbit is sad, he wants to hug you

Je suis un des early adopters des ces technologies ( la domotique, la robotique, etc… ).
Mais je trouve que les utilisateurs et les constructeurs ne font pas assez attention aux implications et aux risques liés à ces technologies.

Est-ce que je ne vais pas un peu fort dans les accusations ?

Je pense qu aujourd’hui les histoires de robots qui volent des clés ou qui saccagent une maison peuvent faire sourire.
Mais imaginez les mêmes scénarios dans 5 à 10 ans et nous rigolerons un peu moins.

Mais quel est le principal problème ?

L’internet des objets va être déployé dans un nouvel environnement : votre maison.
C’est à dire un lieu privé, ou la fuite d’information et/ou les risques encourus peuvent avoir des conséquences très importantes.

We need Free hugs, free as software

Je pense que la seule voix possible pour l’Internet des objets est le logiciel libre.

Les points évoqués dans les exemples précédents peuvent être résolu qu’à l’aide de deux méthodes :

  • la formation des utilisateurs ;
  • et l’utilisation de logiciels libres.

Le 1er point est évident, je vais donc développer le second.
Comme le logiciel libre à largement prouvé sa supériorité en matière de sécurité informatique.
Il est donc le seul à pouvoir prétendre une place dans votre vie privé.
C’est la seule solution pour faire adopter ces évolutions.

Il existe aussi une solution basée sur le logiciel propriétaire et des nombreuses lois semblables à HADOPI permettant de cacher ces lacunes en matière de sécurité, mais je n’ai vraiment pas envie d’essayer ;-)

Filed under: Home automation,Robotics — Tags:, , , , — cscm @ 18:54

xPL Automatic Speech Recognition with Julius

I’ve wrote a very small Perl module for interfacing my home automation Speech Recognition Engine based on Julius with the xPL Network.

The goal of this xpl-perl module, is to broadcast recognised speech.

I’ve described the ASR xPL schema on the project forum : ASR.BASIC Schema proposal

You need a working Julius installation running in monitor mode (listening on the network) and an xpl-perl setup.

Here is an sample command output :
$ julius -input file -C julian.jconf
...
Stat: server-client: socket ready as server
///////////////////////////////
/// Module mode ready
/// waiting client at 10500
///////////////////////////////

In others windows, you must run xpl-asr-julius and xpl-logger.
When you speak or send a wav file to Julius, the reconised text is broadcasted on the network :
### read waveform input
enter filename-> test.wav
Stat: adin_file: input speechfile: test.wav
STAT: 180003 samples (3.75 sec.)
STAT: ### speech analysis (waveform -> MFCC)
STAT: 00 _default: 17 generated, 17 pushed, 6 nodes popped in 1123

xpl-logger output :
10.0.0.242:53922 [xpl-trig/asr.basic: bnz-julius.nux -> * - <s> éteindre lumière chambre </s>]

Installation

The setup is very simple on Debian GNU/Linux. Just fallow thoses instructions :
$ wget /wp-content/contrib/xpl-asr-julius/xPL-ASR-Julius-0.01.tar.gz
$ tar xzf xPL-ASR-Julius-0.01.tar.gz
$ dh-make-perl xPL-ASR-Julius-0.01
$ cd xPL-ASR-Julius-0.01
$ dpkg-buildpackage -b
# dpkg -i ../libxpl-asr-julius-perl*.deb

That’s all !

Filed under: Home automation — Tags:, , , — cscm @ 15:26

October 6, 2009

Authentification à l’aide d’un lecteur RFID Phidgets

PhidgetRFID 1023

J’ai découvert les modules Phidgets dans botmag. Il s’agit d’un ensemble de modules électroniques (capteurs, relais, servomoteurs) qui fonctionnent sur la plupart des systèmes d’exploitation et sont programmable à l’aide de nombreux langages.

Je vais décrire dans cet article l’utilisation du Kit RFID pour l’authentification PAM sur une machine Debian GNU/Linux.

Présentation du PhidgetRFID Kit

Spécifications

L’interface lit les badges qui se trouvent à proximité et est équipée de 2 sorties (une commande de Led et une commande de relais). . Elle se raccorde sur un port USB et renvoie le numéro d’identification de badge.
Voici les spécifications du lecteur :

  • Consommation maxi: 100 mA ;
  • Portée (5 à 11 cm) ;
  • Sortie commande TTL ou CMOS (relais) ;
  • Sortie 5 Vcc/250 ohms (pour led) ;
  • Protocole de communication: EM4102 ;
  • Fréquence: 125KHz
  • Échantillonnage: 30 lectures/sec ;
  • Dimensions: 81 x 68 x 16 mm.

Où trouver le kit?

Le Kit est disponible chez :

Installation

Matériel

Rien de spécial, il suffit de brancher le module, et vérifier la détection à l’aide de lsusb :
# lsusb
Bus 002 Device 005: ID 06c2:0031 Phidgets Inc. (formerly GLAB)

Logiciel

L’ensemble des composants Phidgets utilisent un SDK unique, qui fourni une bibliothèque d’accès; dont voici la procédure d’installation :
# cd /usr/src
# wget http://www.phidgets.com/downloads/libraries/Phidgetlinux_2.1.6.20090928.tar.gz
# tar xzvf Phidgetlinux_2.1.6.20090928.tar.gz
# cd Phidgetlinux/phidget21
# make
# make install

Test de fonctionnement du lecteur

La 1ère étape consiste à tester le fonctionnement du lecteur à l’aide du programme mhc_rfid :
# cd /usr/src
# wget http://www.cmatthew.net/mhc_rfid/mhc_rfid.c
# gcc -o mhc_rfid mhc_rfid.c -g -O0 -Wall -lphidget21 -lm
# ./mhc_rfid
Waiting for RFID to be attached....Phidget RFID 2-output 78185 attached!
Output: 0 > State: 0
Output: 1 > State: 0
PhidgetRFID
Serial Number: 78185
Version: 206
# Outputs: 2
Antenna Status: 1
Onboard LED Status: 0
Press any key to start.....
Antenna ON Reading.....
Press any key to end.....
Got: 0107759322
Output: 1 > State: 1
Lost: 0107759322
Output: 1 > State: 0
Closing...

L’identifiant de la carte est 0107759322.

Gestion des droits

Par défaut l’accès aux périphériques USB est limité à l’utilisateur root. Pour donner l’accès à un utilisateur simple. Il faut configurer udev à l’aide du fichier fourni dans le kit de développement :
# cd /usr/src/Phidgetlinux/phidget21/udev
# cp 99-phidgets.rules /etc/udev/rules.d/

Débrancher et rebrancher le lecteur. Vous pourrez ensuite l’utiliser en tant que simple utilisateur.

Configuration de PAM

Pour utiliser ce lecteur comme système d’authentification, il faut installer et configurer un module PAM spécifique : PAM mhcrfid

Installation du module


# apt-get install libpam-dev
# cd /usr/src
# wget http://www.cmatthew.net/pam_mhcrfid/0.1.4/pam_mhcrfid.c
# gcc -Wall -fPIC -c pam_mhcrfid.c
# gcc -shared -o pam_mhcrfid.so pam_mhcrfid.o -lpam -lm -lphidget21
# mv pam_mhcrfid.so /lib/security

Configuration d’un service

Voici un exemple de configuration pour xscreensaver :
$ cat /etc/pam.d/xscreensaver
#
# /etc/pam.d/xscreensaver - PAM behavior for xscreensaver
#
auth sufficient pam_mhcrfid.so

L’utilisateur qui lance le service doit avoir un fichier .authtag contenant l’identifiant du tag :
$ cat -e ~/.authtag
0107759322$

Et voilà ;-)

Conclusion

Le système d’authentification n’est pas très solide, il n’y a aucune protection contre le rejeux et il est possible de sniffer l’identifiant du tag, etc…
Si vous cherchez une solution d’authentification plus forte, il faut regarder du côté du projet OpenPCD.
Mais cela peut être utile et très pratique dans certaines configurations, comme l’accès à certaines ressources de mon réseau domotique ;-)

Filed under: Debian,Do it yourself — Tags:, , — cscm @ 10:28

October 3, 2009

Modules Plugwise dans un reseau xPL

L’objectif de cet article est d’expliquer l’utilisation des modules Plugwise dans un réseau xPL sous Debian GNU/Linux à l’aide du projet xpl-perl.

Présentation de Plugwise

circle plugwise Les modules plugwise sont des prises électriques qui permettent de :

  • Mesurer la consommation électrique d’un appareil ;
  • Éteindre / Allumer un appareil électrique à distance.

Ces prises communiquent entre elles à l’aide d’un réseau ZigBee de type Mesh.

Les spécifications du produit sont :

  • Voltage: 100-240 V~
  • Fréquence: 50 / 60 Hz
  • Puissance maximale: 3680 Watt
  • Courant maximal: 16 A

Elles sont produites par une société Hollandaise et uniquement disponibles dans leur Webshop. (passer la commande en hollandais n’est pas évident ;-) )

Chaque prise coûte environ 35 euros et le kit de démarrage le moins cher est à 150 euros.

Les prises électriques sont de type F, il vous faut donc un adaptateur pour les appareils nécessitant une prise de terre.

J’utilise ces prises dans mon installation domotique, car elles présentent un avantage par rapport aux solutions classiques basées sur le CPL (x10, PLC-BUS, etc… ).

En effet, il est possible d’utiliser ce type de prise sur un onduleur et comme une bonne partie de mon installation est ondulée c’est la seule solution.

Installation du “stick” usb

Voici la procédure pour installer, le stick usb.
Insérerez le module dans le port usb de la machine, il doit apparaître et être reconnu comme un adaptateur série :

$ lsusb
...
Bus 006 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
...
$ dmesg
...
[431159.173232] usb 6-2: FTDI USB Serial Device converter now attached to ttyUSB0
[431159.179407] usb 6-2: New USB device found, idVendor=0403, idProduct=6001
[431159.179459] usb 6-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[431159.180301] usb 6-2: Product: FT232R USB UART
[431159.180301] usb 6-2: Manufacturer: FTDI
[431159.180301] usb 6-2: SerialNumber: A8009iKr
$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 2009-09-22 13:03 /dev/ttyUSB0

Configuration du module xpl-plugwise

Dépendances

Pour faire fonctionner le module vous avez besoin du module perl Digest::CRC :
# apt-get install libdigest-crc-perl

Installation du module

Le module xPL pour Plugwise se trouve directement sur le serveur du projet xpl-perl :
# cd /usr/src
# wget http://www.xpl-perl.org.uk/download/xPL-Plugwise-0.01.tar.gz
# tar xzf xPL-Plugwise-0.01.tar.gz
# dh-make-perl xPL-Plugwise-0.01
# cd xPL-Plugwise-0.01/
# sed -i 's/\$(MAKE) test/#/' debian/rules
# dpkg-buildpackage -b
# dpkg -i ../libxpl-plugwise-perl_0.01-1_all.deb

Lancement

Pour lancer le module, il faut lui préciser l’emplacement du stick USB à l’aide de la ligne de commande :
# xpl-plugwise --verbose --plugwise-verbose --plugwise-tty /dev/ttyUSB0
Listening on 192.168.42.78:34281
Sending on 192.168.42.255

Utilisation

Pour allumer une prise, il suffit d’envoyer l’ordre suivant :
$ xpl-sender -m xpl-cmnd -c plugwise.basic command=on device=3FD8F6
Pour éteindre :
$ xpl-sender -m xpl-cmnd -c plugwise.basic command=off device=3FD8F6
Pour obtenir la consommation de l’appareil sur la prise :
$ xpl-sender -m xpl-cmnd -c plugwise.basic command=powerinfo device=3FD8F6
Le module répond à l’aide d’un trigger, donc voici la sortie :
$ xpl-logger -body class=plugwise
192.168.42.2:48051 [xpl-cmnd/plugwise.basic: bnz-sender.tux -> * - powerinfo 3FD8F6]
plugwise.basic
{
command=powerinfo
device=3FD8F6
}
192.168.42.2:48051 [xpl-trig/plugwise.basic: bnz-plugwise.milk -> * - powerinfo 3FD8F6]
plugwise.basic
{
command=powerinfo
device=3FD8F6
pulse1sec=0005
pulse8sec=0006
unknown=000000A4
}

L’information se trouve dans les deux variables pulse1sec et pulse8sec.

Conclusion

Pour l’instant, l’utilisation de ces prises sous Debian GNU/Linux se limite aux ordres on/off. Il est encore nécessaire d’utiliser le logiciel fourni par le fabriquant pour la configuration du réseau.

Filed under: Debian,Home automation — Tags:, , — cscm @ 17:23

Powered by WordPress