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.
Ouah … un grand merci pour la synthèse de tes recherches et pour le travail accompli. A la chasse de projets de reconnaissance vocale (française) sous Linux, j’étais jusqu’alors toujours rentré bredouille :(
N’étant pas bien familier avec trac, pourrais tu indiquer le moyen de téléchargé les sources d’alfred ?
Merci, les sources sont disponibles sur le trac via SVN.
Mais pour l’instant c’est assez difficile de faire fonctionner le projet.
Je vais faire des paquets Debian et décrire la procédure d’installation.
Ce n’est pas l’installation qui me pose problème, j’ai un peu zieuté tes sources et notamment les modules Perl utilisés mais plutot comment télécharger le source d’alfred:
svn co svn://alfred.csquad.org/trunk
svn: Impossible de se connecter à l’hôte ‘alfred.csquad.org’: Connexion terminée par expiration du délai d’attente
svn co http://alfred.csquad.org/trac/trunk
svn: Le serveur a envoyé une valeur inattendue (405 Method Not Allowed)
svn co http://svn.csquad.org//trunk
svn: Could not open the requested SVN filesystem
svn co http://alfred.csquad.org/svn/trunk
Ca veut dire quoi cette référence à EPITECH ??!
C’est une private joke. Mais elle explique bien la méthode employer par l’école. C’est à dire te demander de faire une choses complexe sans comprendre ;-)
Tu en sorts donc ?!
Sinon, pour en revenir à ton projet…beh.. rien en fait :) car j’ai pas emménager dans ma maison (prévu mi décembre). Mais j’ai de grand projet pour de la domotique sous unix.
La seule chose qui me manque, c’est le dialogue avec les équipements plcbus…
@nORKy : oui promo 2006, toutes mes excuses ;-)
Pour les équipements PLCBus, je sais que le projet Domogik travaille dessus.
Bienvenue au club alors :) promo 2005
Pour domogik, c’est intéressant, mais comme j’ai pas eut le temps de me mettre au python.. (je suis plutôt perl)
[…] http://www.csquad.org/2009/10/27/reconnaissance-vocale-avec-julius/ a few seconds ago from Net::Twitter […]
Bonjour
Vraiment très impressionnant. J’ai moi même mise en place une solution beaucoup moins compliqué mais qui est fonctionnelle à base de pocket pc et de nabaztag. Une petite video ici : http://www.vimeo.com/7520041
Maintenant afin de rendre mon installation plus puissante, je compte utiliser un netbook + voice tracker + julius + aiml + nabaztag. L’avantage de voice tracker n’est pas à démontrer même si cela à un coût.
Je me pose tout de même une question. Si Voice tracker permet de reconnaître la voix humaine parmi tous les bruits d’une pièce, comme est-ce que ton logiciel sait qu’il doit traiter l’info. Je prend un exemple. Lorsque tu vas dire un truc du genre “Peux tu allumer la lumière”, cela peu aussi s’adresser à quelqu’un dans la pièce. Je n’ai pas ce problème avec mon appli à base de pocket pc, car comme tu peux le voir dans la vidéo, je dois au préalable appuyer sur un bouton, puis parler de manière lisible au pocket pc.
Dans ton exemple en haut, je suppose que le fait de dire “Alfred?” permet d’activer la reconnaissance mais si tu veux remercier Alfred, dois tu répéter son nom ? “toi : Alfred? –> lui : Oui Monsieurs –> toi : merci”. Un peu lourd non ?
Je cherche une solution pour évaluer si ce qui vient d’être dit s’adresse bien à l’ordi mais dans ce cas, cela nécessite d’évaluer tout ce qui se dit en temps réel. Je suis pas certain d’être bien clair…
En tous les cas encore bravo.
Johnny Baillargeaux
@Johnny Baillargeaux :
Oui, l’interpellation doit activer la séquence de détection. J’ai repris l’idée de la vie réelle.
Lorsque tu demandes une chose à une personne, tu le fais de la manière suivante :
* tu l’interpelles ;
* tu lui fournis un ensemble d’ordre ;
* tu le remercies;
ce qui forme la séquence de détection.
Les ordres compris par le robot sont limités et j’utilise un vocabulaire et une construction de “phrase” très simple.
Mais je suis d’accord avec toi, qu’il est possible de déclencher la détection d’une manière plus intelligente et moins lourde.
Un exemple qui me vient en tête et que j’aimerai implémenter, c’est celui de mon lecteur RFID qui se trouve dans l’entrée.
Lorsque je dépose mes clés sur le lecteur (avec un tag) RFID, l
e robot peut me demander si j’ai passé une bonne journée et me demander quels sont mes ordres.
C’est un exemple de déclenchement “physique” de la détection.
Enfin bref, j’ai plein d’idée, mais pour l’instant je continue à bosser
dessus pour sortir une version simple et bien documentée pour que d’autres
personnes puissent apporter leur contribution ;-)
Bonjour,
Le but du “voice tracker” est d’éliminer toute contrainte lors de l’échange verbal. Si je dois faire détecter un tag rfid pour que le programme se mette en écoute (ce n’est pas tout à fait ce que tu as dit, j’en conviens) alors ce fabuleux appareil perd toute son utilité, autant installer un simple micro et se déplacer pour parler.
En fait, je me suis aussi demandé comment cela se passait dans la réalité lorsque je voulais demander un service à quelqu’un. Soi je le regarde puis je lui demande, soi je cite cette personne dans ma phrase. Pour la deuxième solution, pas de problèmes, c’est déja ce que tu fais en gros.
Pour la première solution, il faudrait une webcam 360° avec un logiciel de “eyes tracking” du genre ce qui est réalisable avec OPENCV afin de capter l’angle de vue et donc de déclencher “l’écoute” lorsque le programme détecte avec insistance que l’intervenant regarde dans une direction prédéfinit (dans mon cas, la webcam devrait se situer à coter de mon nabz).
Comme tu vois, je rêve un peu, mais rien ne m’en empêche après tout :-)
Sinon, tu aurais une doc un peu plus userfriendly au sujet de Julius ? je dois avouer me perdre avec tous les paramètres dispos dans le Julius book.
Johnny Baillargeaux
Salut,
Je suis moi aussi entrain d’essayer d’intégrer un système à base de
reconaissance automatique de la parole. Personellement, j’était parti sur la piste Sphinx III… j’explique pourqoui à la fin de ce post.
Puisque tu utilise Julius, je suis allé voir comment il fonctionne. C’est assez similaire à Sphinx sur le principe.
Il y a 3 nvieaux de complexité pour interpréter ce que l’on dis, et le transcrire.
1 . Le niveau le plus bas est le modèle acoustique, il permet de segmenter un flux de données audio en phonèmes.
2 . Le niveau suivant est le niveau “vocabulaire”, il est décrit dans un fichier .voca qui contient toutes les unités de sens que l’on souhaite que Julius soit capable d’identifier. Et chaque unité de sens est décomposée en phonèmes (niveau 1).
3. Le dernier niveau est le niveau “grammaire”, il assemble des unités de sens pour créer des phrases.
Pour décrire les niveaux 2 et 3, pas de soucis ! Par contre, tu le soulignes dans dans ta page web, la création du modèle acoustique, c’est une autre affaire.
Je n’ai pas bien compris ta méthode en lisant ton script perl (car j’ai plus de mal avec les scripts perl qu’avec les HMM personellement). Si j’ai bien compris, ce script perl c’est l’automatisation du tutoriel dont tu passes le lien ?
Si c’est le cas, je me pose une question :
Dans ce tutoriel, à l’étape 2, il est dit qu’il faut entrainer HTK avec au minimum strict 30-40 phrases de 8 10 mots chacunes, afin de s’assurer que chaque phonème apparaît au moins 3 fois.
D’où ma question : Comment as tu fais pour respecter cette contrainte. Et si tu ne l’a pas respecté, le résultat de la reconnaissance vocale est il satisfaisant ?
Si non il existe un modèle acoustique, et un modèle de grammaire francais “open”. Il a été créé par un lab, le LIUM, et il consiste en 80 heures d’enregistrement d’émissions de radio retranscrites. (au passage, je n’aimerai pas être le mec qui c’est tapé la retranscription en question :) ).
Il est disponible à l’adresse suivante :
http://www-lium.univ-lemans.fr/tools/index.php?option=com_content&task=blogcategory&id=20&Itemid=46
Je l’ai essayé avec la version Sphinx3.3, mais le résultat est loin d’être satisfaisant. Poutant, il est sensé avoir un WER de 27%… Donc je pense que c’est moi qui utilise mal Sphinx III. Je poursuis donc deux pistes en même temps. Apprendre à bien utiliser Shinx III pour pouvoir exploiter le super modèle acoustique francais du LIUM, et essayer de créer un modèle francais pour Julius (donc avec HTK), comme tu as fais toi.
Merci d’avance pour ta réponse !
Bonjour, j’ai tenté de faire un paque debian d’alfred, j’ai refait des paquets au passage pour rivescript, et libxpl-perl
Quand je lance la commande alfred, après avoir réalisé une copie de trunk/alfred.conf.fr dans ./alfred.conf, j’obtiens une erreur et le message suivant :
$ alfred
Error in config file alfred.conf, line 103: directive ‘setonewirehumidity’ is not a valid directive name at /usr/local/bin/alfred line 36
Y a-t-il un autre fichier de configuration qui permette de « commencer le jeu ? »
@Georgesk : not yet released.
C’est encore une version svn, je ne peux donc garantir que tout fonctionne correctement. Je concentre mon temps libre sur l’amélioration de la reconnaissance vocale (je suis à 50% de précision). Une fois que je serais serait parvenu à 70-80%, je documenterais
la procédure d’installation qui est assez complexe.
Voilà
[…] est possible de contrôler un système domotique à la voix (cf https://csquad.org/2009/10/27/reconnaissance-vocale-avec-julius/). Par contre il faut du bon matériel et un apprentissage des voix des utilisateurs. Ça peut être […]
Bonjour,
J’ai des petites questions au sujet de voicetracker: sur la page officielle (http://www.acousticmagic.com/online-store.html), je peu voir des versions USB, non USB, UK, etc… Je voulais savoir quelle version il faut acheter pour l’utiliser en france.
Dernière chose. Tu souviens tu des frais de port ? (j’habite en france (région parisienne)
Merci par avance,
Johnny Baillargeaux
@Jbx028 : j’ai une version UK acheter directement aux USA et importer via MyUS (https://www.myus.com/).
Il faut juste ajouter un adaptateur pour les prises UK.
Le produit pèse 4 pounds soit 1.80 kilogramme.
Tu as qu’une pièce dans ton appart ? Sinon, tu fais comment pour placer le micro ? Parce que c’est quand même pas donné, je ne pourrai jamais m’en offrir plusieurs :-/
Plusieurs pièces comme tout le monde. Il est évident que le microphone est cher malgré le taux de change favorable. Mais c’est à relativisé par rapport au gain d’autonomie que peut representer ce type de technologies pour une personne dite “handicapée”.
OK, merci pour ta réponse.
Je me doute bien que le micro est de qualité :) Mais tu fais comment pour l’utiliser ? Tu peux appeler Albert à partir d’une seule pièce ou tu as un micro par pièce ?
Parce que j’imagines bien au fond du lit : “Albert, prépares-moi le petit déj'” ou alors dans la cuisine : “Ah! il me manque tel truc, Albert, va m’en acheter” lol
Enfin, pour l’instant j’ai d’autres frais et occupations beaucoup plus importantes que ça ;) En plus faudra que je me remette à Asterisk, ça fait pas loin de 2 ans que je n’y ai pas touché (c’était sur le NSLU2 tout lent en plus…) :)