Comment faire lire du texte à la Raspberry Pi avec eSpeak.

Faire parler la Raspberry

En informatique, le problème de l’interface utilisateur est probablement un des plus compliqués. Ça, nommer des trucs, et invalider un cache…

La façon la plus simple de présenter de l’information à un humain depuis un ordinateur est généralement d’utiliser la vision. Mais pour ça il faut un écran, ce qui est encombrant, cher et donc pas très adapté à un usage embarqué.

Dans ce tutoriel, nous allons voir comment utiliser l’audition de votre utilisateur plutôt que sa vision, en faisant prononcer du texte par votre Raspberry Pi grâce au logiciel eSpeak, ce que l’on appel le Text To Speech.

Le matériel pour faire parler la Raspberry Pi

Pour pouvoir faire parler votre Raspberry Pi nous allons avoir besoin du matériel suivant :

Installer eSpeak sur la Raspberry Pi

Pour faire parler votre Raspberry Pi nous allons utiliser le logiciel eSpeak, un logiciel open source de synthèse vocale.

Le principe de eSpeak est le suivant : vous lui donnez du texte (une chaîne de caractères, un fichier, etc.) et il va le découper en phonèmes (les plus petits sons qui forment une langue parlée), puis utiliser tout un ensemble de techniques pour transformer ces phonèmes en véritables fichiers sons.

Pour installer eSpeak sur la Raspberry Pi c’est assez simple puisqu’il est déjà présent dans les dépôts. Il nous suffit donc de mettre à jour les dépôts et de demander l’installation d’eSpeak :

sudo apt update
sudo apt install espeak -y

Lire une phrase avec eSpeak

Maintenant que eSpeak est installé, nous allons pouvoir lui faire lire une première phrase. Mais avant cela, nous allons nous assurer que le son sorte bien sur le port Jack de notre Raspberry Pi pour arriver jusqu’à nos enceintes.

Pour cela, lancez la commande sudo raspi-config, puis allez « Advanced Options », « Audio », « Force 3.5mm (‘headphone’) jack » et enfin « Finish ».

Nous allons créer un dossier espeak dans le répertoire de l’utilisateur télécharger un fichier audio et le jouer pour vérifier que tout fonctionne correctement :

mkdir /home/pi/espeak
cd /home/pi/espeak
wget https://raspberry-pi.fr/download/espeak/test.mp3 -O test.mp3
ffplay -nodisp test.mp3

Vous devriez entendre jouer une gamme en do majeur.

Maintenant, que nous savons que les enceintes fonctionnent, nous allons demander à eSpeak de dire la phrase « Les framboises sont perchées sur le tabouret de mon grand-père. ». Pour cela, on utilise la commande ci-dessous :

espeak -a 200 -v fr+f3 "Les framboises sont perchées sur le tabouret de mon grand-père." --stdout | aplay

Ce qui nous donne quelque chose comme ça…

Alors oui, la voix est immonde, mais nous allons améliorer ça par la suite.

Faisons un peu le tour de la commande pour essayer de comprendre :

  • espeak lance le programme espeak
  • -a 200 indique le volume à utiliser pour le son. Il va de 0 à 200 et est à 100 par défaut.
  • -v fr+f3 nous indique la langue à utiliser. fr correspond à la langue française, +f3 indique que nous voulons utiliser la troisième variation de voix féminine proposée par eSpeak. Pensez bien à adapter le code langue à votre texte.
  • La phrase entre guillemets est celle qui sera prononcée par eSpeak. À la place, nous aurions également pu lui demander de lire un fichier texte en passant -f le_chemin/du/fichier.txt.
  • --stdout indique à eSpeak que plutôt que de lire directement l’audio, il doit envoyer les données générées dans la sortie standard du terminal.
  • | aplay indique quand à lui que la sortie générée par eSpeak va être redirigée en entrée du programme aplay, qui est un programme permettant de lire des fichiers audio au format Wave, celui généré par eSpeak. Notez qu’à la place on pourrait utiliser > mon_fichier.wav pour sauvegarder la sortie audio dans un fichier.

Comme vous pouvez le voir, ce n’est pas eSpeak mais aplay qui joue le son. La raison pour cela est très simple, espeak est bugué sur la Raspberry Pi depuis quelques versions…

Quelques lignes de bugs de espeak.
And that, my friend, its what we call « a bug »…

Si vous essayer de faire parler eSpeak directement vous aurez des erreurs liées à Alsa, le serveur de sons de la Raspberry Pi. La solution la plus simple est donc d’envoyer les données dans aplay qui, lui, fonctionne parfaitement. Au final ça fonctionne et c’est tout ce qui compte.

Améliorer la voix de eSpeak en installant MBROLA sur la Raspberry.

Comme vous avez pu le constater, les voix générées par eSpeak sont absolument immondes. Pas de panique, nous avons une solution pour améliorer ça.

Je l’ai évoqué au début de l’article, eSpeak est capable de générer des phonèmes, ces morceaux de sons constituant une langue parlée. Et, il se trouve qu’il existe d’autres programmes capables de lire ces phonèmes et de les prononcer, et ce de façon bien plus convaincante que eSpeak !

Dans notre cas, nous allons utiliser le logiciel MBROLA, un projet collaboratif mondial initié par la faculté polytechnique de Mons, en Belgique, qui vise à concevoir une immense base de données pour la synthèse vocale.

Chose un peu étrange le logiciel MBROLA n’est pas disponible dans les dépôts Raspbian, alors que les données de langues, elles, le sont. Ce qui a pour conséquence de rendre l’installation de ces données de langues impossible…

Même Kevin Hart trouver que c'est bugué !
What the what ?

Ne vous en faîtes pas, nous avons la solution ! En effet, une bonne âme a eu la bonté de créer elle même un paquet MBROLA pour la Raspberry Pi, et nous avons donc décidé de créer un miroir sur le site.

Nous allons donc télécharger et installer ce paquet avec les commandes ci-dessous :

cd ~/espeak
wget https://raspberry-pi.fr/download/espeak/mbrola3.0.1h_armhf.deb -O mbrola.deb
sudo dpkg -i mbrola.deb

Et maintenant que MBROLA est installé, nous allons pouvoir télécharger les fichiers de langue dont nous avons besoin. Pour moi ce sera donc mbrola-fr1, c’est à dire la première voix française. Adaptez donc la commande à votre langue.

sudo apt install mbrola-fr1 -y

Il ne nous reste plus qu’à reprendre notre commande eSpeak précédente et à l’adapter pour générer des phonèmes et les faire lire par MBROLA. Ce qui va nous donner la commande ci-dessous.

espeak -a 200 -v mb-fr1 -s 150 "Les framboises sont perchées sur le tabouret de mon grand-père." --stdout | aplay

Ce qui nous donne l’audio ci-dessous :

Bien entendu, on sent toujours qu’il s’agit d’un robot. Mais avouez qu’il y a quand même du mieux !

Vous retrouvez en partie les mêmes paramètres que précédemment, mais avec deux changements :

  • -v mb-fr1 indique que nous voulons utiliser MBROLA pour générer le fichier audio mb, et la voix française numéro 1 -fr1.
  • -s 150 indique quand à lui que l’on souhaite générer le fichier à une vitesse de 150 mots par minutes. La valeur par défaut est de 165, mais je trouve ça un peu rapide, du moins pour le français.

Comme précédemment, vous pouvez bien entendu modifier la commande pour créer un fichier, lire le texte depuis un fichier txt, etc.

En combinant ces commandes avec des choses comme la lecture de badge RFID et autres, vous pouvez facilement créer des systèmes embarqués proposant des interfaces relativement complètes.

Bien entendu on est encore loin d’une voix humaine et sachez qu’il existe de meilleurs moteurs « Text to Speech », comme le TTS de Mozilla développé dans le cadre du projet Common Voice. Néanmoins, MBROLA et eSpeak offrent un bon compromis entre simplicité d’utilisation, rapidité d’exécution et efficacité.

Lire l'article complet : Comment faire lire du texte à la Raspberry Pi avec eSpeak.

Vus : 100
Publié par RaspbianFrance : 96