4.4 SYNTHÈSE VOCALE

 

 

INTRODUCTION

 

La synthèse vocale consiste à faire parler l’ordinateur avec une voix humaine. Un système de synthèse vocale (TTS = text-to-speech) convertit du texte en une sortie vocal. Prononcer un texte avec une voix synthétique qui semble naturelle est un problème très complexe dans lequel des avancées considérables ont été réalisées ces dernières années. Par rapport à la restitution d’un texte par lectures successives de clips sonores préenregistrés pour chacun des mots, les systèmes de synthèse vocale présentent l’avantage d’être très flexibles et de pouvoir lire n’importe quel texte. La synthèse vocale fait partie du domaine de la linguistique informatique. Le développement d’un système de synthèse vocale demande de ce fait une collaboration étroite entre linguistes et informaticiens.

Le système de synthèse vocale utilisé dans TigerJython est appelé MaryTTSet est développé au département de linguistique informatique et phonétique de l’université de Saarland en Allemagne.

Ce système utilise de très grosses bibliothèques sonores qu’il est nécessaire de télécharger séparément depuis ce lien et de décompresser dans le sous-dossier Lib du dossier dans lequel se trouve l’archive tigerjython2.jar.

CONCEPTS DE PROGRAMMATION: Langage artificiel, synthèse vocale

 

 

PARLER UN TEXTE EN 4 LANGUES

 

Les versions récentes de MaryTTS sont capables de synthétiser de nombreuses langues différentes, en particulier le français, l’allemand, l’italien et l’anglais. Pour chacune des langues, on peut choisir une voix féminine ou masculine à l’aide de la fonction selectVoice(). Il est ensuite possible d’appeler la fonction generateVoice() en lui transmettant le texte à prononcer sous forme de chaîne de caractères. Cette fonction retourne une liste contenant les échantillons sonores générés qu’il est possible de jouer à l’aide du lecteur audio.

from soundsystem import *

initTTS()

selectVoice("german-man")
#selectVoice("german-woman")
#selectVoice("english-man")
#selectVoice("english-woman")
#selectVoice("french-woman")
#selectVoice("french-man")
#selectVoice("italian-woman")

text = "Danke dass du mir eine Sprache gibst. Viel Spass beim Programmieren" 
#text = "Thank you to give me a voice. Enjoy programming" 
#text = "Merci pour me donner une voix. Profitez de la programmation"
#text = "Grazie che tu mi dia una lingua. Godere della programmazione"
voice = generateVoice(text)
openSoundPlayer(voice)
play()  
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Amusez-vous à lire le texte à l’aide des différentes voix en commentant / décommentant les différentes lignes. Il est toujours nécessaire de commencer par appeler la fonction initTTS() pour initialiser le système de synthèse vocale.

Il est également possible d’indiquer à la fonction initTTS() le chemin du dossier contenant les fichiers de données de MaryTTS. Par défaut, il s’agit du sous-dossier Lib.

 

 

ANNONCER LA DATE ET L’HEURE ACTUELLE

 

On peut citer de nombreuses applications de la synthèse locale. L’ordinateur peut par exemple prononcer des textes pour les personnes mal voyantes. Les annonces faites dans les trains ou les gares sont généralement des voix synthétiques. De nombreux jeux vidéo interactifs reposent sur des voix artificielles. Le programme suivant détermine l’heure actuelle en interrogeant le système d’exploitation puis l’annonce à haute voix, en français, allemand ou anglais.

from soundsystem import *
import datetime

language = "german"
#language = "english"
#language = "french"

initTTS()
if language == "german":
    selectVoice("german-woman")
    month = ["Januar", "Februar", "März", "April", "Mai", 
        "Juni", "Juli", "August", "September", "Oktober", 
        "November", "Dezember"]
if language == "english":
    selectVoice("english-man")
    month = ["January", "February", "March", "April", "May", 
        "June", "July", "August", "September", "October", 
        "November", "December"]
        
if language == "french":
    selectVoice("french-man")
    month = ["Janvier", "Février", "Mars", "Avril", "Mai", 
        "Juin", "Juillet", "Aout", "Septembre", "Octobre", 
        "Novembre", "Décembre"]      

now = datetime.datetime.now()

if language == "german":
    text = "Heute ist der " + str(now.day) + ". " \
        + month[now.month - 1] + " " + str(now.year) + ".\n" \
        + "Die genaue Zeit ist " + str(now.hour) + " Uhr " + str(now.minute)
if language == "english":
    text = "Today we have  " + month[now.month - 1] + " "  \
        + str(now.day) + ", "+ str(now.year) + ".\n" \
        + "The time is " + str(now.hour) + " hours " + str(now.minute) \
        + " minutes."
if language == "french":
    text = "Nous sommes le " + str(now.day) + " " \
        + month[now.month - 1] + " " + str(now.year) + ".\n" \
        + "Il est exactement " + str(now.hour) + " heures " \
        + str(now.minute) + " minutes."
print(text)
voice = generateVoice(text)
openSoundPlayer(voice)
play()
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMO

 

Les commentaires permettent de sélectionner la langue de lecture. La classe datetime.datetime.now() fournit des informations concernant l’heure et la date actuelles grâce aux attributs year, month, day, hour, minute, second, et microsecond.

Comme vous pouvez l’observer, il est possible d’étendre une expression Python sur plusieurs lignes en utilisant des caractères de backslash. Cette technique est particulièrement utile pour écrire de longues concaténations de chaines de caractères de manière plus lisible.

 

 

CRÉER SA PROPRE INTERFACE GRAPHIQUE

 

Comme nous l’avons déjà vu au chapitre 3.13, il est relativement simple de créer une boîte de dialogue élémentaire à l’aide de la classe EntryDialog de TigerJython. Comme c’est le cas dans de très nombreux environnements de programmation, les contrôles classiques tels que les champs textuels, les boutons, les boutons à cocher, les boutons radio ainsi que les curseurs sont modélisés par des objets logiciels qui apparaissent dans un panneau rectangulaire. La boîte de dialogue reste ouverte tant que le programme s’exécute (boîte de dialogue non modale). Pour de plus amples informations, consulter la documentation APLU.

Le programme ouvre une boîte de dialogue non modale permettant de sélectionner la langue de lecture. Lors du clic sur le bouton de confirmation, le texte figurant dans le champ textuel est prononcé par la voix sélectionnée.


from soundsystem import *
from entrydialog import *

speaker1 = RadioEntry("Mann (Deutsch)")
speaker1.setValue(True)
speaker2 = RadioEntry("Man (English)")
speaker3 = RadioEntry("Homme (Français)")
speaker4 = RadioEntry("Donna (Italiano)")
pane1 = EntryPane("Speaker Selection", 
                   speaker1, speaker2, speaker3, speaker4)
textEntry = StringEntry("Message:", "Viel Spass am Programmieren")
pane2 = EntryPane(textEntry)
okButton = ButtonEntry("Speak")
pane3 = EntryPane(okButton)
dlg = EntryDialog(pane1, pane2, pane3)
dlg.setTitle("Synthetic Voice")

initTTS()

while not dlg.isDisposed():
    if speaker1.isTouched():
        textEntry.setValue("Viel Spass am Programmieren")
    elif speaker2.isTouched():
        textEntry.setValue("Enjoy programming")
    elif speaker3.isTouched():
        textEntry.setValue("Profitez de la programmation")
    elif speaker4.isTouched():
        textEntry.setValue("Godere della programmazione")
                
    if okButton.isTouched():
        if speaker1.getValue():
            selectVoice("german-man")
            text = textEntry.getValue()
        elif speaker2.getValue():
            selectVoice("english-man")
            text = textEntry.getValue()
        elif speaker3.getValue():
            selectVoice("french-man")
            text = textEntry.getValue()
        elif speaker4.getValue():
            selectVoice("italian-woman")
            text = textEntry.getValue()
        if text != "":
            voice = generateVoice(text)
            openSoundPlayer(voice)
            play()  
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

La boucle while s’exécute jusqu’à ce que la boîte de dialogue soit fermée à l’aide du bouton « fermer » de la barre de titre. Lors de chaque cycle de la boucle, la fonction isTouched() permet de déterminer si le bouton de confirmation a été cliqué depuis le dernier appel de la fonction. Si tel est le cas, on récupère la valeur des éléments graphiques (champ textuel et boutons radio) en appelant la fonction getValue() et en prononçant la chaine de caractères contenue dans le champ textuel à l’aide du système de synthèse vocale, exactement comme dans les exemples précédents.

Il est dangereux de laisser l’ordinateur foncer tête baissée dans une boucle aussi « serrée » ne faisant pratiquement rien d’autre que de tester si le bouton a été enfoncé ou non. Heureusement, l’appel de la fonction isTouched() met automatiquement le programme en pause pour une courte période (1 milliseconde) de telle sorte que le parcours de la boucle ne soit pas inutilement trop fréquent.

 

 

EXERCICES

 

1.


Écrire un poème français dans un fichier texte, par exemple :

Autrefois tout le monde croyait aux dragons, Jack Prelutsky (poème original)

Autrefois tout le monde croyait aux dragons,
Quand le monde était tout neuf et beau,
On nous mettait dans des légendes,
On faisait des récits, on chantait des chansons,
On nous traitait avec respect,
Les gens nous honoraient, les gens nous redoutaient,
Mais un jour ils ont cessé d'y croire
Depuis ce jour, nous avons disparu.
Aujourd'hui, on dit que nous avons fait notre temps,
que nous avons vécu,
On nous traite avec dérision
Nous qui, autrefois, étions des rois.
Mais il faudra bien qu'un jour ils se souviennent,
Que, d'une façon ou d'une autre, on leur révèle
Que notre esprit est éternel
Nous sommes des dragons ! Nous existons !

             Jack Prelutsky (Télécharger)

La ligne line text = open("dragon.txt", "r").read() permet de lire le texte depuis le fichier texte dragon.txt  situé dans le même dossier que le programme et de le stocker dans la chaine de caractères text. Faire en sorte que le texte soit lu en français.


2.


Définir de manière récursive ou itérative la fonction fac(n) retournant la factorielle de n

n! = 1 * 2 * ... *n

Votre programme doit demander à l’utilisateur un nombre entre 1 et 10 à l’aide de readInt() en prononçant également la question à haute voix en français. Le programme doit ensuite calculer la factorielle n! du nombre saisi et annoncer le résultat à haute voix.