Actions

Projets

Apprendre en Cuisinant

De GBLL, TAL, ALAO, etc.

< M2 IdL — TAL & ALAO/2020-2021

Projet réalisé par Sanda HACHANA et Louis MONGIN

Introduction


Apprendre en Cuisinant est une application ayant pour but d’améliorer la prononciation d’un apprenant en français à travers des recettes de cuisine.

I. Problématique


Selon la langue de l’apprenant, celui-ci aura des difficultés à prononcer correctement des sons français éloignés et/ou inexistants dans sa langue maternelle. Il arrive aussi souvent qu’un locuteur confonde deux phonèmes et ait du mal à les distinguer.

C’est le cas par exemple des phonèmes /y/ et /u/ qui sont souvent confondus par les locuteurs anglophones car ils sont très proches phonétiquement. Il en est de même pour les phonèmes /œ/ et /ø/.

Les voyelles nasales sont également souvent difficiles à prononcer car peu de langages les utilisent.
Il peut être difficile pour un apprenant de savoir si oui ou non sa prononciation d’un mot est correcte sans locuteur natif pour le lui indiquer. Il peut également être frustrant de s'entraîner à parler une langue pour améliorer sa prononciation sans savoir si les sons que l’on produit sont corrects. De plus, de tels exercices de prononciation peuvent être redondants pour l’apprenant et donc le décourager.


II. Notre proposition


L’objectif principal de notre application est de proposer à l’utilisateur de s'entraîner à prononcer les sons qui lui posent des problèmes tout en lui faisant un retour sur sa prononciation.
Cet exercice de prononciation pouvant être redondant, l’apprenant va apprendre à travers des recettes de cuisine. De cette manière, l’application lie l’activité d’apprentissage à une activité amusante et ayant un but défini : cuisiner un plat. Ceci est tout particulièrement utile pour motiver de jeunes enfants à apprendre une langue tout en apprenant l’art de cuisiner.
En plus de cet exercice de production orale, l’utilisateur va pouvoir lire la recette en français et donc entraîner sa compréhension écrite. L’application ne propose pas de traduction de la recette, elle ne sera écrite qu’en français. C’est pourquoi il serait mieux pour l’apprenant d’avoir au moins un niveau A1 pour pouvoir mieux comprendre les recettes et réutiliser les mots. Néanmoins si la recette lue s’avère trop difficile pour l’apprenant ou qu’elle ne lui plaît pas, il aura la possibilité de charger une autre recette, qui sera différente à chaque utilisation. De cette manière, tant que l’utilisateur aime cuisiner, il trouvera une recette qui lui plaît.
Pour finir, l’application propose à l’apprenant des mots variés, de catégories grammaticales différentes. Les mots à prononcer étant choisis aléatoirement, il pourra rencontrer des mots qu’il ne connaît pas et donc améliorer son vocabulaire. L’application est disponible pour tout locuteur souhaitant améliorer son français et découvrir des recettes.



Réflexions

I. EasyAlign et les phonèmes en option


Pour vérifier la prononciation des phonèmes, nous avons décidé d’utiliser Praat et son plugin EasyAlign.
Un mot ne sera jamais prononcé parfaitement par des apprenants. En effet, on retrouve très souvent quelques confusions entre des phonèmes dues à l’accent de la langue maternelle des apprenants. Il faut donc prendre en compte ce point pour éviter de mal évaluer la prononciation de l’apprenant. Pour cela, nous avons choisi de mettre en option certains phonèmes, c’est-à-dire de ne pas les traiter. D'après l’ouvrage de Sylvain Coulange, Remédiation phonétique et phonologique en FLE par une approche multimodale chez les apprenants japonophones, partie 7.1.2 (https://dumas.ccsd.cnrs.fr/dumas-01387387/document, p98), les phonèmes en option sur Praat sont suivis du caractère *.
Quand un phonème peut être confondu avec un ou plusieurs autres phonèmes, on remplace donc ce phonème par tous les phonèmes pouvant être prononcés ici, chacun suivi de * (par exemple, /p/ sera remplacé par /p*b*/).
Nous avons créé une liste de phonèmes qui peuvent être confondus et qui seront automatiquement considérés comme des phonèmes en option.
Il aurait été préférable de faire des listes différentes selon les langues que peut éventuellement parler l’apprenant, mais cela nous aurait pris beaucoup trop de temps.
Cette liste peut être modifiée et complétée dans le script praatrun1.py ligne 27 dans phonoption.

II. Le choix du corpus


Pour notre corpus de recettes, nous avons choisi le site Marmiton qui contient plus de 70 000 recettes, avec de nouvelles recettes qui s’ajoutent régulièrement sur ce site. On obtient donc de cette manière un corpus de recettes dynamique.
Les recettes que nous utilisons dans ce projet proviennent donc toutes de ce site : https://www.marmiton.org
Pour chaque recette affichée après avoir lancé le code, on précise sa provenance en indiquant : “Cette recette vient du site www.marmiton.org ", comme convenu dans les conditions générales d’utilisations de marmiton (https://www.marmiton.org/sp/aide/conditions-generales-utilisation.html)



Développement

I. Contenu des scripts


Le manuel d'utilisation se trouve dans le README.

1. Python


Nous avons utilisé Python pour plusieurs tâches de notre projet.


La première étape consiste à la création d’un script qui permet de faire du web scraping afin de récupérer une recette aléatoirement sur le site marmiton https://www.marmiton.org/.
Pour cela nous avons utilisé la librairie BeautifulSoup. Ce code se trouve dans le script getrecipe.py.
Le site de Marmiton propose une “recette au hasard” dans le menu de la page, notre script récupère donc tout d’abord le lien de cette recette.

Marmiton.png



Ensuite, on récupère les informations de la recette qui nous intéressent, le texte avec les indications ainsi que le titre et les ingrédients. Alors que nous afficherons toutes ces informations à l’utilisateur qui pourra reproduire la recette, nous ne récupérons que le texte pour le choix des mots, pour éviter les erreurs de POS tagging.


Contenu du fichier texte pour CoreNLP VS Contenu de l’invite de commande

Recette.png


Ensuite, nous avons créé un deuxième script qui permet d'annoncer à l’utilisateur quel mot il doit prononcer et d’enregistrer sa prononciation dans un format audio WAV. On retrouve cette partie dans le script record.py. Selon linux ou windows, le code doit légèrement être modifié car les librairies utilisées ne sont pas les mêmes. Le détail des modifications se trouve en commentaire dans le script (l.8-9, l.22-25).


Dans un second temps, nous nous sommes occupés de la partie Praat. Nous avons créé deux scripts Praat (script1.praat et script2.praat) qui effectuent les parties 1 (macro-segmentation), 2 (phonétisation) et 3 (phone-segmentation) de EasyAlign. Dans le premier script on retrouve les deux premières parties de EasyAlign. Il est lancé par le script python praatrun1.py qui va également modifier ce premier textgrid généré afin de modifier la transcription phonétique et d’ajouter les phonèmes options (indiqués par une *).
script2.praat utilise ce textgrid modifié pour faire l’alignement des phonèmes optionnels entre la prononciation de l’utilisateur et la transcription du mot proposée par Praat. C’est praatrun2.py qui va lancer ce second script Praat.
Veillez à modifier les chemins d’installations de Praat et EasyAlign dans les scripts praat (script1.praat et script2.praat).
Quelques lignes sont également à modifier si vous utilisez linux pour lancer le script praat dans praatrun1.py (l.9-16) et praatrun2.py.


Enfin, nous avons créé le script phon.py qui regroupe plusieurs étapes de notre projet. La première est la récupération des phonèmes du mot en SAMPA à partir du textgrid créé grâce aux étapes précédentes sur Praat.
La deuxième étape du script fait la conversion de SAMPA à API à partir du fichier TSV que nous avons créé et qui contient l’équivalent Api/Sampa de chaque phonème.
La troisième étape permet de comparer la prononciation de l'apprenant avec celle du lexique phonétisé. C’est cette dernière étape qui annonce le résultat à l’utilisateur, en lui disant si oui ou non sa prononciation est correcte.

Le script fonction.py est un script contenant des petites fonctions que l’on utilise plusieurs fois dans les scripts principaux. Par exemple, la fonction encod() qui va vérifier l’encoding d’un fichier pour éviter des erreurs.

Le script main.py quant à lui est le script que l’utilisateur va lancer, il va appeler chaque script au fur et à mesure et prendre en charge les demandes de l’utilisateur.

2. Java


Les scripts Java concernent la partie part of speech tagging, pour choisir aléatoirement quatres mots dans notre recette de catégorie grammaticale différente, dans le but d’avoir un vocabulaire diversifié. Pour cela, nous avons utilisé CoreNLP et son POS-tagging.

Dans notre script principal ‘Start’, on lance le pipeline de CoreNLP qui va récupérer le texte de la recette et l’annoter pour détecter les classes grammaticales de chaque mot.
Après ça on va parcourir chaque token du texte et regarder sa catégorie grammaticale pour les classifier selon nom, verbe, adjectif et adverbes. A la fin du parcours on récupère chaque liste de mots et récupère un entier aléatoire grâce au package Random. Cet entier nous permettra de choisir un mot aléatoirement dans chaque liste.
Ce mot sera ajouté dans un fichier (un fichier verbe, un fichier nom, un fichier adjectif et un fichier adverbe) contenant chacun un seul mot de la même catégorie.

Notre deuxième classe java se nomme FichierW et permet de créer un fichier texte et d’écrire à l’intérieur.


II. Difficultés


1. CoreNLP


Nous avons rencontré plusieurs difficultés pour la partie JAVA. Premièrement, nous avons remarqué que le POS-tagging de CORENLP que nous avons utilisé n’est pas tout à fait exact. En effet, la catégorie grammaticale des mots n’est pas fiable.
Voici un exemple ci-dessous avec une liste de verbes relevés par CoreNLP, où on aperçoit des erreurs du POS-tagging :

Liste verbes.png


Pour diminuer ces erreurs nous avons retiré le titre de la recette dans le texte envoyé à CoreNLP puisque le titre qui ne contient pas de verbe et de ponctuation n’est pas correctement analysé par le parser.
Ensuite, nous avons eu des soucis avec ECLIPSE et nous n’avons alors pas pu continuer notre travail.

2. Encodage


Les textgrids qui utilisent des mots avec accents “é, è, ê, …” se sauvegardent en utf-16 et non pas en UTF-8.

sanscadre


Donc création d’une fonction qui vérifie l’encodage du fichier et si on a un fichier en utf-16, on l’ouvre avec un encodage en utf-16.

3. Lier Java et Python


L’affichage de l’application étant majoritairement effectué en python, nous avons décidé de lier java et python à partir de python ou d’un script bash. Nous avons eu des difficultés pour lancer Corenlp sans utiliser Eclipse (qui déjà nous posait des problèmes).
Nous avons eu du mal à savoir comment lier les dependencies avec les scripts.

Notre essai pour compiler les classes avec le .jar

Jar.png


Lancement du script :

Corenlp.png

Nous ne sommes malheureusement pas allés plus loin par manque de temps.

4. Windows vs Linux


Nous avons souhaité faire fonctionner l’application sur les systèmes d’exploitation Linux et Windows.
Problèmes de certaines librairies python qui ne fonctionnent pas avec Linux par exemple sounddevice, os.
Également, Praat et easyalign ne sont pas disponibles sous linux. Nous avons la possibilité de les utiliser et installer avec wine mais nous avons eu des problèmes pour appeler les scripts praat avec les chemins sur le ‘faux’ disque C:.

Praat.png


En attendant de remédier à ces problèmes, ayant tous les deux accès à Windows, nous avons décidé de nous concentrer en priorité à ce que l’application fonctionne sous cet OS.

Evaluation

I. Problèmes


  • erreurs dans le lexique qu’on a utilisé :

Les deux son o et ɔ. Par exemple olive o ou ɔ, on a toujours “o”
olive = o l i v
olive = o l i v
Le son ã qui est toujours remplacé par ə

  • on a commencé à lier java et python mais prob pour lancer corenlp avec lignes de commandes
  • Si on enregistre plusieurs phonèmes comme devant être noté en options alors easyalign n’arrive pas à bien fonctionner.
  • Problème avec les nasales qui ne sont pas bien prises en compte dans easyalign. Quand on écrit “e~*a~*” easyAlign choisi le phonème “e”. Peut-être faudrait-il l’annoter : “e*a*~”
  • Les couleurs qui ne s’affichent pas dans l’invite de commande avec Windows 10

Windows :

WINDOWS.png

Linux :

Linux.png

Elles s’affichent néanmoins correctement si on utilise Cygwin sous Windows.

II. Améliorations


  • Proposer à l’utilisateur des recettes typiques française, pour cela, détecter sur le site un tag “français” par exemple, ou utiliser un site/corpus différent et libre d’utilisation. Le but ultime serait d’utiliser notre propre site de recette avec des plats typiques revisités à la façon Sandouis.
  • Automatiser le lien de Python avec Java pour ne pas avoir à demander à l’utilisateur de lui même lancer les scripts java
  • Proposer à l’utilisateur d’indiquer au début quels phonèmes lui posent problème
  • Utiliser la fonction (ce que j’ai dans mon frigo) : l’utilisateur indique ce qu’il possède en ingrédients au début et l’appli lui propose une recette contenant ces ingrédients
  • Proposer une traduction en anglais du mot à prononcer
  • Que l’utilisateur puisse écouter le mot à prononcer


Liens

I. Ressources


Langages de programmation : Python : https://www.python.org/downloads/
Java : https://www.java.com/fr/download/

Lexique phonétisé : https://gricad-gitlab.univ-grenoble-alpes.fr/pedagogies-multimodales/lexiques-phonetises

Praat : https://www.fon.hum.uva.nl/praat/
EasyAlign : http://latlcui.unige.ch/phonetique/easyalign.php

Phonèmes en option : Remédiation phonétique et phonologique en FLE par une approche multimodale chez les apprenants japonophones - Sylvain Coulange https://dumas.ccsd.cnrs.fr/dumas-01387387/document partie 7.1.2 (p98)

Corpus de recettes : Marmiton : https://www.marmiton.org/


  • Librairies Python :

BeautifulSoup : https://www.crummy.com/software/BeautifulSoup/bs4/doc/
Requests : https://requests.readthedocs.io/en/master/user/install/#install
Playsound : https://pypi.org/project/playsound/
Scipy : https://www.scipy.org/install.html
Sounddevice : https://python-sounddevice.readthedocs.io/en/0.4.1/
Parselmouth : https://parselmouth.readthedocs.io/en/stable/


  • Librairie Java :

CoreNLP : https://stanfordnlp.github.io/CoreNLP/


II. Lien du projet


Lien GitHub du projet ApprendreEnCuisinant : https://github.com/Louielo/ApprendreEnCuisinant