07sept. 2009
Ubuntu Text-to-Speech (TTS)
00:38 - Par Bothari - Ubuntu - 8 commentaires
Le robot Nao utilise la synthèse vocale de la société Acapela.
Si vous n'avez pas de robot Nao, mais que vous voulez vous faire une idée de ce que donne sa synthèse vocale, le site Acapela propose sur son site un outil de test que j'ai intégré ci-dessous. Il vous suffit de taper votre texte, puis de cliquer sur OK.
Mais vous n'avez pas besoin d'avoir un robot Nao pour jouer avec la synthèse vocale ("text-to-speech" en anglais), vous pouvez le faire avec juste votre ordinateur, et peut-être programmer des petites choses qui pourront ensuite être utilisées sur le robot.
Dans la suite de ce billet, je vais essayer de vous expliquer comment faire fonctionner la synthèse vocale sur le système Ubuntu Linux.
Solution simple : Espeak
La solution la plus rapide et la plus simple pour rapidement tester la synthèse vocale sous Ubuntu, c'est d'utiliser Espeak.
Installation :
$ sudo apt-get install espeak
Pour connaitre la liste des voix et langues que supporte Espeak, il suffit de taper la commande :
$ espeak --voices
Ou d'aller voir le contenu du répertoire où elles sont stockées :
$ ls /usr/share/espeak-data/voices/
Utilisation en ligne de commande :
$ espeak -v fr "Bonjour tout le monde. Comment ça va ?"
$ espeak -v fr -f fichier.txt
Voilà. C'est tout.
Un peu plus compliqué : Espeak+MBROLA
Bon, vous avez du vous en rendre compte, la qualité de la synthèse vocale obtenue avec Espeak est bien moins bonne que celle de l'outil Acapela. La voix générée par Espeak a en effet un coté métallique très rétro.
On peut améliorer le rendu de la voix en utilisant MBROLA en complément de Espeak. En effet, Espeak fait à la fois la transformation de texte en phonèmes, et la transformation de phonèmes en son. Alors que MBROLA s'occupe uniquement de la transformation d'un fichier de phonèmes en son, mais le fait bien mieux que Espeak.
Installation de MBROLA
MBROLA n'est pas un logiciel libre. Il faut donc charger la version binaire du programme correspondant à son système. Elles sont disponibles à cette adresse :
http://tcts.fpms.ac.be/synthesis/mbrola/mbrcopybin.html
Il faudra aussi charger les fichiers de voix "fr1" (une voix d'homme) et "fr4" (une voix de femme) qui correspondent aux voix incluses par défaut dans Espeak.
Chargement :
$ wget http://tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip
$ wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/fr1/fr1-990204.zip
$ wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/fr4/fr4-990521.zip
Il faut ensuite installer le tout :
$ sudo mkdir /opt/mbrola
$ sudo unzip mbr301h.zip -d /opt/mbrola
$ sudo ln -s /opt/mbrola/mbrola-linux-i386 /usr/bin/mbrola
$ sudo unzip fr1-990204.zip -d /opt/mbrola
# Pour fr4, il faut spécifier 'fr4' dans le chemin d'extraction sinon tout se retrouvera dans '/opt/mbrola'
$ sudo unzip fr4-990521.zip -d /opt/mbrola/fr4
Maintenant que tout est installé, on peut passer à l'utilisation.
Synthèse vocale depuis la ligne de commande
Pour tester si tout fonctionne bien, le plus simple est d'ouvrir un terminal, et de taper les commandes présentées ci-dessous.
Espeak permet de transformer du texte en phonème avec l'option '-x' et en spécifiant avec l'option '-v' la voix mbrola à utiliser :
$ espeak -x -v mb/mb-fr1 -f fichier.txt > texte1.pho
$ espeak -x -v mb/mb-fr4 -f fichier.txt > texte4.pho
MBROLA permet de transformer un fichier de phonème en un son que l'on peut écouter directement avec "paplay" (programme pour lire des sons via PulseAudio) :
$ mbrola -e -C "n n2" /opt/mbrola/fr1/fr1 texte1.pho -.au | paplay
$ mbrola -e -C "n n2" /opt/mbrola/fr4/fr4 texte4.pho -.au | paplay
L'option -e permet de forcer mbrola à continuer même si il rencontre un phonème qu'il ne sait pas synthétiser.
L'option -C "n n2" permet de spécifier à mbrola qu'il doit remplacer le phonème 'n2' que l'on trouve par exemple dans la phrase "on n'a" par le phonème 'n', vu que mbrola ne connait pas 'n2'.
On peut aussi stoquer le son au format 'wav' pour l'écouter ensuite avec par exemple mplayer :
$ mbrola -e -C "n n2" /opt/mbrola/fr4/fr4 texte4.pho texte4.wav
$ mplayer texte4.wav
Sachant que dans le cas ou l'on génère directement le son, on peut tout faire en une seule ligne (sans passer explicitement par un fichier ".pho") :
$ espeak -x -v mb/mb-fr1 "Coucou tout le monde." | mbrola -e -C "n n2" /opt/mbrola/fr1/fr1 - -.au | paplay
$ espeak -x -v mb/mb-fr4 -f fichier.txt | mbrola -e -C "n n2" /opt/mbrola/fr4/fr4 - -.au | paplay
Il y a pas mal d'option dans mbrola pour changer le volume, le pitch ou la vitesse de la voix. Voici quelques exemples d'option à essayer de rajouter à la commande mbrolla :
-v 0.2 : volume de la voix (plus ou moins forte)
-f 3.0 : fréquence/pitch de la voix (plus ou moins aigue)
-t 2.0 : vitesse de la parole (plus ou moins lente)
-l 30000 : fréquence de la voix (peut donner des effets bizarres style voix de canard)
Ce qui nous donne :
$ mbrola -v 0.2 -f 3.0 -t 2.0 -l 30000 -e -C "n n2" /opt/mbrola/fr1/fr1 texte1.pho -.au | paplay
Synthèse vocale depuis python
Le langage python est un langage de programmation qui permet d'assez facilement faire des choses un peu élaborées. On va donc voir comment écrire un programme python qui utilise la synthèse vocale.
Une solution rapide consiste à lancer les lignes de commandes présentées précédemment depuis python grâce à la fonction os.system() :
#!/usr/bin/env python # -*- coding: utf-8 -*- import os cmd = "espeak -x -v mb/mb-fr1 \"%s\" | mbrola -e -C \"n n2\" /opt/mbrola/fr1/fr1 - -.au | paplay" ch1 = "Coucou tout le monde." ch2 = "Comment allez vous les amis ?" os.system(cmd % ch1) os.system(cmd % ch2)
Mais on va plutôt utiliser la solution plus générique proposée par le programme 'speech-dispatcher' et son wrapper python appelé 'speechd'. L'intérêt de speech-dispatcher est qu'il permet d'avoir une interface générique quelque soit le système de synthèse vocale utilisé : espeak, mbrola, festival, ou autre. Et donc d'avoir un programme python qui soit indépendant de la synthèse vocale utilisée par le système.
Installation de speech-dispatcher
Installation des paquets :
$ sudo apt-get install speech-dispatcher
$ sudo apt-get install python-speechd
Configuration générale de speech-dispatcher
$ sudo gedit /etc/speech-dispatcher/speechd.conf
Dans ce fichier, on peut définir : le module de synthèse vocal, la langue et la voix de la synthèse qui doivent être utilisés par défaut. Modifiez le fichier de la façon suivante :
DefaultVoiceType "FEMALE1" DefaultLanguage "fr" DefaultModule espeak-generic
Il faut aussi activer le module 'espeak-generic' que l'on souhaite utiliser en décommentant la ligne du fichier le définissant :
AddModule "espeak-generic" "sd_generic" "espeak-generic.conf"
On peut aussi commenter les autres modules si on ne compte pas les utiliser.
Configuration du module "espeak-generic" de speech-dispatcher
On peut maintenant sauver le fichier, et passer à l'édition du fichier de configuration du module sélectionné :
$ sudo gedit /etc/speech-dispatcher/modules/espeak-generic.conf
Dans ce fichier, il faut redéfinir la ligne de commande à utiliser pour faire la synthèse. Par défaut il y a :
GenericExecuteSynth \ "echo \"$DATA\" | espeak -w /tmp/espeak.wav -v $VOICE -s $RATE -a $VOLUME -p $PITCH $PUNCT --stdin && paplay /tmp/espeak.wav"
A la place on va mettre une ligne basée sur celle que l'on utilisait en ligne de commande, avec quelques spécificités liées à l'utilisation de mbrola :
GenericExecuteSynth \
"MBVOICE=$VOICE \
&& echo \"$DATA\" \
| espeak -v mb/mb-$MBVOICE $PUNCT --stdin \
| mbrola -t $(awk 'BEGIN{print $RATE/10}') \
-v $(awk 'BEGIN{print $VOLUME/100}') \
-f $(awk 'BEGIN{print $PITCH/10}') \
-e -C \"n n2\" /opt/mbrola/$MBVOICE/$MBVOICE - -.au \
| paplay"
On va aussi redéfinir la voix MALE1 pour le français, et ajouter la voix féminine du français qui n'est pas définie dans ce fichier :
AddVoice "fr" "MALE1" "fr1" AddVoice "fr" "FEMALE1" "fr4"
Et il faut aussi redéfinir les coefficient pour les paramètres volume/pitch/rate :
GenericRateAdd 10 GenericPitchAdd 10 GenericVolumeAdd 0 GenericRateMultiply 100 GenericPitchMultiply 100 GenericVolumeMultiply 100
Voila, vous pouvez sauver le fichier.
Lancement de speech-dispatcher comme service du système
Maintenant que tout est configuré, si on veut que speech-dispatcher tourne en tant que service du système, il faut le préciser en éditant le fichier suivant :
$ sudo gedit /etc/default/speech-dispatcher
Mettre "RUN_SPEECHD=yes" au lieu de "RUN_SPEECHD=no", puis sauver le fichier.
On peut alors lancer le service de la façon suivante :
$ sudo /etc/init.d/speech-dispatcher start
Si vous faites d'autres modification de la configuration de speech-dispatcher, il faudra relancer le service pour qu'elles soient prises en compte. Cela se fait de la manière suivante :
$ sudo /etc/init.d/speech-dispatcher restart
Il ne reste plus qu'à faire un petit test en ligne de commande pour voir si speech-dispatcher fonctionne correctement :
$ spd-say "Coucou tout le monde."
Utilisation de speech-dispatcher comme simple programme utilisateur
Chez moi paplay ne marche pas quand il est appelé par le service speech-dispatcher. Du coup, je ne fais pas tourner speech-dispatcher en tant que service du système, mais comme une simple application utilisateur.
J'ai donc arrêté le service :
$ sudo /etc/init.d/speech-dispatcher stop
Et j'ai remis "no" dans le fichier "/etc/default/speech-dispatcher".
Pour pouvoir lancer soi-même speech-dispatcher, il suffit juste de copier la configuration faite précédemment chez soit :
$ mkdir ~/.speech-dispatcher
$ mkdir ~/.speech-dispatcher/conf/
$ cp -r /etc/speech-dispatcher/* .speech-dispatcher/conf/
Et voila. On peut maintenant lancer speech-dispatcher :
$ speech-dispatcher
Et après, la commande de test devrait fonctionner sans problème :
$ spd-say "Coucou tout le monde."
Remarque : le programme speech-dispatcher tourne en arrière plan. Pour l'arrêter, il suffit de faire :
$ killall speech-dispatcher
Options de speech-dispatcher
Speech-dispatcher permet de jouer sur les options de volume, hauteur de la voie (pitch) et vitesse de la voix (rate). Je vous conseille donc d'afficher l'aide de la commande spd-say :
$ spd-say -h
Avec notre configuration spécifique au cas mbrola :
- pour le choix de la voix (option -t) on peut mettre male1 ou female1,
- pour le volume (option -i), il faut donner une valeur entière comprise entre 0 et 100,
- pour le pitch (option -p) et la vitesse de la voix (option -r) il faut donner une valeur entre 1 et 100, sachant que la valeur par défaut est 10.
Et on peut aussi demander de lire tous les signes de ponctuation (option -m all), y compris les virgules et les points, ou seulement les deux-points, les points virgules et autres signes un peu spécifiques (option -m some).
On peut donc lancer une commande du genre :
$ spd-say -m some -i 50 -p 20 -r 5 "Coucou : tout le monde."
Exemple d'utilisation de speech-dispatcher depuis python
Voici un exemple simple de code python utilisant la synthèse vocale du système grâce au wrapper speechd de speech-dispatcher :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import speechd
client = speechd.SSIPClient('test')
client.set_punctuation(speechd.PunctuationMode.SOME)
client.speak("Coucou : tout le monde.")
client.speak("Comment allez vous les amis ?")
client.close()
Pour lire la documentation du module speechd, soit vous lisez directement les 'docstrings' incluent dans le code :
$ less /usr/share/pyshared/speechd/client.py
Soit vous lancer python, et demandez l'aide du module en question avec la fonction 'help()' :
$ python
>>> import speechd
>>> help(speechd)
>>> help(speechd.client)
>>> help(speechd.client.SSIPClient)
Webographie
Voici les principales sources d'information que j'ai utilisées pour ce sujet :
Synthèse vocale sous Ubuntu :
http://doc.ubuntu-fr.org/synthese_vocale
Documentation espeak :
$ man espeak
Documentation mbrola (le fichier readme.txt contenu dans l'archive zip des binaires) :
$ less /opt/mbrola/readme.txt
Documentation de speech-dispatcher :
$ info speech-dispatcher
Configuration et lancement de speech-dispatcher :
http://cvs.freebsoft.org/doc/speechd/speech-dispatcher_8.html#SEC19
http://cvs.freebsoft.org/doc/speechd/speech-dispatcher_9.html#SEC23
Utilisation de l'api python de speech-dispatcher :
http://cvs.freebsoft.org/doc/speechd/speech-dispatcher_15.html
Tutorial complet sur l'installation/configuration/utilisation de espeak avec mbrola et speech-dispatcher :
http://www.csquad.org/2009/08/27/text-to-speech-avec-espeak-mbrola-et-speech-dispatcher/
Et maintenant ?
Maintenant, c'est à vous de jouer. Il y a pas mal de choses que votre programme pourrait dire :
- l'heure,
- la météo,
- le programme tv,
- lire vos mails, ou le contenu de n'importe quelle page web ou fichier texte.
Mais bon, ce serait évidemment mieux si en plus de parler, votre programme était capable de vous entendre ET de vous comprendre. Pour ça il faut ajouter la reconnaissance vocale à votre système, mais ça, ce sera l'objet d'un autre billet :-)
8 commentaires
Raaah génial ! J'ai nhâte de voir la suite !
En attendant j'ai un petit probleme chez moi, meme après avoir mis speech-dispatcher comme prog user normal, ca ne marche toujours pas, je crois que c'est parce que j'ai vider la conf de speech dispatcher et mis juste les 3lignes =°
Ca y est, j'ai réussi, plus qu'a me créer mon wrapper en C.
A la première lecture, ca semble un très bon tuto, que je vais tester ce soir sur ma distro ubuntu 9.10 fraichment installé. J'espère que les binaires mbrola i386 sont compatibles avec ma ubuntu en 64 bit. C'est bête qu'il n'y ait pas les sources de dispo.
Je suis aussi vraiment intéressé pour créer un système de reconnaissance vocale et synthèse vocale sous linux, surtout pour utilisation en Home cinema (lancer tel video, tel musique) et vie courante (les exemples donnés dans l'article : météo, programme TV)
Le tout branché sur un micro de visioconférence (pour donner ses ordres depuis n'importe quel coin d'une pièce) ca doit déchirer ! ;)
Clair tippel ! N'hésites pas a partager si tu y arrives x] !
Bonjour,
mbrola (3.01h) affiche l'erreur suivante :
Fatal error in line: bO~Z'ur tulm'O~d
lorsque je lance
$ espeak -x -v mb/mb-fr4 "bonjour tout le monde" > text.pho
$ mbrola -e -C "n n2" /usr/share/mbrola/fr4/fr4 text.pho -.au | paplay
OK, je viens de voir que les fichiers exemples .pho ne ressemblent pas du tout au fichier de sortie de espeak.
Que faut-il faire pour avoir le même format ?
Bonjour,
Merci pour toutes ces explications ça aide bien. Je souhaite utiliser un peu de synthèse vocale pour une application de domotique médicale que je développe au LAAS/CNRS de toulouse et je pense que le plus simple pour l'instant sera d'utiliser mbrola avec une conversion de phonèmes via espeak. J'ai réussi à faire marcher les deux sauf que je n'arrive pas a faire la conversion en phonème avec une voix mbrola
>espeak -x -v ./mbrola/fr4/fr4 -f texte.txt > texte1.pho
Failed to read voice './mbrola/fr4/fr4'
Si à tout hasard tu avait une idée du problème.
merci
julien
Bonjour,
Très bien expliqué. Et fonctionne parfaitement.
Est-il possible d'avoir une voix moins métallique.
du genre Acapela.
Avec quelques explications, comme vous savez le faire.
Merci d'avance.
Cordialement.
B.Y.