Club robotique de Sophia-Antipolis

Accueil > Robopedia > Constituants > Les ordinateurs embarqués > 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 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

    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 !

    Répondre à ce message

    • 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.

      Répondre à ce message

      • 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 !

        Répondre à ce message

    • 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.

      Répondre à ce message

      • 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

        Répondre à ce message

        • 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.

          Répondre à ce message

          • 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.

            Répondre à ce message

            • 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).

              Répondre à ce message

            • 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

              Répondre à ce message

              • 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 ;)

                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

  • 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 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

    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