diff --git a/main.py b/main.py new file mode 100644 index 0000000..66c8e9a --- /dev/null +++ b/main.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +# PHONOCHROME : +# Colorize graphemes and calculate sets of contrasted colors using multiples Open Source libraries (Phonetisaurus, OpenFST,GoogleNgram, Colormaths, colorsys) +# +# > Ce programme est un main aillant pour but de faciliter la manipulations des différents utilitaires qui constituent Phonochrome +# +# Copyright (C) 2017 Elena Melnikova & Sylvain Daronnat - Grenoble Alpes University +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +import os +from tools.arpa_vers_api import arpa_vers_api +from tools.sampa_vers_api import sampa_vers_api +from tools.espace_entre_caracteres import espaces_entre_carac +from tools.recup_phoneme import recup_phoneme +from calcul_contrast.delta_e import calc_contrast_delta_e +import subprocess + +print("\n*******************************************************************************************************************") +print("*** PHONOCHROME 1.0 ***") +print("*** Projet Professionel - Master 2 IdL - Université Grenoble Alpes - 2016/2017 ***") +print("*** Créé par Elena Melnikova et Sylvain Daronnat ***") +print("*******************************************************************************************************************") +print("\n") + +# Variable contrôlant le choix fait par l'utilisateur +res_menu=0 + +while res_menu!=10: + print("\n*******************************************************************************************************************\n") + print("Veuillez sélectionner une option en choisissant le numéro correspondant et en appuyant sur 'entrée':\n") + print("\n *** UTILITAIRES : ***\n") + print("\t 1 - Importer un corpus au format de l'alphabet phonétique ARPABET") + print("\t 2 - Importer un corpus au format de l'alphabet phonétique SAMPA") + print("\t 3 - Séparer les lignes d'un fichier par des espaces") + print("\t 4 - Récupérer uniquement la colonne des phonèmes d'un corpus déjà normalisé") + print("\n *** TRAITEMENT DES RESSOURCES DE COULEUR & MODELES DE LANGUE : ***\n") + print("\t 5 - Calculer de nouvelles couleurs contrastées sur la base d'un fichier de ressource de couleurs") + print("\t 6 - Création d'un nouveau modèle de langue") + print("\t 7 - Préparation de fichiers de ngram nécessaires pour le calcul de nouvelles couleurs (avec GoogleNgramLibrary)") + print("\t 8 - Fusion de fichiers ngram nécessaires pour le calcul de nouvelles couleurs (avec GoogleNgramLibrary)") + print("\n\t 10 - Quitter le programme") + + res_menu=int(input("? - ")) + + if res_menu==1: + # Lancement du script de normalisation arpabet vers API + print(" [1] Importation d'un corpus qui est en alphabet phonétique ARPABET.") + print(" RAPPEL : un corpus en entrée doit toujours être formaté suivant ce modèle : mot (tabulation) p h o n e m e s") + print(" Exemple pour le mot 'abacco' en anglais : abaco æ b ʌ k oʊ") + print(" Insérez votre fichier au format TXT dans le dossier '/import_corpus' et entrez le nom de ce fichier sans préciser l'extension.") + nom_fichier=input(" Exemple : entrez 'test' si le fichier s'appelle 'test.txt'. Ensuite appuyez sur 'entrée' \n>") + arpa_vers_api(nom_fichier) + + elif res_menu==2: + # Lancement du script de normalisation sampa vers API + print(" [2] Importation d'un corpus qui est en alphabet phonétique SAMPA.") + print(" RAPPEL : un corpus en entrée doit toujours être formaté suivant ce modèle : mot (tabulation) p h o n e m e s.") + print(" Exemple pour le mot 'abacco' en anglais : abaco æ b ʌ k oʊ.") + print(" NOTES : ce script a été conçu spécialement pour le SAMPA de lexique.org, il se peut qu'il ne soit pas adapté à tous les types de SAMPA.") + print(" Insérez votre fichier au format TXT dans le dossier '/import_corpus' et entrez le nom de ce fichier sans préciser l'extension.") + nom_fichier=input(" Exemple : entrez 'test' si le fichier s'appelle 'test.txt'. Ensuite appuyez sur 'entrée' \n>") + sampa_vers_api(nom_fichier) + + elif res_menu==3: + # Lancement du script de normalisation sampa vers API + print(" [3] Séparation des lignes d'un fichier par des espaces.") + print(" Ce petit utilitaire a pour simple fonction de séparer les caractères d'une ligne par des espaces.") + print(" Ceci peut s'avérer utile pour formater un texte. Il est à noter que tous les caractères d'une même ligne recevront le même traitement.") + print(" NOTES : les marques de tabulation et de retour à la ligne sont conservées, un éditeur de texte peut vous aider à les remplacer par ce que vous préférez.") + print(" Insérez votre fichier au format TXT dans le dossier '/import_corpus' et entrez le nom de ce fichier sans préciser l'extension.") + nom_fichier=input(" Exemple : entrez 'test' si le fichier s'appelle 'test.txt'. Ensuite appuyez sur 'entrée' \n>") + espaces_entre_carac(nom_fichier) + + elif res_menu==4: + # Lancement du script de récupération de la colonne des phonèmes d'un corpus + print(" [4] Récupération des phonèmes d'un corpus correctement formaté.") + print(" RAPPEL : un corpus en entrée doit toujours être formaté suivant ce modèle : mot (tabulation) p h o n e m e s.") + print(" Exemple pour le mot 'abacco' en anglais : abaco æ b ʌ k oʊ.") + print(" Insérez votre fichier au format TXT dans le dossier '/import_corpus' et entrez le nom de ce fichier sans préciser l'extension.") + nom_fichier=input(" Exemple : entrez 'test' si le fichier s'appelle 'test.txt'. Ensuite appuyez sur 'entrée' \n>") + recup_phoneme(nom_fichier) + + elif res_menu==5: + # Lancement du script de calcul de contraste utilisant la distance delta E + print(" [5] Calcule de nouvelles couleurs constrastées.") + print(" Ici vous pourrez lancer le calcul d'un nouveau set de couleur contrasté sur la base d'une ressource de couleurs existante.") + print(" NOTES : Pour que ce script fonctionne, assurez vous d'avoir toutes les dépendances nécessaires (voir manuel).") + print(" le fichier de ressource de couleurs doit comprendre par ligne :") + print(" - un symbole API suivit d'une flèche '=>' et d'une couleur au format hexadécimal pour les phonèmes simple") + print(" - ou deux couleurs séparés d'un '|' pour les diphtongues. Exemple : ʊ=>#AE9A91 ou tʃ=>#BB2970|#019BCF") + print(" Le fichier d'entrée pourra contenir des commentaires ou des informations annexes mais le début de ces lignes devra alors commencé par '#'.") + print(" Le fichier de couleurs constrastées produit en sortie suivra ce même modèle mais avec en plus les couleurs au format RGB en commentaire.") + print("\n Insérez votre fichier de ressource de couleur au format TXT dans le dossier '/config_couleur' et entrez le nom de ce fichier sans préciser l'extension.") + nom_fichier_couleur=input(" Exemple : entrez 'test' si le fichier s'appelle 'test.txt'. Ensuite appuyez sur 'entrée' \n>") + nom_fichier_ngram_arpa=input(" Insérez votre fichier de ressource de couleur au format ARPA dans le dossier '/config_ngram' et entrez le nom de ce fichier sans préciser l'extension.\n>") + delta_e=input(" Indiquez l'objectif du Delta-E à atteindre (attention, une valeur trop haute peut être impossible à atteindre)\n>") + calc_contrast_delta_e(nom_fichier_couleur,nom_fichier_ngram_arpa,delta_e) + + elif res_menu==6: + # Entrainer un nouveau modèle de langue + print(" [6] Constitution d'un nouveau modèle de langue.") + print(" Ici vous pourrez ici créer un nouveau modèle de langue, peu importe quelle langue vous voulez traiter.") + print(" NOTES : Pour que ce script fonctionne, assurez vous d'avoir toutes les dépendances nécessaires (voir manuel).") + print(" Le corpus en entrée doit être formaté de la façon suivante : mot (tabulation) p h o n e m e s.") + print(" Exemple pour le mot 'abacco' en anglais : abacco æ b ʌ k oʊ.") + print("\n Insérez votre fichier de ressource de couleur au format TXT dans le dossier '/import_corpus' et entrez le nom de ce fichier sans préciser l'extension.") + nom_fichier=input(" Exemple : entrez 'test' si le fichier s'appelle 'test.txt'. Ensuite appuyez sur 'entrée' \n>") + res_menu=0 + print("\n\t 1/3 - Alignement des graphies et des phonèmes du fichier à traiter...\n") + cmd_1="phonetisaurus-align --input=import_corpus/"+nom_fichier+".txt --ofile=output_lang/"+nom_fichier+".corpus --seq1_del=false" + process1 = subprocess.Popen(cmd_1.split(), stdout=subprocess.PIPE) + process1.wait() + print("\n\t 2/3 - Créations des statistiques ngram du corpus...\n") + cmd_2="estimate-ngram -o 8 -t output_lang/"+nom_fichier+".corpus -wl output_lang/"+nom_fichier+".arpa" + process2 = subprocess.Popen(cmd_2.split(), stdout=subprocess.PIPE) + process2.wait() + print("\n\t 3/3 - Création du modèle de langue final...\n") + cmd_3="phonetisaurus-arpa2wfst --lm=output_lang/"+nom_fichier+".arpa --ofile=output_lang/"+nom_fichier+".fst" + process3 = subprocess.Popen(cmd_3.split(), stdout=subprocess.PIPE) + process3.wait() + print(" Traitement terminé !") + print(" Le fichier est disponible dans le dossier '/output_lang' sous le nom de "+nom_fichier+".fst") + print(" Pour pouvoir l'utiliser avec Phonochrome V1 veuillez créer un dossier nommé "+nom_fichier+"\n dans le répertoire /res de Phonochrome et insérez le fichier "+nom_fichier+".fst dans ce même dossier,\n le fichier apparaitra alors dans les choix de colorisation possibles sur Phonochrome.") + + elif res_menu==7: + # Créer les fichiers qui serviront à constituer un fichier de ngram au format ARPA permattant de calculer de nouvelles couleurs contrastées + print(" [7] Préparation d'un fichier ngram .CNTS, étape nécessaire pour le calcul de nouvelles couleurs.") + print(" Cette étape sert à créer un fichier de ngram qui servira de base au calcule de nouvelles couleurs contrastées.") + print(" NOTES : cette étape nécessite en entrée un corpus comportant uniquement des phonèmes en API où les différents phonèmes sont séparés par des espaces.") + print(" Exemple pour le mot 'abacco' en anglais : æ b ʌ k oʊ ") + print("\n Insérez le fichier à traiter au format TXT dans le dossier '/import_corpus' et entrez le nom de ce fichier sans préciser l'extension.") + nom_fichier=input(" Exemple : entrez 'test' si le fichier s'appelle 'test.txt'. Ensuite appuyez sur 'entrée' \n>") + res_menu=0 + print("\n\t 1/3 - Génération de la table des symboles du fichier...\n") + cmd_1="ngramsymbols < import_corpus/"+nom_fichier+".txt > output_lang/"+nom_fichier+".syms" + process1 = subprocess.Popen(cmd_1, stdout=subprocess.PIPE, shell=True) + process1.wait() + print("\n\t 2/3 - Compilation de la table des symboles et du corpus en entrée...\n") + cmd_2='farcompilestrings -unknown_symbol="" -symbols=output_lang/'+nom_fichier+'.syms -keep_symbols=1 import_corpus/'+nom_fichier+'.txt > output_lang/'+nom_fichier+'.far' + process2 = subprocess.Popen(cmd_2, stdout=subprocess.PIPE, shell=True) + process2.wait() + print("\n\t 3/3 - Génération du fichier .CNTS...\n") + cmd_3="ngramcount -order=5 output_lang/"+nom_fichier+".far > output_lang/"+nom_fichier+".cnts" + process3 = subprocess.Popen(cmd_3, stdout=subprocess.PIPE, shell=True) + process3.wait() + print(" Traitement terminé !") + print(" Le fichier CNTS est disponible dans le dossier '/output_lang' sous le nom de "+nom_fichier+".cnts") + print(" Vous pouvez désormais l'utiliser avec l'option numéro 8 pour fusionner plusieurs de ces fichiers afin de créer une nouvelle ressource de ngram\n nécessaire durant création d'un fichier de ressource de couleur contrasté") + + elif res_menu==8: + print(" [8] Fusion de fichiers .CNTS, et création du fichier ngram au format ARPA.") + print(" Cette étape sert à créer un fichier de ngram qui servira de base au calcule de nouvelles couleurs contrastées.") + print(" NOTES : cette étape nécessite en entrée un fichier .CNTS que vous pouvez créer à partir d'un corpus de phonème réalisable à partir de l'option numéro 7.") + print("\n Insérez les fichiers à traiter à l'extension CNTS dans le dossier '/import_corpus' et entrez le nom de ces fichier sans préciser l'extension.") + nom_fichier1=input(" Exemple : entrez 'test' si le fichier s'appelle 'test.cnts'. Ensuite appuyez sur 'entrée'. Insérez le nom du premier fichier CNTS\n>") + nom_fichier2=input(" Insérez le nom du deuxième fichier CNTS\n>") + print("\n\tFusion des deux fichiers en cours...") + cmd_1="ngrammerge import_corpus/"+nom_fichier1+".cnts import_corpus/"+nom_fichier2+".cnts > output_lang/"+nom_fichier1+"_"+nom_fichier2+".merged" + process1 = subprocess.Popen(cmd_1, stdout=subprocess.PIPE, shell=True) + process1.wait() + print(" Fusion terminée, le fichier est disponible dans le dossier output_lang/"+nom_fichier1+"_"+nom_fichier2+".merged") + arpa=input(" Voulez-vous créer un fichier ARPA à partir du nouveau fichier que vous venez de créer ? Ce fichier servira de ressource au script de calcule de couleurs contrastées\n si vous n'avez pas fusionné tous les corpus que vous voulez utiliser vous pouvez sauter cette étape\n(Y/N)>") + if arpa == 'Y' or arpa == 'y' or arpa == 'oui' or arpa == 'yes' or arpa == 'YES': + cmd_2="ngrammake output_lang/"+nom_fichier1+"_"+nom_fichier2+".merged > output_lang/world.mod" + print("\n\tCompilation du fichier créé par la fusion précédente...") + process2 = subprocess.Popen(cmd_2, stdout=subprocess.PIPE, shell=True) + process2.wait() + print("\n\tCréation du fichier au format ARPA utile pour le calcule de contraste...") + cmd_3='ngramprint --ARPA output_lang/world.mod > output_lang/world.ARPA' + process3 = subprocess.Popen(cmd_3, stdout=subprocess.PIPE, shell=True) + process3.wait() + print("\nTraitement terminé, le fichier est disponible dans le dossier /output_lang sous le nom de 'world.ARPA'") + res_menu==0 + else: + res_menu==0 + + \ No newline at end of file