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 ;-)
![]() |
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. |
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
- Ensemble de liens intéressants sur le sujet de la reconnaissance vocale sous GNU/Linux.
- Un exemple d'utilisation de Julius : Querying a database using open source voice control software ;
- Les tutoriels du projet VoxForge ;
- Le Julius Book.