Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Ordinateurs embarqués (SBC) > La carte Raspberry PI > Projets complets avec la Raspberry Pi > Synthèse vocale avec espeak et mbrola sur Raspberry Pi

Synthèse vocale avec espeak et mbrola sur Raspberry Pi

dimanche 24 juin 2012, par Julien H.

Nous avions présenté les méthodes les plus efficaces de synthèse vocale sous Linux pour faire parler un robot. Il fallait ensuite l’embarquer dans un robot.

Grâce à la Raspberry Pi, c’est chose faite : avec un ARM11 et une distribution Debian, nous avons réussi à faire parler Nono !!

 Premières étapes

- L’installation du son est expliquée ici

- Pour utiliser la langue française, installez le "locale" fr_FR en UTF-8



 Installer espeak

L’installation de espeak est directe :

# sudo apt-get install espeak

On peut le tester sur Debian Squeeze avec les options "-x et -q" qui ne sortent pas de sons mais affichent l’analyse détaillée, ce qui permet de détecter les erreurs (notamment la lecture des accents) et d’en apprendre un peu plus sur les phonèmes :

pi@raspberrypi:~$ espeak -x -q -v mb/mb-fr1 "Toto"
 to2t'o
t       68
o       28       0 94 80 98 100 98
t       68
o       124      0 102 80 76 100 76
_       301
_       1
pi@raspberrypi:~$ espeak -x -q -v mb/mb-fr1 "Coucou"
 kuk'
u
k       102
u       28       0 94 80 98 100 98
k       102
u       124      0 102 80 76 100 76
_       301
_       1
pi@raspberrypi:~$ espeak -x -q -v mb/mb-fr1 "Un robot"
 W~ ro2b'o
9~      38       0 94 80 96 100 96
R       65
o       31       0 96 80 98 100 98
b       65
o       124      0 102 80 76 100 76
_       301
_       1

En fait, la version d’espeak installée sur la Raspberry Pi fonctionne aussi sans -x et -q, comme on le constate avec cette différence :

pi@raspberrypi:~$ espeak -s 110 -v mb/mb-fr1 "Toto"
t       94
o       55       0 94 80 98 100 98
t       94
o       220      0 102 80 76 100 76
_       576
_       1
pi@raspberrypi:~$ espeak -s 110 -v mb/mb-fr1 "Toto" -q -x
 to2t'o
t       94
o       55       0 94 80 98 100 98
t       94
o       220      0 102 80 76 100 76
_       576
_       1

Avec une Raspbian (testé sous Occidentalis), c’est différent : espeak génère des sons, et il faut donc lui demander de générer les phonèmes.

 Installer Mbrola

Il ne faut pas installer mbrola avec Aptitude (apt-get), mais télécharger le binaire pour ARM à la main :

# wget http://tcts.fpms.ac.be/synthesis/mbrola/bin/armlinux/mbrola.rar
# sudo apt-get install unrar
# unrar e mbrola.rar
# sudo mv mbrola /usr/bin
# sudo chmod 777 /usr/bin/mbrola

Si vous utilisez une distribution Raspbian (comme la Occidentalis v0.1), vous devez d’abord récupérer unrar (non-free, la version free ne fonctionne pas).

# sudo nano /etc/apt/sources.list (et y ajouter la ligne "deb-src http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi")
# sudo apt-get update
# sudo apt-get build-dep unrar-nonfree
# sudo apt-get source -b unrar-nonfree
# sudo dpkg -i unrar*.deb

Il faut également télécharger une voix française, et l’installer :

# sudo mkdir /usr/share/mbrola
# sudo mkdir /usr/share/mbrola/voices
# wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/fr1/fr1-990204.zip
# unzip fr1*.zip
# sudo mv fr1/fr1 /usr/share/mbrola/voices/

Attention, ce n’est pas le répertoire fr1 mais bien le fichier fr1 (sans tout le reste, vous pouvez le supprimer) qu’il faut copier dans le répertoire des voix, sinon vous aurez une erreur vous laissant croire que vous avez mal installé mbrola..

 Premier lancement

Voilà c’est terminé, il n’y a plus qu’à lancer espeak, mbrola et finir avec aplay pour entendre le son.

Attention, si vous utilisez les exemples classiques de espeak + mbrola, tels ceux qu’on trouve dans la doc Ubuntu, vous aurez peut-être cette erreur :

Playing Sparc Audio 'stdin' : Signed 16 bit Big Endian, Rate 16000 Hz, Mono
aplay: set_params:1116: Unable to install hw params:

La solution est simple (merci Christophe Nowicki, comme d’habitude tu as traité le sujet et je m’en aperçois assez tard, ça me rappelle Nagios et le SNMP...), il faut préciser en paramètre de aplay la fréquence et le type (signed 16 bit) :

Cela donne (testé et approuvé sur Raspberry Pi / Debian) :

# echo "salut les amis, c'est Pobot" > exemple.txt
# espeak -v mb/mb-fr1 -f exemple.txt | mbrola /usr/share/mbrola/voices/fr1 - - | aplay -r16000 -fS16

Et ça fonctionne, malheureusement il y a un "scratch" au début, ce qui fait que le premier mot est haché... mais déjà on est heureux que ça fonctionne.

Mise à jour

Pour Raspbian / Occidentalis, cela ne fonctionne pas car la version d’espeak comporte un accès direct à mbrola.

 Preuve de fonctionnement

Suite à une question posée, je persiste et je signe, ce code est totalement opérationnel et passe bien par Mbrola sur Raspberry Pi, Debian Squeeze, avec l’installation dédiée ARM décrite plus haut.

On peut séparer les différentes étapes, et enregistrer dans des fichiers que nous avons le plaisir de mettre à votre disposition (vous pourrez ainsi entendre la voix mélodieuse de Thierry, aka "fr1").

Tout d’abord, on édite un fichier texte d’exemple (euh.. la présentation du club pour faire simple.

Texte - 827 octets

On appelle espeak et on redirige (">") la sortie vers un fichier de phonème (peu importe l’extension, c’est du texte) :

pi@raspberrypi:~$ espeak -s 110 -v mb/mb-fr1 "Toto" -f exemple.txt > fichiertest.pho
Zip - 1.7 ko

Et ensuite on demande à Mbrola de faire son job, en appliquant la voix installée, et de générer un fichier .wav plutôt que de jouer directement le son.

pi@raspberrypi:~$ mbrola /usr/share/mbrola/voices/fr1 fichiertest.pho test.wav
WAV - 1.6 Mo

Tadaaam ! Encore une victoire de Canard !

Vos commentaires

  • Le 7 juin 2015 à 13:44, par Zouhair En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

    Bonjour,
    ce tuto est uniquement pour la version précédente du Raspbery :-/
    Mbrola, n’est pas disponible pour armv7l (Raspbery pi 2) sous Debian jessie :-(
    Y a t-il une solution pour Raspbery pi 2 ?
    Merci.

    Répondre à ce message

  • Le 8 mai 2015 à 19:37, par Lionel En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

    Salut
    J’ai eu moi aussi segmentation Fault avec mbrola.
    Par contre en telechargeant cette version, tout fonctionne
    wget http://tcts.fpms.ac.be/synthesis/mbrola/bin/raspberri_pi/mbrola.tgz

    Répondre à ce message

  • Le 4 septembre 2013 à 20:50, par EnderStrategy En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

    Bonjour,
    et désolé pour mon côté "carver", je suis nouveau sur rasp (et linux), mais je trouve ca assez interessant.
    Je suis en train de suivre vos articles avec intéret, car j’utilise un rasp pour faire un ’tit robot.

    Je me demandais justement si je pouvais utiliser de la synthèse vocale.

    Vos posts tombent à pic.

    Je me propose, si vous êtes intéressés, de faire une image d’une raspbian avec le chroot mbrola et espeak déjà installés.

    Stay tuned

    • Le 5 septembre 2013 à 09:16, par Julien H. En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      C’est une bonne idée, cela peut résoudre le problème de beaucoup de débutants.

    • Le 26 septembre 2013 à 21:49, par EnderStrategy En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Rebonjour,
      j’ai eut peu de temps pour m’impliquer car je subi des freeze pas possible de mon rasp... Du coup, j’étais occupé à fureter les forums et à essayer tout un tas de tricks.

      Bref, je n’arrive toujours pas au bout de debootstrap. Ca freeze avant.

      J’avoue qu’apres avoir installé et testé un distro sur un pc,
      je suis surpris par l’instabilité du systeme sur raspberry.

      Ou alors, j’ai pas de chance avec mon pi.

      En attendant, pour faire avancer le shmilblik...

      Saurais-tu m’expliquer, les bind dans le fstab ?

      J’avoue confusément confuser un peu.

      Merci d’avance.
      Cordialement.

    • Le 26 septembre 2013 à 22:08, par Eric P. En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Bonsoir,

      Je suis tombé sur un pb similaire il y a deux jours, en installant une distrib Occidentalis, distrib qui marche parfaitement bien sur toutes les autres RasPi que j’ai eues entre les mains jusque là.

      L’erreur que j’ai commise est de suivre le conseil qui dit de lancer un apt-get update / apt-get upgrade à l’issue du prermier démarrage. Première erreur : l’uprade a pris une partie de la nuit (je suis parti me coucher à 2h du matin en laissant la procédure se poursuivre sans moi). Deuxième sanction : le boot bloque au moment de l’initialisation des interfaces réseau, et plus concrètement du dongle WiPi vendu par Farnell (et qui marche très bien lui aussi par ailleurs).

      N’ayant pas le temps de batailler, et ayant observé que le même matériel (ie RasPi + WiPi) démarre sans problème avec la carte SD d’une autre RasPi, créée il y a quelques mois, je suis tout simplement reparti d’une copie de cette version plus ancienne, et plus aucun souci.

      Le conseil serait donc de repartir de l’image d’origine que tu as téléchargée, mais de ne pas faire l’update & upgrade, et de voir si les choses s’arrangent ainsi.

      Eric

    Répondre à ce message

  • Le 3 juillet 2012 à 11:49, par ? En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

    Bonjour,

    Pourquoi faut-il 2 outils (espeak + mbrola) ?? espeak ne se suffit pas à lui même ?

    Merci

    • Le 3 juillet 2012 à 14:54, par Julien H. En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Bonjour,

      espeak produit un son de synthèse très mécanique, alors que mbrola ajoute un modèle de voix humaine.

      pour donner l’heure, espeak est suffisant. pour lire du texte pendant des heures, mbrola (ou un autre logiciel similaire) est plus plaisant.

    • Le 4 juillet 2012 à 10:22, par ? En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Ok, Merci pour cette précision !

    • Le 2 mars 2013 à 00:26, par Plop En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Bonjour,

      Très sympathique comme article. Mais j’avoue être perdu entre les différentes versions. J’ai depuis peu un Raspberry sur lequel j’ai installé Raspbian. Et après avoir suivi les explications à la lettre, j’ai toujours droit à la voix robotisé de Espeak... pas bien bavard Mbrola.

      Dur dur d’être novice...

    Répondre à ce message

  • Le 5 août 2012 à 14:23, par Oliv’ En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

    Bonjour,

    Etes vous sur de passer par mbrola ?
    Selon la doc d’espeak

    -q Quiet, don’t produce any speech (may be useful with -x)

    -x Write phoneme mnemonics to stdout


    Donc vous devriez entendre la version ’espseak’ et non ’mbrola’

    Cependant j’ai une question tout autre, que ce passe-t-il si vous tapez "mbrola /usr/share/mbrola/voices/fr1 fichiertest.pho test.wav" ?
    Car je suis arrivé sur votre page en cherchant pourquoi mbrola fait une "erreur de segmentation" sur Rapsberry PI

    Merci !

    • Le 5 août 2012 à 16:39, par Julien H. En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Vu le ton de la voix (belge et pas robotique), c’est bien la version mbrola.

      Je ne comprends pas votre citation de la doc, vous pensez que le pipe par mbrola ne fonctionne pas et "saute" à aplay ? Bizarre...

      Vous avez piqué ma curiosité, je vais faire les tests.

    • Le 5 août 2012 à 17:43, par Oliv’ En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      La commande "espeak -v mb/mb-fr1 -f exemple.txt" donne-t-elle la même voix ? Ou au moins ressort-elle quelque chose sur stdout ?

      En fait je pense qu’avec la commande que vous utilisez c’est espeak qui génère le son, via mbrola peut-être, car quand on regarde "espeak —h", il y a les lignes que j’ai citées et la ligne

      —pho Write mbrola phoneme data (.pho) to stdout or to the file in —phonout


      Donc si il n’y a pas ces arguments je ne comprends pas comment les phonèmes sont convertis du format "espeak" au format "mbrola" et passés dans std

      Mais la doc d’espeak (http://espeak.sourceforge.net/mbrola.html) est assez confuse, visiblement il est possible de se passer du pipe ( Linux installation, point 3), mais dans ce cas je suis surpris que vous n’ayez pas d’erreur.

      Sinon quelle distribution utilisez vous ? Avez vous essayé d’utiliser Mbrola directement avec un fichier phonème de démo, car j’ai beau chercher je ne vois pas d’où pourrai venir l’erreur de segmentation qu’ j’ai...

      A noter aussi qu’en partant de la distrib "raspbian wheezy", il n’est pas possible d’installer unrar, il faut ajouter les sources "non-free" et le compiler.

      Merci !

    • Le 5 août 2012 à 18:01, par Julien H. En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      La commande demandée a été tapée, sur un fichier de test généré par espeak.

      J’ai mis à jour l’article avec le fichier source, le fichier pho et le fichier test.wav généré sur Raspberry Pi, vous pourrez ainsi entendre la voix mbrola.

      Contactez-moi pour qu’on résolve ensemble votre problème de segmentation de Mbrola.

    • Le 5 août 2012 à 21:47, par Oliv’ En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Comme vu par mail, j’ai essayé une distribution Debian plus ancienne, et surprise, plus d’erreur de segmentation. Si jamais ça peut servir à quelqu’un pour ne pas passer la journée dessus aussi :)

      Je vais essayer de demander sur le forum Raspberry, merci pour votre aide

    • Le 6 août 2012 à 10:39, par Julien H. En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Merci pour l’info. Voilà qui ne me pousse pas vraiment à changer de distribution.

      Suite à nos échanges, je précise que :
      - la carte de Nono est en Debian Squeeze
      - la carte d’Oliv est en Debian Wheezy

      Donc ça marche sur Squeeze, ça ne marche pas sur Wheezy.

      Reste à voir sur Raspbian, la version spécialisée de Debian pour Raspberry Pi.

    • Le 15 août 2012 à 09:14, par Oliv’ En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Bonjour,
      j’ai du mal m’exprimer, je suis en Raspbian Wheezy ;)

      Du coup pour faire fonctionner le tout c’est un peu plus compliqué : Il faut faire un environnement "chroot armel" avec deboostrap et compiler espeak 1.43 à partir des sources. Je suis en discussion avec l’équipe d’Espeak pour que l’option —pho ne fasse pas d’appel à mbrola pour profiter des dernières versions. Sinon je modifierai le code moi même.

      J’a noté l’essentiel des commandes pour faire tout ça si ça intéresse quelqu’un.

    • Le 15 août 2012 à 18:20, par Julien H. En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Oui, moi ça m’intéresse, pas pour exécuter espeak en armel mais surtout mbrola en armel, car c’est lui dont le binaire ne fonctionne pas en armhf (mon espeak fonctionne sur Occidentalis, basé sur Raspbian Wheezy).

    • Le 20 août 2012 à 22:05, par Franck En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Bonjour, je serais moi aussi intéressé pour avoir la procédure à suivre. La synthèse avec seulement espeak n’est vraiment pas très jolie.
      Merci

    • Le 27 août 2012 à 20:43, par Oliv’ En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      En fait seul Mbrola tourne dans l’environnement chroot. Espeak est bien exécuté dans la distrib principale mais doit être recompilé à une ancienne version car désormais le programme fait un appel direct à Mbrola.

      Si dessous les commandes utilisées, si vous avez des questions n’hésitez pas :

      Deboostrap (à faire en root)

      mkdir /hombe/debian-chroot
      apt-get install deboostrap

      debootstrap —arch=armel —variant=minbase wheezy /home/debian-chroot/ http://ftp2.fr.debian.org/debian/

      nano /etc/fstab

      # Debian chroot

      /tmp /home/debian-chroot/tmp none bind 0 0

      /dev /home/debian-chroot/dev none rbind 0 0

      /proc /home/debian-chroot/proc none bind 0 0


      Pour Mbrola il suffit de copier les fichiers au bon endroit

      Espeak

      wget http://sourceforge.net/projects/espeak/files/espeak/espeak-1.43/espeak-1.43.03-source.zip/download

      unzip download

      rm download

      apt-get install portaudio19-dev libsonic0

      cd espeak-1.43.03-source/src/

      cp portaudio19.h portaudio.h

      make

      sudo make install

      Pour l’utilisation, j’ai fait un petit script :

      # !/bin/bash

      if [ "$#" -ne 1 ]

      then

      printf "Usage ./speak \"Text to speak\"\n"

      else

      sudo espeak -q -v mb/mb-fr1 "$1" | sudo chroot /home/debian-chroot mbrol
      a /usr/share/mbrola/voices/fr1 - - | aplay -r16000 -fS16

      fi

      Julien : C’est dommage de ne pas pouvoir faire un simple retour à la ligne dans l’éditeur ;)

    • Le 28 août 2012 à 01:30, par Julien H. En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Excellent, j’ai hâte de tester !!

      Merci d’avoir décrit les étapes. Pour les retours à la ligne, je pense que
      fonctionne (retour à la ligne br en code html).

      Mais je te rassure, la rédaction des articles est beaucoup plus facile que les commentaires.

    • Le 26 janvier 2013 à 08:50, par Seb En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Bonjour

      Je ne comprends pas "Pour Mbrola il suffit de copier les fichiers au bon endroit".

      Cela veut dire que l’on laisse mbrola dans /usr/bin et les voix dans /usr/share ? Ou alors doit on le placer ailleurs ?

      Merci d’avance pour les précisions !

    Répondre à ce message

  • Le 4 novembre 2012 à 19:19, par Franck En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

    Bonjour,
    Je n’arrive à faire prononcer les "é" et "è" correctement. Espeak me prononce "e accent aigu" ou "e accent grave" alors qu’il prononce correctement les "à". Y a-t-il une manipulation à faire ? J’ai mis locale en fr utf8 comme précisé en haut du tutoriel.

    Merci

    • Le 5 novembre 2012 à 14:11, par Julien H. En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

      Dans un mot ou en lettre seule ? C’est étonnant qu’il détecte bien ces lettres (puisqu’il dit qu’il voit l’accent) mais qu’il n’ait pas de correspondance vocale.

      Il y a peut être une option, je ne connais pas assez bien. Quelle version de espeak ?

    Répondre à ce message

  • Le 30 septembre 2012 à 12:51, par Yorm En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

    Si vous avez l’erreur : aplay : audio open error : Device or resource busy

    Aller sur ce site : http://stray-notes.blogspot.fr/2010/12/aplay-device-or-resource-busy.html

    Pour réduire la vitesse d’élocution :
    Espeak -vmb/mb-fr1 -f exemple.txt | mbrola -t 1.2 /usr/share/mbrola/voices/fr1 - - | aplay -r16000 -fs16

    Jai simplement rajouter la commande -t 1.2 (faites variez se chiffre pour aller plus ou moin vite)

    Répondre à ce message

  • Le 1er septembre 2012 à 14:39, par Franck En réponse à : Synthèse vocale avec espeak et mbrola sur Raspberry Pi

    Bonjour,
    En fait il est plus simple de faire tourner espeak et mbrola sur la soft-float wheezy (pas de recompilation nécessaire). Cependant je n’arrive pas à supprimer les scratchs dont vous parlez, quelle est-la solution ?

    Merci

    Répondre à ce message

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document