Un robot EV3 qui parle

Comme évoqué dans l'article traitant de la classe Sound de la bibliothèque ev3dev2, celle-ci dispose d'une méthode speak() permettant à la brique EV3 de prononcer un texte fourni en paramètre.

Methode speak()

La méthode speak() utilise le narrateur Linux Debian espeak lancé normalement en ligne de commande. La méthode est déclarée comme ci-dessous  :
speak(text, espeak_opts='-a 200 -s 130', volume=100, play_type=0)
Les paramètres passés sont les suivants :
  • text est la chaîne de caractères à afficher.
  • espeak_opts est un paramètre de type chaîne de caractères qui permet de passer les options de la ligne de commande de l'instruction espeak
  • volume est exprimé en % et permet de régler le volume du son.
  • play_type définit ce que fait le programme pendant que le son est joué.
Voici un exemple simple de l'utilisation de cette méthode :
#!/usr/bin/env python3

from ev3dev2.sound import Sound

HP = Sound()


HP.speak("Bonjour tout le monde !")

Paramétrer le narrateur avec un accent français

En exécutant le programme ci-dessus, on constate que la voix synthétique s'exprime de façon presque inintelligible avec un fort accent anglais. En effet, par défaut, le narrateur espeak est paramétré pour utiliser une voix anglaise.
Heureusement, la commande espeak de Linux dispose de plusieurs voix adaptées à différents langages. Pour utiliser une voix française, il faut utiliser l'option -v fr. C'est là que l'on constate l'intérêt du paramètre espeak_opts. Celui-ci permet de passer des options, normalement utilisées en ligne de commande de la commande espeak,  à la méthode speak() de la classe Sound. Le problème est que ce paramètre possède déjà une valeur par défaut (-a 200 -s 130). Il faut donc absolument répéter aussi ces paramètres lorsqu'on modifie une voix exotique.
Voici un exemple d'utilisation de la méthode speak() avec une voix française :
#!/usr/bin/env python3

from ev3dev2.sound import Sound

HP = Sound()

HP.speak("Hello world !")

HP.speak("Bonjour tout le monde !", espeak_opts="-v fr -a 200 -s 130")

Faire lire un fichier par la méthode speak()

La syntaxe utilisée ci-dessus, consistant à mettre en dur le texte à lire dans le code risque de rendre difficile à maintenir l'application qui utilise le narrateur. Aussi, c'est une bonne pratique que d'isoler le texte à prononcer dans un fichier, que l'on rangerait dans le répertoire res au coté des autres ressources multimédia.
Pour cela, le paramètre espeak_opts va être utilisé pour passer le nom du fichier à lire avec l'option -f de la commande espeak.
Dans l'exemple ci-dessous, la fable de La Fontaine — Le Corbeau et le Renard — est stockée dans un fichier corbeau-renard.txt lui-même rangé dans le répertoire res où se trouvent rassemblées les ressources multimédia. Le fichier est passé à la méthode speak() via l'option -f du paramètre espeak_opts. A remarquer que le paramètre  obligatoire text de la méthode speak(), inutile puisque le texte est lu à partir du fichier, est une chaîne de caractères vide. 
#!/usr/bin/env python3

from ev3dev2.sound import Sound

HP = Sound()

HP.speak("", espeak_opts="-v fr -a 200 -s 130 -f res/corbeau_renard.txt")

Contenu du fichier corbeau-renard.txt :
Maître Corbeau, sur un arbre perché,
Tenait en son bec un fromage.
Maître Renard, par l'odeur alléché,
Lui tint à peu près ce langage :
Et bonjour, Monsieur du Corbeau.
Que vous êtes joli ! que vous me semblez beau !
Sans mentir, si votre ramage
Se rapporte à votre plumage,
Vous êtes le Phénix des hôtes de ces bois.
À ces mots, le Corbeau ne se sent pas de joie ;
Et pour montrer sa belle voix,
Il ouvre un large bec, laisse tomber sa proie.
Le Renard s'en saisit, et dit : Mon bon Monsieur,
Apprenez que tout flatteur
Vit aux dépens de celui qui l'écoute.
Cette leçon vaut bien un fromage, sans doute.
Le Corbeau honteux et confus
Jura, mais un peu tard, qu'on ne l'y prendrait plus.

La commande espeak

Options utilisables dans le paramètre espeak_opts de méthode speak()

L'option espeak-opts de la méthode speak() permet de passer les paramètres de la commande espeak. Voici une liste (non exhaustive) des paramètres utilisables dans espeak_opts :
  • -a <nnn> désigne le niveau sonore de la voix. nnn doit être compris entre 0 et 200. La valeur par défaut est 100. Cette option fait double emploi avec le paramètre volume de la méthode speak(). Aussi faut-il monter cette option au maximum (valeur 200) et ajuster le volume via la méthode speak().
  • -f <fichier> permet de faire lire le contenu d'un fichier par le narrateur. Cela permet d'isoler le texte à prononcer du code Python pour faciliter la maintenance. 
  • -p <nn> désigne le ton de la voix. nn doit être compris entre 0 (voix la plus grave) à 99 (voix la plus aiguë).
  • -s <nnn> désigne le nombre de mots par minute. La valeur par défaut est 160, ce qui trop rapide pour la langue française. Il vaut mieux modifier ce paramètre à 130 dont le débit convient parfaitement au français.
  • -v <voix> désigne la voix utilisée. Pour la langue française, il faut utiliser -v fr.
La commande espeak dispose d'un grand nombre de voix pour quasiment toutes les langues. Dans la version Linux de la distribution ev3dev2, les voix sont se trouvent dans le répertoire /usr/lib/arm-linux-gnueabi/espeak-data/voices. Ce répertoire contient lui-même des sous-répertoires proposant des voix supplémentaires peut-être plus humaines (comme celles contenues dans le sous-répertoire mb relative au narrateur MBrola) . Cependant, la qualité du haut-parleur de la brique EV3 ne permet pas d'en exploiter toutes les subtilités. Mais qu'un robot EV3 parle comme un robot n'est pas vraiment un problème. 

Modifier la voix par défaut

Il peut paraître fastidieux de devoir spécifier à chaque fois la voix à utiliser. D'autant que cela oblige aussi, du coup, à repréciser les paramètres -a et -s. Aussi est-il assez pratique de modifier la voix par défaut utilisée par le narrateur espeak.
Cela se fait dans le fichier /usr/lib/arm-linux-gnueabi/espeak-data/voices/default. Ce fichier est un fichier texte dans lequel le paramètre en désigne la voix anglaise. Il suffit  d'ouvrir une session SSH sur la brique EV3 pour remplacer en par fr dans ce fichier avec un éditeur de texte comme vi ou nano.
Contenu du fichier /usr/lib/arm-linux-gnueabi/espeak-data/voices/default pour une voix française :
name default
language fr
gender male

Commentaires

Posts les plus consultés de ce blog

Connecter ev3dev2 à Internet en WiFi

Connecter Visual Studio Code à un robot MindStorm EV3 avec ev3dev-browser

Installer les modules EV3DEV2 sur Python