Outils pour utilisateurs

Outils du site


numeriser_jean_de_la_fontaine

Ceci est une ancienne révision du document !


Numériser Jean de La Fontaine

Contexte

Dans le cadre du Bestiaire d'Intelligences Artificielles, nous avons décidé de ressusciter ce fameux Jean de La Fontaine.

C'est Serge qui a fait le plus gros du travail en défrichant la technologie aitextgen, qui utilise Python et la GPT2 afin de proposer une intelligence artificielle capable de produire du texte à partir d'un corpus de base, en imitant le style et le vocable de l'auteur original.

Dans notre cas, c'est donc l'auteur des fables qui a été choisi pour ce cruel exercice.

Je suis parti assez rapidement sur le projet, sans prendre trop le temps de me renseigner sur les technologies manipulées. Vous pardonnerez donc les lacunes explicatives des étapes qui suivent.

Installaton d'aitextgen

J'ai pour ce faire utilisé les instructions de Serge, présentes sur la page Bestiaire IA Fables de la Fontaine.

Pour des raisons pratiques, on commence par mettre-à-jour pip et installer le module d'environnement virtuel de Python :

# Installation et Mise à jour du module pip
sudo apt install python3-pip
python3 -m pip install --upgrade pip
# Installation de venv
sudo apt install python3-venv

pip permet d'installer de manière simple les différentes librairies Python. Quand à l'environnement virtuel, il permet de faire cohabiter plusieurs projets Python en parallèle dont les librairies seraient contradictoires (par exemple si deux versions différentes d'une même librairie sont nécessaires à deux projets). Plus d'info sur ces sujets, en anglais, ici.

Après cela, une fois dans le bon dossier ( par exemple /home/machin/projets ), nous clonons le répertoire de Serge depuis git, ce qui nous facilite toute l'installation. Attention, il y a 2Go à télécharger, c'est un peu long :

git clone https://github.com/sergeLabo/La_Fontaine
# Allez dans le dossier des sources
cd ./La_Fontaine
python3 -m venv mon_env
source mon_env/bin/activate
python3 -m pip install -r requirements.txt

Vous pouvez voir qu'après avoir récupéré le dossier, nous mettons en place l'environnement virtuel. De fait, à partir de maintenant, nous n'utiliserons plus la commande Python de base, mais nous appellerons le binaire de l'environnement virtuel :

./mon_env/bin/python3 mon_fichier.py

Entraîner l'intelligence artificielle à partir d'un corpus

Vous pourrez trouver le corpus qui a servi de base d'entraînement pour ce projet : fables.txt. J'ai essayé à partir d'un autre corpus : l'Éthique de Spinoza. Le résultat était aussi chiant que l'original.

Il vous faudra donc avoir un fichier texte qui contient le modèle textuel à calquer. Attention, plus celui-ci est grand, mieux cela fonctionne. Et quand je dis grand, j'entends bien démesurément grand… Les modèles des Fables, ou de l'Éthique, qui fait pourtant 150 pages, sont beaucoup trop petit pour entraîner de manière correcte le modèle. C'est comme ça.

Il sera souvent nécessaire de retoucher le fichier texte avant l'entraînement. Dans le cas de l'Éthique, les numéros de pages étaient encore présent dans le fichier texte, je les ai donc supprimés. Il y avait également des césures à la plupart des sauts de lignes… Je n'ai pas eu le courage de trouver l'algorithme pour les corriger. Il n'apparaissaient pas dans les textes générés mais je pense qu'ils ont limité l'apprentissage. De la même manière, il faut supprimer les notes de bas de pages, les légendes des dessins, etc.

Une fois votre corpus enregistré en fichier texte dans le dossier, voici le script python qui permet de ré-entraîner le modèle :

text_training.py
from aitextgen.TokenDataset import TokenDataset
from aitextgen.tokenizers import train_tokenizer
from aitextgen.utils import GPT2ConfigCPU
from aitextgen import aitextgen
 
# The name of the downloaded text for training
file_name = "fables.txt"
 
# Train a custom BPE Tokenizer on the downloaded text
# This will save one file: `aitextgen.tokenizer.json`, which contains the
# information needed to rebuild the tokenizer.
train_tokenizer(file_name)
tokenizer_file = "aitextgen.tokenizer.json"
 
# GPT2ConfigCPU is a mini variant of GPT-2 optimized for CPU-training
# e.g. the # of input tokens here is 64 vs. 1024 for base GPT-2.
config = GPT2ConfigCPU()
 
# Instantiate aitextgen using the created tokenizer and config
ai = aitextgen(tokenizer_file=tokenizer_file, config=config)
 
# You can build datasets for training by creating TokenDatasets,
# which automatically processes the dataset with the appropriate size.
data = TokenDataset(file_name, tokenizer_file=tokenizer_file, block_size=64)
 
# Train the model! It will save pytorch_model.bin periodically and after completion to the `trained_model` folder.
ai.train(data, batch_size=8, num_steps=50000, generate_every=5000, save_every=5000)

Il faut spécifier le fichier texte du corpus à la ligne 7 .

D'autres configurations sont possibles, ici c'est la version qui utilise le CPU. Sur ma machine, équipée d'un Core I5 9th Gen, les entraînements pour les Fables et l'Éthique ont pris un peu plus d'une heure.

Générer du texte à partir d'un modèle

Voici maintenant le fichier utilisé pour générer du texte à partir du modèle. Je n'ai pas encore regardé comment modifier les paramètres, mais cela ne doit pas être trop difficile :

textgen.py
from aitextgen import aitextgen
 
ai = aitextgen(model_folder="trained_model",
                tokenizer_file="aitextgen.tokenizer.json")
 
ai.generate(1, prompt="")

Pour l'utiliser, je n'affiche pas le texte dans le terminal, mais le redirige vers un fichier nommé text.txt :

./mon_env/bin/python3 textgen.py > text.txt

Un exemple de texte généré :

La Grenouille  - La Fontaine

		L'Aigle et le Singe aperçut
De son ami-là : votre sens y prompt ;
De quoi cette Science eut un fardeau pendu.

C'est du grand portnawak, c'est parfait.

Vocalisation

Maintenant que le plus important est fait, à savoir, d'une certaine manière, avoir mis en place le contexte cérébral de ce petit Jean, il faut commencer à l'incarner.

La première étape est de pouvoir le faire dicter ses nouvelles fables, en utilisant un logiciel de synthèse sonore, en anglais Text To Speech, souvent abrévié TTS.

La ressource principale que j'ai trouvée, sur ce sujet et concernant les logiciels libres, est la documentation Ubuntu. Cependant, Manu a également trouvé un logiciel pertinent développé par une fondation bien connue : Mozilla TTS.

De manière succincte, voici les résultats auxquels j'ai abouti pour ces logiciels. Je n'ai pas essayé festival.

Premièrement, espeak. C'est presque un artefact des anciens temps, tant la voix est robotisée. On n'y comprends pas grand chose et c'est très moche :

espeak -v fr -f text.txt

Concernant svoxpico, la voix est meilleure qu'espeak, ce qui n'est pas bien difficile au final. Elle hoquette quelque peu mais cela lui confère un certain charme. Par contre elle est uniquement féminine en langue française :

pico2wave -l fr-FR -w text.wav < text.txt && play text.wav

Avec Mozilla TTS, les résultats sont plus probants, même s'il y a quelques cafouillis par-ci par-là. Mais là encore, seules des voix féminines sont disponibles :

tts --text "$(cat text.txt)" --model_name tts_models/fr/mai/tacotron2-DDC --vocoder_name vocoder_models/universal/libri-tts/fullband-melgan && play tts_output.wav

De fait, la solution que j'ai finalement retenue se sert d'espeak ! Mais en conjonction avec un autre logiciel, qui s'appelle mbrola. Je l'ai installé, ainsi que l'ensemble des voix françaises, via cette commande :

sudo apt-get install mbrola mbrola-fr*

Cette fois-ci, nous utilisons espeak pour générer un fichier de phonèmes, puis nous utilisons les vocoders de mbrola pour les lire :

espeak -q -s 100 -v mb/mb-fr1 -f text.txt --pho --phonout=text.pho && mbrola /usr/share/mbrola/fr6/fr6 text.pho text.wav && play text.wav

Étrangement, cela ne marche pas avec l'argument -v fr d'espeak, il faut utiliser -v mb/mb-fr1 à la place.

Pour changer de vocoder, il faut spécifier le chemin de celui-ci dans la commande mbrola. Dans le cas précédent, c'est le chemin /usr/share/mbrola/fr6/fr6 qui le spécifie.

Cette fois-ci, nous avons une voix masculine d'assez bonne qualité, ce qui me satisfait.

Quoi ma gueule ?

Il faut maintenant associer la voix à un visage. Pour ce faire, un petit tour sur le net et un copier-coller d'un tableau représentatif de l'écrivain.

Mais ce n'est pas tout, j'aimerai bien pouvoir l'animer un tantinet. Mon idée était de singer l'intelligence artificielle et la culture française en transformant Jidéhéléf en pantin. À l'aide de GIMP, j'ai donc séparé le tableau original en plusieurs parties faciles à animer :

[EN CONSTRUCTION]

numeriser_jean_de_la_fontaine.1646649892.txt.gz · Dernière modification : 2022/03/07 10:44 de Simon Deplat