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 :-)