Généralités

Icone Il existe de nombreuses solutions pour faire de la synthèse vocale sous Linux (aussi appelée TTS). La plupart est du à des universitaires. Nous allons en étudier une puis voir comment l'intégrer dans KDE.

NB: que les puristes de la synthèse vocale pardonnent mes approximations, les cours que j'ai suivis commencent à dater ;)

Le principe général est à partir d'un texte brut :

  1. le traiter de manière à le transformer en entités élémentaires appelées phonèmes
  2. ajouter des informations de prononciation (durée, accent tonique ...) : c'est la prosodie
  3. créer un fichier vocal en concaténant les sons pré-enregistrés correspondants aux phonèmes ou diphones[1]

Pour plus de détails, je vous renvoi vers Wikipedia ou vers ce document pdf.

Les principaux moteurs de synthèse vocale sous Linux sont :

  • epos : Czech et Slovak
  • FreeTTS : en Java, US English
  • festival / flite : English, Spanish and Welsh
  • mbrola : un nombre incoyable de voix/langues, mais non libre

C'est tout de même ce dernier que nous allons utiliser.

le moteur de synthèse : mbrola

mbrola est un synthétiseur de parole multi-langage malheureusement non libre mais tout de même gratuit[2]. Il a l'avantage de fonctionner facilement et surtout de disposer de nombreuses base de diphones.

Pour l'installer, il vous faut télécharger les binaires ainsi que au moins une base de diphones. Vous vous retrouvez alors avec des fichiers zip :

  • mbr301h.zip : qui contient les binaires
  • fr1-990204.zip, fr2-980806.zip ... : avec les voix

Nous allons installer ceci dans /opt pour ne pas polluer notre système : Mbrola

sudo mkdir /opt/mbrola
cd /opt/mbrola
sudo chown jjl:jjl . # changez cela si vous êtes en multi-utilisateurs
unzip /home/jjl/sources/install/mbrola/mbr301h.zip
unzip /home/jjl/sources/install/mbrola/fr1-990204.zip
unzip /home/jjl/sources/install/mbrola/fr2-980806.zip
ln -s mbrola-linux-i386 mbrola # selon votre architecture

Maintenant testons le fonctionnement :

./mbrola fr1/fr1 fr1/TEST/trenet.pho trenet.wav
mplayer -really-quiet trenet.wav

cela devrait donner ceci :


Hum, il semble que le neolao player ai du mal sur ce morceau :( alors qu'il passe très bien dans XMMS

Si vous voulez éviter de créer un .wav à chaque fois, essayez ceci :

./mbrola fr2/fr2 fr2/TEST/hier.pho -.au | aplay

C'est assez impressionnant. Mais, autant vous prévenir tout de suite, nous n'obtiendrons pas cette qualité. La qualité de la diction proviens pour une grosse part de la prosodie, qui est très difficile à obtenir automatiquement. Nous allons quand même continuer ;)

La découpe en phonèmes : lliaphone

mbrola attends un fichier de phonème. Il nous faut donc un autre programme qui transforme du texte brut en phonèmes avec informations de prosodie. Nous allons utiliser lliaphon qui est distribué sous licence GPL. Il est dérivé de Lia_Phon initialement développé par Frederic Bechet et spécifique au français.

Commencez par télécharger et décompresser la version 0.4. Nous allons l'installer avec mbrola dans /opt :

cd /home/jjl/sources/install/mbrola/lliaphon-0.4
./configure --prefix /opt/mbrola/lliaphon 
make
make install

Pour tester, nous allons utiliser un script fourni avec lliaphon :

cd /opt/mbrola/lliaphon
echo "Bonjour, je suis un ordinateur.">/tmp/test.txt
export MBROLA_VOICE=/opt/mbrola/fr2/fr2
export PATH=$PATH:/opt/mbrola/
./bin/lliaphon /tmp/test.txt
./bin/play_ola /tmp/test.ola

Vous devriez entendre quelque chose dans ce genre :

Intégration dans KDE : kttsd

KDEaccKDE offre une manière élégante de lire du texte affiché à l'écran : KTTS . Voyons comment mettre ceci en place :

sudo apt-get install kttsd ksayit
  • kttsd est le démon qui s'occupera de la communication avec le backend de synthèse
  • KSayIt une petite application permettant de lire un document que l'on tape
  • La synthèse vocale sera aussi intégrée à Konqueror et à Kate[3]

Commençons par créer un script qui enchaîne les différentes étapes :

$ cat > /opt/mbrola/tts :
#!/bin/sh
echo $1 | iconv -f UTF-8 -t ISO_8859-1 > $2
/opt/mbrola/lliaphon/bin/lliaphon $2 > /tmp/log 2>&1
/opt/mbrola/mbrola -e -t 0.75 \
      -I /opt/mbrola/lliaphon/share/lliaphon/initfile.lia \
      /opt/mbrola/fr2/fr2 \
      `echo $2|sed s/\.txt$/\.ola/` $3 >> /tmp/log 2>&1
^D
$ chmod u+x /opt/mbrola/tts

Pour configurer ktts, deux solutions :

  • à partir de KSayIt : Settings/Configure KSayIt/Launch Control Center
  • en lançant kttsmgr à partir de la ligne de commande

Puis nous allons configurer kttsmgr pour qu'il utilise le couple lliaphon/mbrola :

  • Talkers / Ajouter / Langue: autre / Synthesizer: Show all - commande

Capture d'écran

  • Choisir la langue dans la fenêtre qui apparaît
  • Entrez la commande : /opt/mbrola/tts %t %f %w

Capture d'écran

Et voila, relancez Konqueror et vous avez maintenant une option pour lire le texte séléctionné : Capture d'écran Et vous entendez :

Quelques mots sur festival

festival est un moteur de synthèse vocale complet et open-source. Mais il ne fonctionne pas directement en français même s'il semble possible d'arranger cela (voir ci-dessous) Pour l'installer :

sudo apt-get install festival

Pour le tester :

echo "hello, I'm a computer"  | festival --tts

Vous pouvez aussi l'utiliser très facilement avec KTTS.

Bonus : lire les titres d'un flux RSS

Je me suis amusé à faire un petit script python qui récupère un flux rss et en fait un mp3. Il nécessite :

  • la bibliothèque feedparser qu'il vous suffit de décompresser dans le même répertoire que mon script,
  • lame pour l'encodage mp3,
  • et lliaphon / mbrola bien entendu :)

Pour l'utiliser c'est très simple :

$ ./rss2mp3.py
usage: ./rss2mp3.py <RssFeedUrl> [NbTitles]
        exple: ./rss2mp3.py http://kubuntu.free.fr/blog/rss.php 5
        création d'un mp3 des titres des 5 derniers articles de mon blog

Vous pouvez le télécharger la : rss2mp3.py
Si vous avez installé dans d'autres répertoires que moi, changez les variables en début de script

Pour aller plus loin

Notes

[1] transition entre deux phonèmes

[2] plus de détails dans la licence

[3] sauf que je n'ai pas trouvé comment faire avec Kate