diff --git a/calcul_contrast/__pycache__/delta_e.cpython-35.pyc b/calcul_contrast/__pycache__/delta_e.cpython-35.pyc
new file mode 100644
index 0000000..a188c8a
Binary files /dev/null and b/calcul_contrast/__pycache__/delta_e.cpython-35.pyc differ
diff --git a/calcul_contrast/delta_e.py b/calcul_contrast/delta_e.py
new file mode 100644
index 0000000..45f1fd1
--- /dev/null
+++ b/calcul_contrast/delta_e.py
@@ -0,0 +1,378 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# PHONOCHROME :
+# Colorize graphemes and calculate sets of contrasted colors using multiples Open Source libraries (Phonetisaurus, OpenFST,GoogleNgram, Colormaths, colorsys)
+#
+# > Ce programme permet de trouver un set de couleur contrasté sur la base d'une ressource de couleur existante ainsi que d'un fichier de ressource ngram
+# au format arpa
+#
+# 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 re
+import sys
+import webcolors
+from collections import OrderedDict
+from colormath.color_objects import LabColor
+from colormath.color_diff import delta_e_cie2000
+from colormath.color_objects import sRGBColor
+from colormath.color_conversions import convert_color
+from datetime import datetime
+
+# Note : les emplacements des fichiers sont définis en partant de l'emplacement du main.py
+# Fonction permettant facilement de passer du format hexadécimal aux valeurs R,G,B d'une couleur
+def rgb_to_hex(red, green, blue):
+ """Return color as #rrggbb for the given color values."""
+ return '#%02x%02x%02x' % (red, green, blue)
+
+def calc_contrast_delta_e(ressource_couleur,ngram_arpa,delta_e):
+
+ # Nom des fichiers en entrée tels que reçus par la fonction
+ nom_res_sans_ext=ressource_couleur
+ nom_ngram_sans_ext=ngram_arpa
+ # Nom des fichiers complets
+ nom_res_complet=ressource_couleur+".txt"
+ nom_ngram_complet=ngram_arpa+".arpa"
+ # Emplacement du fichier d'entrée de ressources de couleur
+ emplacement_res_couleur="config_couleur/"
+ # Emplacement du fichier d'entrée de ressources de bigram au format ARPA
+ emplacement_res_ngram="config_ngram/"
+ # Nom du dossier où le nouveau fichier de ressources de couleur sera créé
+ emplacement_fichier_sortie="output_couleur/"
+ # Delta E à atteindre pour chaque couleurs et ses contextes droits les plus fréquents
+ delta_e_goal=int(delta_e)
+ # Déclaration du premier dictionnaire qui contiendra les ressources de couleur en entrée
+ dic_pho={}
+ # Déclaration de différentes variables utiles pour la suite du traitement
+ bigram_match=""
+ dic_pho_color={}
+ dic_nouv_coul_contrast={}
+ # servira à compter le nombre d'opérations nécessaires (test de couples de couleurs) avant de trouver un set de couleur contrasté
+ cpt_nbr_operations=0
+ # Si ces valeurs sont à "True" alors durant le test de couple de couleurs les valeurs seront augmentés de 1, sinon elles sont à "False" alors elles seront réduites de 1
+ increase_r=True
+ increase_g=True
+ increase_b=True
+
+ # On ouvre le fichier contenant les ressources de couleur
+ # L'utilisation de l'encodage UTF8 SANS BOM est conseillée, les marques BOM aillant causé des problèmes durant la lecture du fichier de ressource de couleur
+ fichier_ressource_couleur = open(emplacement_res_couleur+nom_res_complet,'r',encoding='utf_8')
+ print("\n\tEtape 1 : Mise en mémoire du fichier de ressource de couleurs.")
+ print("\tTraitement...")
+ for ligne in fichier_ressource_couleur:
+ # On traite seulement les lignes qui ne commencent pas par une marque '#' de commentaire
+ if (re.search('^#',ligne)):
+ pass
+ else:
+ # Ce 'try' permet nottament d'éliminer les erreurs suite à la présence d'une marque BOM invisible
+ try:
+ # on sépare les couleurs des phonèmes en splitant sur =>
+ split_pho_couleur=ligne.split("=>")
+ pho_ressource=split_pho_couleur[0]
+ hex_color=split_pho_couleur[1]
+
+ # Si le caractère | est trouvé, c'est que le phonème est une diphtongue, on traite les diphtongue seulement à la fin de ce fichier (en concaténant les nouvelles couleurs des phonèmes qui la compose)
+ if(re.search("\|",hex_color)):
+ pass
+ else:
+ # on transpose la couleur hexadécimal en RGB grace à la fonction correspondante
+ trans_hex_to_rgb=webcolors.hex_to_rgb(hex_color)
+ # on passe d'un tuple à un string afin de pouvoir la traiter
+ rgb_tuple_to_string=str(trans_hex_to_rgb)
+ # on sélectionne seulement les chiffres contenus dans cette couleur
+ get_number=re.findall("\d+\.\d+|\d+|\d+\.\d+",rgb_tuple_to_string)
+ # on associe une lettre en variable à chaque valeur de couleur qui constituent un code RGB
+ r=int(get_number[0])
+ g=int(get_number[1])
+ b=int(get_number[2])
+ # on les convertis en pourcentage pour pouvoir utiliser le toolkit de conversion Colormaths par la suite
+ r_percent=r/255
+ g_percent=g/255
+ b_percent=b/255
+ # on transpose la couleur RGB en couleur de l'espace LAB
+ rgb = sRGBColor(r_percent,g_percent,b_percent)
+ lab = convert_color(rgb, LabColor)
+ # on insère ces nouvelles données dans un tableau avec en clé le phonème et en valeur la couleur LAB correspondante
+ dic_pho[pho_ressource]=lab
+ except:
+ pass
+ # on ferme le fichier de ressource
+ fichier_ressource_couleur.close()
+ print("\tFin de la mise en mémoire des ressources.")
+
+ # on ouvre le fichier de bigram de phonème au format ARPA
+ fichier_ngram_phoneme = open(emplacement_res_ngram+nom_ngram_complet,'r',encoding='utf_8')
+ print("\n\tEtape 2 : Traitement du fichier de bigram, calcule de la distance entre chaque couleur des phonèmes du corpus." )
+ print("\tTraitement...")
+ for ligne in fichier_ngram_phoneme:
+ # on sélectionne uniquement les lignes traitant de bigram, et non celles de 1gram, 3gram, 4gram etc...
+ pattern="(.*)\t(.*)\s(.*)\t(.*)"
+ if (re.match(pattern,ligne)):
+ # on supprime les retours à la ligne
+ bigram_match=ligne.strip("\n")
+ # on isole les phonèmes dans ces bigram
+ split_bigram_pho=re.split("\t|\s",bigram_match)
+ # on attribut une variable à ces phonèmes afin de pouvoir plus facilement les traiter par la suite
+ pho_a = split_bigram_pho[1]
+ pho_b = split_bigram_pho[2]
+ # on va chercher la couleur correspondant à ces phonèmes dans le tableau créé précédemment
+ color_pho_a=dic_pho.get(pho_a,"UNK")
+ color_pho_b=dic_pho.get(pho_b,"UNK")
+ # on ne traite que les phonèmes dont la couleur est présente dans le fichier de ressource de couleur
+ if(color_pho_a != "UNK" and color_pho_b != "UNK"):
+ # le delta E est une mesure de distance entre plusieurs couleurs qui comprend plusieurs méthodes et applications, dans ce programme nous
+ # allons utiliser le delta E CMC 2000 qui est celui utilisé actuellement en infographie et dans l'industrie de plusieurs secteurs
+
+ # on calcule le delta E entre ces deux couleurs
+ calc_delta_e = delta_e_cie2000(color_pho_a, color_pho_b, Kl=1, Kc=1, Kh=1)
+ # on associe la couleur du phonème a en valeur à son phonème correspondant en clé d'un nouveau tableau
+ dic_pho_color[pho_a]=color_pho_a
+ # si la distance Delta E est inférieure à celle fixée par l'utilisateur, on commence la recherche d'une nouvelle couleur
+ if (calc_delta_e < delta_e_goal):
+ # on transforme le code couleur LAB du phonème A en string pour pouvoir le traiter par la suite
+ str_col_a = str(color_pho_a)
+ # on recherche les chiffres présent dans ce code couleur
+ x=re.findall("\d+\.\d+|\d+|-\d+\.\d+",str_col_a)
+ # on incrémente la variable qui gardera une trace du dernier calcule de Delta E avec la valeur du premier calcul du delta E
+ new_calc_delta = calc_delta_e
+ # on converti les int en float
+ new_lab_l=float(x[0])
+ new_lab_a=float(x[1])
+ new_lab_b=float(x[2])
+ # on fixe les valeurs minimales et maximales de chaque future valeur RGB à respectivement 0 et 255
+ # R
+ r_min=0
+ r_max=255
+ # G
+ g_min=0
+ g_max=255
+ # B
+ b_min=0
+ b_max=255
+ # on reconvertis les valeurs LAB en RGB pour pouvoir faire des test sur les valeurs RGB, plus facilement manipulables que les valeurs LAB
+ new_lab = LabColor(new_lab_l,new_lab_a,new_lab_b)
+ new_rgb = convert_color(new_lab, sRGBColor)
+ # on défini le nouveau code RGB à tester
+ rgb_a_tester=str(new_rgb)
+ # comme précédemment, on récupèr les valeurs R G et B dans la string precedemment créé
+ trouver_val_rgb=re.findall("\d+\.\d+|\d+|-\d+\.\d+",rgb_a_tester)
+ # on reconvertit les string en float
+ new_r_float=float(trouver_val_rgb[0])
+ new_g_float=float(trouver_val_rgb[1])
+ new_b_float=float(trouver_val_rgb[2])
+ # on convertit les float en int pour pouvoir les incrémenter plus facilement par la suite
+ r_a_tester=int(new_r_float*255)
+ g_a_tester=int(new_g_float*255)
+ b_a_tester=int(new_b_float*255)
+ # tant que le delta E n'est pas atteind on effectue les calculs suivants pour R, G ou B :
+ # si il est supérieur à 0 et inférieur à 255 on commence par l'incrémenter de 1 et sauvegarde la nouvelle valeur
+ # dès qu'il atteint son maximum on arrête de l'incrémenter et on le réduit à chaque test de 1
+ # le tout se répéte à chaque couleur tant que le Delta E n'est pas satisfait
+ while new_calc_delta < delta_e_goal:
+ # Couleur R :
+ if (increase_r == True):
+ if (r_a_tester >= r_min and r_a_tester < r_max):
+ r_a_tester=r_a_tester+1
+ elif(r_a_tester >= r_max):
+ r_a_tester=r_a_tester-1
+ increase_r=False
+ elif (increase_r == False):
+ if (r_a_tester <= r_max and r_a_tester > r_min):
+ r_a_tester=r_a_tester-1
+ elif(r_a_tester <= r_min):
+ r_a_tester=r_a_tester+1
+ increase_r=True
+ # Couleur G :
+ if (increase_g == True):
+ if (g_a_tester >= g_min and g_a_tester < g_max):
+ g_a_tester=g_a_tester+1
+ elif((g_a_tester >= g_max)):
+ g_a_tester=g_a_tester-1
+ increase_g=False
+
+ elif (increase_g == False):
+ if (g_a_tester <= g_max and g_a_tester > g_min):
+ g_a_tester=g_a_tester-1
+ elif(g_a_tester <= g_min):
+ g_a_tester=g_a_tester+1
+ increase_g=True
+ # Couleur B :
+ if (increase_b == True):
+ if (b_a_tester >= b_min and b_a_tester < b_max):
+ b_a_tester=b_a_tester+1
+ elif((b_a_tester >= b_max)):
+ b_a_tester=b_a_tester-1
+ increase_b=False
+ elif (increase_b == False):
+ if (b_a_tester <= b_max and b_a_tester > b_min):
+ b_a_tester=b_a_tester-1
+ elif(b_a_tester <= b_min):
+ b_a_tester=b_a_tester+1
+ increase_b=True
+ # On passe les nouvelles valeurs RGB en pourcentages pour pouvoir les convertir dans l'espace LAB
+ x=r_a_tester/255
+ y=g_a_tester/255
+ z=b_a_tester/255
+ # on convertis le nouveau RGB ainsi créé
+ rgb_nouveau = sRGBColor(x,y,z)
+ new_color_1 = convert_color(rgb_nouveau, LabColor)
+ # on test cette couleur avec celle du phonème b en contexte droit du bigram
+ new_calc_delta = delta_e_cie2000(new_color_1, color_pho_b, Kl=1, Kc=1, Kh=1)
+ # on compte le nombre d'opérations pour l'afficher par la suite
+ cpt_nbr_operations=cpt_nbr_operations+1
+ # si le delta E est atteint avec ces nouvelles valeurs on sauvegarde dans un nouveau tableau la nouvelle couleur, sinon on recommence le traitement depuis le début
+ if new_calc_delta >= delta_e_goal:
+ new_best_color_a = new_color_1
+ dic_pho_color[pho_a]=new_best_color_a
+ dic_nouv_coul_contrast[pho_a]=new_best_color_a
+ # une fois le traitement fini on ferme le fichier de bigram
+ fichier_ngram_phoneme.close()
+ print("\tFin du calcul des nouvelles couleurs contrastées. Nombre de combinaisons de couleurs testées :",cpt_nbr_operations)
+ print("\n\tEtape 3 : création du fichier de ressource final")
+ print("\tTraitement...")
+ # on fusionne les deux dictionnaire : le premier (plus anciens) de ressource de couleur et le deuxième contenant les nouvelles valeurs, ceci afin de conserver les valeurs qui n'ont pas été modifiées
+ fusion_dic1_dic2 = {}
+ fusion_dic1_dic2.update(dic_pho)
+ fusion_dic1_dic2.update(dic_nouv_coul_contrast)
+ # ouverture d'un autre dictionnaire qui sera utile par la suite
+ dic3={}
+ # on ouvre de nouveau le fichier de couleur
+ fichier_ressource_couleur = open(emplacement_res_couleur+nom_res_complet,'r',encoding='utf_8')
+ # on répété le même traitement qu'au début du programme pour les ressources de couleur mais cette fois-ci pour les diphtongues avec les valeurs nouvellement calculées
+ # en effet on considère ici les diphtongues comme une concaténation de plusieurs caractères et non comme des phonèmes à part entières, elles doivent ainsi prendre les
+ # valeurs de couleurs nouvellement calculées
+ for elements in fichier_ressource_couleur:
+ # on saute les lignes qui sont des commentaires
+ if (re.search('^#',elements)):
+ pass
+ else:
+ try:
+ # on recherche la marque | indiquant une diphtongue
+ if(re.search("\|",elements)):
+ # on sépare les phonèmes des codes couleurs sur le symbole '=>'
+ get_diph=elements.split("=>")
+ get_two_pho=list(get_diph[0])
+ get_two_colors=get_diph[1].split("|")
+ # on associe la nouvelle couleur correspondant à chaque diphtongue trouvé dans le dictionnaire contenant les valeurs fraichement calculés
+ color_diph_a=fusion_dic1_dic2.get(get_two_pho[0],"UNK")
+ color_diph_b=fusion_dic1_dic2.get(get_two_pho[1],"UNK")
+ # on insére le tout dans un nouveau dictionnaire qui sera utile par la suite
+ dic3[get_two_pho[0]+get_two_pho[1]]=str(color_diph_a)+"|"+str(color_diph_b)
+ except:
+ pass
+ # on referme le fichier de ressource de couleur
+ fichier_ressource_couleur.close()
+ # on met à jour le dictionnaire contenant les couleurs precedemment calculés avec les valeurs des diphtongues
+ fusion_dic1_dic2_dic3={}
+ fusion_dic1_dic2_dic3.update(fusion_dic1_dic2)
+ fusion_dic1_dic2_dic3.update(dic3)
+ # on tri le dictionnaire ainsi créé
+ fusion_dic1_dic2_dic3=OrderedDict(fusion_dic1_dic2_dic3)
+ # on associe au nom du nouveau fichier de ressources de couleurs sa date de création
+ temps=datetime.now().strftime('%d-%m-%Y_%H-%M')
+ # création du fichier de ressource de couleur contrasté
+ nouveau_fichier_ressource = open(emplacement_fichier_sortie+"nouveau_set_couleur_"+temps+".txt",'w',encoding='utf_8')
+ # on affiche quelques commentaires en début de fichier
+ nouveau_fichier_ressource.write('# Set de couleur le plus contrasté possible pour chaque phonèmes suivant son contexte droite le plus fréquent\n')
+ nouveau_fichier_ressource.write('# modèle :\n')
+ nouveau_fichier_ressource.write('# phonème en API => code hexadécimal correspondant\n')
+ nouveau_fichier_ressource.write('# ou phonème (diphtongue) en API> => code hexadécimal correspondant 1|code hexadécimal 2\n')
+ nouveau_fichier_ressource.write('# (dans ce fichier les lignes démarrant par "#" ne sont pas prises en compte par le programme)\n')
+ nouveau_fichier_ressource.write('#\n')
+ # on ouvre le dictionnaire à jour contenant les nouvelles valeurs de chaque phonème et des diphtongues
+ for phonemes in fusion_dic1_dic2_dic3:
+ color_test=fusion_dic1_dic2_dic3.get(phonemes,"UNK")
+ # on ne traite dans cette partie que les diphtongues
+ if len(phonemes)>1 :
+ if (re.search('\|',str(color_test))):
+ if(re.search('UNK',str(color_test))):
+ pass
+ else:
+ # toute la prochaine partie du traitement de ce 'else' va consister à :
+ # convertir les valeurs LAB en RGB de chaque phonème trouvé,
+ # convertir les valeurs RGB en hexadécimal
+ # sauvegarder le résultat dans le nouveau fichier de ressource de couleur
+ get_the_diph=str(color_test).split("|")
+ diph1_color=get_the_diph[0]
+ diph2_color=get_the_diph[1]
+
+ trouver_chiffres_diph1=re.findall("\d+\.\d+|\d+|-\d+\.\d+",diph1_color)
+ trouver_chiffres_diph2=re.findall("\d+\.\d+|\d+|-\d+\.\d+",diph2_color)
+
+ LabColor_diph1= LabColor(trouver_chiffres_diph1[0],trouver_chiffres_diph1[1],trouver_chiffres_diph1[2])
+ LabColor_diph2= LabColor(trouver_chiffres_diph2[0],trouver_chiffres_diph2[1],trouver_chiffres_diph2[2])
+
+ diph1_couleur_rgb=convert_color(LabColor_diph1, sRGBColor)
+ diph2_couleur_rgb=convert_color(LabColor_diph2, sRGBColor)
+
+ diph_1_str_rgb=str(diph1_couleur_rgb)
+ diph_2_str_rgb=str(diph2_couleur_rgb)
+
+ trouver_chiffres_diph1=re.findall("\d+\.\d+|\d+|-\d+\.\d+",diph_1_str_rgb)
+ trouver_chiffres_diph2=re.findall("\d+\.\d+|\d+|-\d+\.\d+",diph_2_str_rgb)
+
+ diph_1_rgb_r=float(trouver_chiffres_diph1[0])
+ diph_1_rgb_g=float(trouver_chiffres_diph1[1])
+ diph_1_rgb_b=float(trouver_chiffres_diph1[2])
+ diph_2_rgb_r=float(trouver_chiffres_diph2[0])
+ diph_2_rgb_g=float(trouver_chiffres_diph2[1])
+ diph_2_rgb_b=float(trouver_chiffres_diph2[2])
+
+ diph_1_rgb_r_255=(diph_1_rgb_r*255)
+ diph_1_rgb_g_255=(diph_1_rgb_g*255)
+ diph_1_rgb_b_255=(diph_1_rgb_b*255)
+ diph_2_rgb_r_255=(diph_2_rgb_r*255)
+ diph_2_rgb_g_255=(diph_2_rgb_g*255)
+ diph_2_rgb_b_255=(diph_2_rgb_b*255)
+
+ diph_1_rgb_int_r=int(diph_1_rgb_r_255)
+ diph_1_rgb_int_g=int(diph_1_rgb_g_255)
+ diph_1_rgb_int_b=int(diph_1_rgb_b_255)
+ diph_2_rgb_int_r=int(diph_2_rgb_r_255)
+ diph_2_rgb_int_g=int(diph_2_rgb_g_255)
+ diph_2_rgb_int_b=int(diph_2_rgb_b_255)
+ diph_1_couleur_hex=rgb_to_hex(diph_1_rgb_int_r,diph_1_rgb_int_g,diph_1_rgb_int_b)
+ diph_2_couleur_hex=rgb_to_hex(diph_2_rgb_int_r,diph_2_rgb_int_g,diph_2_rgb_int_b)
+ nouveau_fichier_ressource.write(phonemes+'=>'+diph_1_couleur_hex+"|"+diph_2_couleur_hex+'\n')
+ nouveau_fichier_ressource.write("# rgb("+str(diph_1_rgb_int_r)+','+str(diph_1_rgb_int_g)+','+str(diph_1_rgb_int_b)+")"+"|"+"rgb("+str(diph_2_rgb_int_r)+','+str(diph_2_rgb_int_g)+','+str(diph_2_rgb_int_b)+")"+"\n")
+ nouveau_fichier_ressource.write("#\n")
+ else:
+ # idem pour les phonèmes 'simples', on va convertir les valeurs de couleur LAB en RGB, puis en hexadécimal et sauvegarder le tout dans le fichier de résultat
+ couleur_lab=fusion_dic1_dic2_dic3.get(phonemes,"UNK")
+ couleur_rgb = convert_color(couleur_lab, sRGBColor)
+ str_rgb=str(couleur_rgb)
+
+ trouver_chiffres=re.findall("\d+\.\d+|\d+|-\d+\.\d+",str_rgb)
+
+ rgb_r=float(trouver_chiffres[0])
+ rgb_g=float(trouver_chiffres[1])
+ rgb_b=float(trouver_chiffres[2])
+
+ rgb_r_255=(rgb_r*255)
+ rgb_g_255=(rgb_g*255)
+ rgb_b_255=(rgb_b*255)
+
+ rgb_int_r=int(rgb_r_255)
+ rgb_int_g=int(rgb_g_255)
+ rgb_int_b=int(rgb_b_255)
+
+ couleur_hex=rgb_to_hex(rgb_int_r,rgb_int_g,rgb_int_b)
+
+ nouveau_fichier_ressource.write(phonemes+'=>'+couleur_hex+'\n')
+ nouveau_fichier_ressource.write("# rgb("+str(rgb_int_r)+','+str(rgb_int_g)+','+str(rgb_int_b)+")"+"\n")
+ nouveau_fichier_ressource.write("#\n")
+
+ # on ferme le fichier de ressource une dernière fois, marquant la fin du traitement.
+ nouveau_fichier_ressource.close()
+ print("\tFin de l'enregistrement du nouveau fichier de ressource de couleurs.")
+ print("\n\tLe fichier de ressource contrasté est disponible dans le dossier /"+emplacement_fichier_sortie+" sous le nom de 'nouveau_set_couleur' suivi de sa date de création.txt")
\ No newline at end of file
diff --git a/config/equiv_arpa_api.txt b/config/equiv_arpa_api.txt
new file mode 100644
index 0000000..53c654d
--- /dev/null
+++ b/config/equiv_arpa_api.txt
@@ -0,0 +1,63 @@
+# Equivalences Arpabet vers API
+# Provenant de Wikipédia : https://en.wikipedia.org/wiki/Arpabet
+# Les lignes commençant par '#' ne sont pas prises en compte
+#
+#0=>No stress
+#1=>Primary stress
+#2=>Secondary stress
+AO=>ɔ
+AA=>ɑ
+IY=>i
+UW=>u
+EH=>ɛ
+IH=>ɪ
+UH=>ʊ
+AH=>ʌ
+AX=>ə
+AE=>æ
+EY=>eɪ
+AY=>aɪ
+OW=>oʊ
+AW=>aʊ
+OY=>ɔɪ
+ER=>ɝ
+AXR=>ɚ
+#EH R=>ɛr
+#UH R=>ʊr
+#AO R=>ɔr
+#AA R=>ɑr
+#IH R=>ɪr
+#IY R=>ɪr
+#AW R=>aʊr
+P=>p
+B=>b
+T=>t
+D=>d
+K=>k
+G=>ɡ
+CH=>tʃ
+JH=>dʒ
+F=>f
+V=>v
+TH=>θ
+DH=>ð
+S=>s
+Z=>z
+SH=>ʃ
+ZH=>ʒ
+HH=>h
+M=>m
+EM=>m̩
+N=>n
+EN=>n̩
+NG=>ŋ
+ENG=>ŋ̍
+L=>ɫ
+EL=>ɫ̩
+R=>r
+#R=>ɹ
+DX=>ɾ
+NX=>ɾ̃
+Y=>j
+W=>w
+Q=>ʔ
\ No newline at end of file
diff --git a/config/equiv_sampa_api.txt b/config/equiv_sampa_api.txt
new file mode 100644
index 0000000..530578a
--- /dev/null
+++ b/config/equiv_sampa_api.txt
@@ -0,0 +1,40 @@
+# Equivalences SAMPA vers API (caractères du français, adapté au format de Lexique.org)
+# Provenant de Wikipédia : https://fr.wikipedia.org/wiki/SAMPA
+# Les lignes commençant par '#' ne sont pas prises en compte
+#
+p=>p
+b=>b
+t=>t
+d=>d
+k=>k
+g=>g
+f=>f
+v=>v
+s=>s
+z=>z
+S=>ʃ
+Z=>ʒ
+j=>j
+m=>m
+n=>n
+J=>ɲ
+G=>ŋ
+l=>l
+R=>ʁ
+w=>w
+8=>ɥ
+i=>i
+e=>e
+E=>ɛ
+a=>a
+O=>ɔ
+o=>o
+u=>u
+y=>y
+2=>ø
+1=>œ̃
+°=>ə
+5=>ɛ̃
+@=>ə
+§=>ɔ̃
+9~=>œ̃
\ No newline at end of file
diff --git a/config/ressource_couleur.txt b/config/ressource_couleur.txt
new file mode 100644
index 0000000..5b8a3cf
--- /dev/null
+++ b/config/ressource_couleur.txt
@@ -0,0 +1,219 @@
+# Set de couleur le plus contrasté possible pour chaque phonèmes suivant son contexte droite le plus fréquent
+# modèle :
+# phonème en API => code hexadécimal correspondant
+# ou phonème (diphtongue) en API> => code hexadécimal correspondant 1|code hexadécimal 2
+# (dans ce fichier les lignes démarrant par "#" ne sont pas prises en compte par le programme)
+#
+ʂ=>#6272a6
+# rgb(98,114,166)
+#
+p=>#586564
+# rgb(88,101,100)
+#
+b=>#414033
+# rgb(65,64,51)
+#
+θ=>#949d3c
+# rgb(148,157,60)
+#
+h=>#73d295
+# rgb(115,210,149)
+#
+k=>#a15972
+# rgb(161,89,114)
+#
+ɕ=>#aec2bd
+# rgb(174,194,189)
+#
+ʉ=>#41a1a1
+# rgb(65,161,161)
+#
+z=>#78734f
+# rgb(120,115,79)
+#
+ð=>#a68653
+# rgb(166,134,83)
+#
+ɡ=>#59605c
+# rgb(89,96,92)
+#
+oʊ=>#9c690c|#78685d
+# rgb(156,105,12)|rgb(120,104,93)
+#
+d=>#295b64
+# rgb(41,91,100)
+#
+ə=>#73747d
+# rgb(115,116,125)
+#
+v=>#807b29
+# rgb(128,123,41)
+#
+w=>#997e72
+# rgb(153,126,114)
+#
+t=>#746a2a
+# rgb(116,106,42)
+#
+au=>#5d5d5d|#4b398b
+# rgb(93,93,93)|rgb(75,57,139)
+#
+aɪ=>#5d5d5d|#b14c3e
+# rgb(93,93,93)|rgb(177,76,62)
+#
+ɹ=>#fe6017
+# rgb(254,96,23)
+#
+m=>#788f97
+# rgb(120,143,151)
+#
+ᵻ=>#445c5d
+# rgb(68,92,93)
+#
+ɔɪ=>#9252a9|#b14c3e
+# rgb(146,82,169)|rgb(177,76,62)
+#
+ue=>#4b398b|#995981
+# rgb(75,57,139)|rgb(153,89,129)
+#
+dʒ=>#2e5a64|#465085
+# rgb(46,90,100)|rgb(70,80,133)
+#
+ɛ=>#8f7861
+# rgb(143,120,97)
+#
+ɲ=>#678c2a
+# rgb(103,140,42)
+#
+s=>#428b48
+# rgb(66,139,72)
+#
+ʌ=>#6a6f31
+# rgb(106,111,49)
+#
+ɑ=>#656565
+# rgb(101,101,101)
+#
+eɪ=>#995981|#b14c3e
+# rgb(153,89,129)|rgb(177,76,62)
+#
+n=>#8f8e85
+# rgb(143,142,133)
+#
+ts=>#706a2a|#3b8c46
+# rgb(112,106,42)|rgb(59,140,70)
+#
+o=>#a1690e
+# rgb(161,105,14)
+#
+ʊ=>#79675d
+# rgb(121,103,93)
+#
+ɔ=>#8c54a8
+# rgb(140,84,168)
+#
+x=>#736197
+# rgb(115,97,151)
+#
+ʃ=>#73d295
+# rgb(115,210,149)
+#
+æ=>#cca675
+# rgb(204,166,117)
+#
+ei=>#995981|#9d7d41
+# rgb(153,89,129)|rgb(157,125,65)
+#
+f=>#8f7b9c
+# rgb(143,123,156)
+#
+ɫ=>#525b99
+# rgb(82,91,153)
+#
+ɐ=>#d5d9de
+# rgb(213,217,222)
+#
+ʒ=>#3c5285
+# rgb(60,82,133)
+#
+j=>#912e4b
+# rgb(145,46,75)
+#
+e=>#995981
+# rgb(153,89,129)
+#
+ʐ=>#048a69
+# rgb(4,138,105)
+#
+ɝ=>#7d98c1
+# rgb(125,152,193)
+#
+i=>#a27d41
+# rgb(162,125,65)
+#
+tt=>#706a2a|#706a2a
+# rgb(112,106,42)|rgb(112,106,42)
+#
+ɚ=>#ef2d52
+# rgb(239,45,82)
+#
+ʎ=>#e773bc
+# rgb(231,115,188)
+#
+iu=>#9d7d41|#4b398b
+# rgb(157,125,65)|rgb(75,57,139)
+#
+ŋ=>#3a4a40
+# rgb(58,74,64)
+#
+l=>#589a93
+# rgb(88,154,147)
+#
+ɪ=>#b44d3d
+# rgb(180,77,61)
+#
+tʃ=>#706a2a|#6ed395
+# rgb(112,106,42)|rgb(110,211,149)
+#
+ɪa=>#b14c3e|#5d5d5d
+# rgb(177,76,62)|rgb(93,93,93)
+#
+ui=>#4b398b|#9d7d41
+# rgb(75,57,139)|rgb(157,125,65)
+#
+β=>#bea29c
+# rgb(190,162,156)
+#
+aʊ=>#5d5d5d|#78685d
+# rgb(93,93,93)|rgb(120,104,93)
+#
+ɣ=>#a597ab
+# rgb(165,151,171)
+#
+ɑʊ=>#656565|#78685d
+# rgb(101,101,101)|rgb(120,104,93)
+#
+a=>#5d5d5d
+# rgb(93,93,93)
+#
+ɪo=>#b14c3e|#9c690c
+# rgb(177,76,62)|rgb(156,105,12)
+#
+r=>#cc8b44
+# rgb(204,139,68)
+#
+ʝ=>#e645ab
+# rgb(230,69,171)
+#
+ua=>#4b398b|#5d5d5d
+# rgb(75,57,139)|rgb(93,93,93)
+#
+ɾ=>#a86f61
+# rgb(168,111,97)
+#
+ʔ=>#a3594e
+# rgb(163,89,78)
+#
+u=>#3f3c8b
+# rgb(63,60,139)
+#
diff --git a/interface/__pycache__/get_graph.cpython-34.pyc b/interface/__pycache__/get_graph.cpython-34.pyc
new file mode 100644
index 0000000..c656fbb
Binary files /dev/null and b/interface/__pycache__/get_graph.cpython-34.pyc differ
diff --git a/interface/a_propos.php b/interface/a_propos.php
new file mode 100644
index 0000000..645d7f0
--- /dev/null
+++ b/interface/a_propos.php
@@ -0,0 +1,77 @@
+
+
+
+
Cet outil a été développé dans le cadre d'un projet professionel de fin d'année du Master 2 "Industrie De la Langue" à l'université Grenoble Alpes. Les étudiants aillant réalisé ce programme sont : Elena Melnikova et Sylvain Daronnat
Cette page permet de récupérer les phonèmes, couleurs et graphies correspondant au dernier texte traité par Phonochrome. Il est a noté que :
+
+
Le texte traité est le dernier a avoir été analysé par Phonochrome.
+
Les phonèmes n'étant pas présent dans le fichier de ressource de couleurs sont notés (UNK) et apparaissent en gris et en italique.
+
Les graphies en doublon pour le même phonème sont supprimées.
+
Le modèle d'affichage des résultat est le suivant : " PHONEME EN API : GRAPHIE1,GRAPHIE2... "
+
+
+';
+ print'';
+ print'';
+
+ // On lance le traitement uniquement si l'utilisateur presse le bouton correspondant
+ if(isset($_POST['lance_py']))
+ {
+ // on affiche le résultat dans une div différente du reste
+ print'';
+ print'
Résultats du traitement du dernier texte :
';
+ print'';
+ print"
";
+ // on lance le script python
+ exec($cmd_python,$out,$status);
+ // compteur qui servira à correctement afficher les diphtongues de deux couleurs différentes
+ $cpt=0;
+ // on met en mémoire le fichier de ressource de couleur dans un tableau avec en clé les phonèmes en API et en valeur les couleurs RGB au format hexadécimal
+ $fichier_ressource_couleur = fopen($emplacement_res_couleurs, 'r');
+ if ($fichier_ressource_couleur)
+ {
+ while (!feof($fichier_ressource_couleur))
+ {
+ // on ne traite pas les commentaires affichés avec une ligne commençant par un '#'
+ $ligne = fgets($fichier_ressource_couleur);
+ if(preg_match("/^(?:(?!".'^#'.").)*$/i",$ligne))
+ {
+ $ligne_explode = explode("=>", $ligne); // on sépare les codes couleurs des codes phonétiques SAMPA
+ $phoneme_sampa = $ligne_explode[0];
+ $couleur_correspondante = $ligne_explode[1];
+ $tableau_regles_couleur[$phoneme_sampa]=$couleur_correspondante; //on associe chaque clé de phonème avec la valeur en couleur correspondante
+ }
+ }
+ }
+ fclose($fichier_ressource_couleur);
+
+ // on traite le fichier de résultat de la phonétisation provenant de l'utilisation de Phonetisaurus sur la page index de Phonochrome
+ // on ouvre en premier ce fichier, et on ne traite pas les lignes commençant par "#" car représentant ici espilon, ceci n'étant pas utile pour la suite
+ // on crée ensuit deux tableaux, l'un avec les phonèmes en clé et les graphies en phonème, et le deuxième avec les graphies en valeur et les phonèmes en clé
+ $fichier_pho_graph = fopen($emplacement_resultat_phonetise, 'r');
+ if ($fichier_pho_graph)
+ {
+ while (!feof($fichier_pho_graph))
+ {
+ $ligne = fgets($fichier_pho_graph);
+ if(preg_match("/^(?:(?!".'^#'.").)*$/i",$ligne))
+ {
+ $trait_ligne=explode(" => ",$ligne);
+ $tab_graph_pho[$trait_ligne[1]]=$trait_ligne[0];
+ $tab_pho_graph[$trait_ligne[0]]=$trait_ligne[1];
+ }
+ }
+ }
+ fclose($fichier_pho_graph);
+
+ // on filtre les deux tableaux avec la fonction array_filter
+ $tab_pho_graph=array_filter($tab_pho_graph);
+ $tab_graph_pho=array_filter($tab_graph_pho);
+ // on parcourt le tableau de graphème=>phonème et si on trouve la clé dans le fichier de ressource de couleur on associe à la graphie la couleur correspondante
+ foreach ($tab_graph_pho as $phoneme)
+ {
+ if(array_key_exists($phoneme, $tableau_regles_couleur))
+ {
+ // on détecte une diphtongue si le code hexa est "anormalement long", ce qui signifie qu'il y en a deux sur le modèle "#FFFFFF|#EEEEEE"
+ if (strlen($tableau_regles_couleur[$phoneme])>9)
+ {
+ // on récupére les deux couleurs et on associe à la même graphie deux textes de style, l'un étant affiché dans la partie haute du texte et l'autre dans la partie basse
+ // les graphies se superposent et donnent ainsi l'illusion d'avoir deux couleurs pour chaque graphies associées à des diphtongues
+ $diphtongue=explode("|", $tableau_regles_couleur[$phoneme]);
+ echo'';
+ echo''.$phoneme.' : ';
+ echo''.$tab_pho_graph[$phoneme].'';
+ $cpt=$cpt+1;
+ print(" ");
+ }
+ else
+ // si l'entrée n'est pas une diphtongue, on affiche le phonème et ses graphies avec la couleur correspondante dans le fichier de ressource
+ {
+ echo '',$phoneme.' : ';
+ echo '',$tab_pho_graph[$phoneme],'';
+ print(" ");
+ }
+ }
+ else
+ // si le phonème n'existe pas dans le fichier de ressource de couleur on l'indique en l'affichant en gris avec une marque (UNK) devant son entrée
+ {
+ print("(UNK) : ".$phoneme. " : ");
+ echo ''.$tab_pho_graph[$phoneme].'';
+ print(" ");
+ }
+ }
+ }
+ print'
';
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/interface/aff_ressources.php b/interface/aff_ressources.php
new file mode 100644
index 0000000..6162eac
--- /dev/null
+++ b/interface/aff_ressources.php
@@ -0,0 +1,114 @@
+
+
+
+
+Phonochrome v1 - Université Grenoble Alpes
+
+
+
+
+
Sur cette page vous trouverez les associations couleurs/phonèmes utilisé par le programme ainsi qu'un lien permettant d'aller explorer les modèles utilisés pour chaques langues.
+
+' dans le fichier de ressource
+ $ligne_explode = explode("=>", $ligne);
+ $phoneme_sampa = $ligne_explode[0];
+ $couleur_correspondante = $ligne_explode[1];
+
+ // si deux couleurs sont présentes dans le fichier de ressource on l'indique en affichant une div dans une div, la première possèdant une couleur différente de la deuxième
+ if (strlen($couleur_correspondante)>9)
+ {
+ $couleur_diphtongue=explode("|", $couleur_correspondante);
+ echo"
/$phoneme_sampa/ :
";
+ echo'
';
+ echo'Code hexadécimal :',$couleur_diphtongue[0], ' (haut) et ' ,$couleur_diphtongue[1],'(bas) ';
+ }
+ else
+ // si le phonème n'est pas différent on affiche une div de la couleur qui lui correspondant
+ {
+ echo"
/$phoneme_sampa/ :
",'';
+ echo'Code hexadécimal :',$couleur_correspondante,' ';
+ }
+ }
+ }
+ // on ferme le fichier de ressource de couleurs
+ fclose($fichier_ressource_couleur);
+
+?>
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/interface/get_graph.py b/interface/get_graph.py
new file mode 100644
index 0000000..e728744
--- /dev/null
+++ b/interface/get_graph.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# PHONOCHROME :
+# Colorize graphemes and calculate sets of contrasted colors using multiples Open Source libraries (Phonetisaurus, OpenFST,GoogleNgram, Colormaths, colorsys)
+#
+# > Script en python3 permettant de récupérer les graphies correspondant à chaque phonème d'un texte phonétisé par Phonochrome/Phonetisaurus
+#
+# 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 .
+from collections import OrderedDict
+import re
+
+# foncton permettant de supprimer les valeurs en double/triple etc... d'un dictionnaire python
+def remove_duplicates(values):
+ output = []
+ seen = set()
+ for value in values:
+ if value not in seen:
+ output.append(value)
+ seen.add(value)
+ return output
+
+# Le nom ne comprend pas l'extension du fichier, celle-là doit être ".txt" et sera rajoutée par la suite
+nom_fichier_entree ='texte_phonetise'
+emplacement_sortie_phonochrome="/var/www/html/phonochrome/output/"
+
+# ouverture du dictionnaire qui contient phonèmes en clés et graphies en valeurs
+dic={}
+
+# Ouverture en lecture du fichier traité par phonochrome et en écriture du futur fichier de résutlat
+fichier_entree = open(emplacement_sortie_phonochrome+nom_fichier_entree+".txt",'r',encoding='utf-8')
+fichier_sortie = open(emplacement_sortie_phonochrome+nom_fichier_entree+'.liste_graphies.txt','w',encoding='utf-8')
+
+for ligne in fichier_entree:
+ # on sépare les différents couples phonème/graphèmes
+ list_couple=ligne.split(",")
+for line in list_couple:
+ # on supprime l'indication d'espilon (du vide) car non utile pour la suite
+ ligne_clean=line.strip('##::##')
+ # on supprime le | indiquant que plus caractères correspondent au même phonème
+ ligne_clean = ligne_clean.replace("|", "")
+ # on sépare les phonèmes des graphies
+ list_graph_pho=ligne_clean.split("::")
+ try:
+ # dans le dictionnaire dic, si en clé le phonème n'existe pas il est créé et la graphie correspondante rajoutée en valeur, sinon si il existe on lui rajoute la nouvelle valeur
+ graph=list_graph_pho[0]
+ pho=list_graph_pho[1]
+ if pho in dic:
+ dic[pho]+=","+graph
+ else:
+ dic[pho]=graph
+ except:
+ pass
+
+# On écrit dans le fichier de résultat un message donnant une brêve explication sur le fichier créé
+fichier_sortie.write("# Ce fichier contient la liste de toutes les graphies par phonème d'après le texte d'entrée suivant :"+"\n")
+fichier_sortie.write("# "+nom_fichier_entree+"\n")
+
+# on traite le dictionnaire afin de supprimer les graphies en double ou triple etc... pour chaque phonème en clé
+for elem in dic:
+ values_dic=dic.get(elem)
+ split_values_dic=values_dic.split(",")
+ clean_dupli=remove_duplicates(split_values_dic)
+ graphem_no_dupli_trait=str(clean_dupli)
+ graphem_no_dupli=re.sub("\[|\]|'| |\"","",graphem_no_dupli_trait)
+
+ # on sauvegarde les nouveaux résultats dans le fichier de résultat
+ fichier_sortie.write(elem+" => "+graphem_no_dupli+"\n")
+
+# on ferme le fichier d'entrée et de sortie
+fichier_entree.close()
+fichier_sortie.close()
\ No newline at end of file
diff --git a/interface/index.php b/interface/index.php
new file mode 100644
index 0000000..d609053
--- /dev/null
+++ b/interface/index.php
@@ -0,0 +1,300 @@
+
+
+
+
+
+Phonochrome v1 - Université Grenoble Alpes
+
+
+
+
+
Sur cette page vous pourrez tester l'outil de colorisation en rentrant un texte dans le formulaire prévu à cet effet puis en choisissant la langue correspondante (si disponible) parmi celles prises en charge par le programme.
+
+Choisissez la langue d'origine du texte\n";
+ print "\n";
+
+ if(isset($_POST['colorisation_submit']) && empty($_POST['texte_entree']))
+ {
+ print "
/!\ Attention, aucun texte n'a été détecté /!\
\n";
+ }
+
+ // chargement des ressources de couleur en mémoire, les lignes commençant par "#" ne sont pas prises en compte et les codes couleurs sont au format hexadécimal
+ $fichier_ressource_couleur = fopen($emplacement_res_couleurs, 'r');
+ if ($fichier_ressource_couleur)
+ {
+ while (!feof($fichier_ressource_couleur))
+ {
+ $ligne = fgets($fichier_ressource_couleur);
+ if(preg_match("/^(?:(?!".'^#'.").)*$/i",$ligne))
+ {
+ // on split sur l'élément séparateur '=>' car le modèle de représentation est : API=>#codehexa
+ $ligne_explode = explode("=>", $ligne);
+ $phoneme_sampa = $ligne_explode[0];
+ $couleur_correspondante = $ligne_explode[1];
+ //on associe chaque clé de phonème avec la valeur en couleur correspondante
+ $tableau_regles_couleur[$phoneme_sampa]=$couleur_correspondante;
+ }
+ }
+ }
+ fclose($fichier_ressource_couleur);
+
+ if (!empty($_POST['texte_entree']))
+ {
+ // On vérifie quelle mode d'utilisation l'utilisateur a selectionné pour les diphtongues
+ // 1 : affichage classique, deux couleurs en même temps
+ if(!isset($_POST['aff_diph']))
+ {
+ $surlignage_diph=0;
+ }
+ // 2 : affichage plus robuste, une couleur par lettre avec un surlignage d'une couleur différente
+ elseif(isset($_POST['aff_diph']))
+ {
+ $surlignage_diph=1;
+ }
+ // on vide le contenu de l'ancien fichier traitee par le programme, ceci servira au programme de récupération des graphies par phonèmes
+ $nothingness="";
+ file_put_contents($emplacement_resultat_phonetisaurus,$nothingness);
+ // ce compteur permettra de générer des micro fiches de style pour chaque diphtongue afin d'afficher des lettres de deux couleurs différentes
+ $cpt=0;
+ print"
\n";
+ print"\t
Résultats de la colorisation :
\n";
+ print" \n";
+
+ // début du calcul du temps d'execution du programme
+ $timestamp_debut = microtime(true);
+ // on passe le texte de l'utilisateur en minuscule, nos modèles de langue étant entrainés sur des corpus en minuscules et Phonetisaurus étant sensible à la casse
+ $texte_utilisateur_non_formate = trim(strtolower($_POST['texte_entree']));
+
+ // on tokénise le texte d'entrée de l'utilisateur afin d'envoyer comme argument à Phonétisaurus un seul token à la fois, il faut faire attention à backslahser certains éléments
+ $tokenisation = preg_split("/( |\.|,|;|:|\?|\!)/",$texte_utilisateur_non_formate);
+
+ foreach ($tokenisation as $token)
+ {
+ // chemin d'accès de Phonetisaurus, prenant en entrée un token à la fois et le modèle de langue correspondant à celui choisit par l'utilisateur
+ $cmd_phoneticize='python2 /var/www/html/phonochrome/Phonetisaurus/script/phoneticize.py -m /var/www/html/phonochrome/res/'.$select_lang.'/'.$select_lang.'.fst -w '.'"'.$token.'"';
+ // on lance le traitement de Phonetisaurus (en ne passant pas par le binaire, car trop lent pour chaque mot)
+ exec($cmd_phoneticize,$out,$status);
+
+ // phase de normalisation
+ // on réunit le résultat de la commande de phonetisaurus en plaçant une virgule entre chaque token traité
+ $array_out_to_string = implode(",",$out);
+ $pattern = '//';
+ $replacement = '##';
+ // on supprime les symboles "" qui ne s'affichent pas en PHP/HTML et ne servent à rien pour la suite du programme
+ $sanitized_output = preg_replace($pattern, $replacement, $array_out_to_string);
+
+ // on sépare les tokens traités et normalisés suivant les virgules et
+ $graphie_pho=explode(",",$sanitized_output);
+
+ // on traite chaque élément (tokens) dans une boucle foreach
+ foreach ($graphie_pho as $elem)
+ {
+ // on ne traite que les lignes n'étant pas "epsilon" et donc ne commençant pas par "##" comme précisé plus haut
+ if(preg_match("/^(?:(?!".'^#'.").)*$/i",$elem))
+ {
+ # on réunit les lettres qui doivent être colorisées de la même couleur car séparées par "|" dans Phonetisaurus
+ $elem=str_replace("|","",$elem);
+ # On sépare les graphies des phonèmes correspondant, ici séparés par "::" comme précisé dans le fichier de traitement de Phonetisaurus
+ $sep_graph_pho=explode("::",$elem);
+
+ // on vérifie que les valeurs existent pour les transférer à d'autres variables pour la suite
+ if(isset($sep_graph_pho[0]))
+ {
+ $graphie=$sep_graph_pho[0];
+ }
+ else
+ {
+ $graphie="";
+ }
+
+ if(isset($sep_graph_pho[1]))
+ {
+ $phoneme=$sep_graph_pho[1];
+ }
+ else
+ {
+ $phoneme="";
+ }
+
+ // si le phonème indiqué par Phonétisaurus existe dans les ressource de couleur on commence le traitement d'associations des couleurs aux graphies
+ if(array_key_exists($phoneme, $tableau_regles_couleur))
+ {
+
+ if (strlen($tableau_regles_couleur[$phoneme])>9)
+ {
+ $diphtongue=explode("|", $tableau_regles_couleur[$phoneme]);
+
+ if($surlignage_diph == 1)
+ {
+ // version où la diphtongue est affichée en surlignage et non de deux couleurs différentes, permet d'éviter certains bugs d'affichage peu esthétiques
+ echo '',$graphie,'';
+ }
+ elseif($surlignage_diph == 0)
+ {
+ // version où les diphotngues sont affichés avec deux couleurs différentes, l'une étant définie par une fiche de style classique et l'autre par un attribut ':before' possèdant une couleur différente. Le résultat finale est alors deux lettres superposés affichant différentes parties de ces lettres de couleurs différentes.
+ // peut paraitre un peu bugué sous certains navigateurs, d'où le choix entre les deux affichages différents
+ echo'';
+ echo''.$graphie.'';
+ }
+ }
+ else
+ {
+ // si la graphie a colorisé n'est pas une diphtongue, on l'affiche avec la couleur correspondante dans le fichier de ressource de couleurs
+ echo '',$graphie,'';
+ }
+ }
+ else
+ {
+ // si le graphème n'est pas relié à une couleur, on l'affiche en gris et en italique
+ echo '',$graphie,'';
+ }
+
+ }
+
+ }
+ // on insère un espace entre les mots traités
+ print(" ");
+ //on incrémente le compte servant à générer des propriétés de style pour chaque diphtongues générées
+ $cpt=$cpt+1;
+ // remise à zéro de la variable retour de Phonetisaurus
+ $out="";
+
+ // on stocke dans un fichier le texte phonetisée qui sera utilisé pour afficher les phonèmes et graphies correspondantes dans une autre partie du script
+ $fichier_traite_phonetisaurus=$emplacement_resultat_phonetisaurus;
+ $fichier_traite_ajout = fopen($fichier_traite_phonetisaurus, 'a+');
+
+ // sauvegarde du résultat normalisé de Phonetisaurus et fermeture du fichier ici :
+ fwrite($fichier_traite_ajout, $sanitized_output);
+ fclose($fichier_traite_ajout);
+ }
+
+ // on calcule et on affiche le temps d'execution du script
+ $timestamp_fin = microtime(true);
+ $difference_ms = $timestamp_fin - $timestamp_debut;
+ $arrondir=round($difference_ms,2);
+ print" ";
+ print"
";
+ echo '
Traitement effectué en '.$arrondir.' secondes.
';
+ print'';
+ }
+
+?>
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/interface/save_index_15:11.php b/interface/save_index_15:11.php
new file mode 100644
index 0000000..4081e35
--- /dev/null
+++ b/interface/save_index_15:11.php
@@ -0,0 +1,255 @@
+
+
+
+
+
+Phonochrome v1 - Université Grenoble Alpes
+
+
+
+
+
Sur cette page vous pourrez tester l'outil de colorisation en rentrant un texte dans le formulaire prévu à cet effet puis en choisissant la langue correspondante (si disponible) parmi celles prises en charge par le programme.
+
+Choisissez la langue d'origine du texte";
+ print "\n";
+ if(isset($_POST['colorisation_submit']) && empty($_POST['texte_entree']))
+ {
+ print "
/!\ Attention, aucun texte n'a été détecté /!\
\n";
+ }
+
+ // chargement des ressources de couleur en mémoire, les lignes commençant par "#" ne sont pas prises en compte et les codes couleurs sont au format hexadécimal
+ $fichier_ressource_couleur = fopen('/var/www/html/phonochrome/config/ressource_couleur.txt', 'r');
+ if ($fichier_ressource_couleur)
+ {
+ while (!feof($fichier_ressource_couleur))
+ {
+ $ligne = fgets($fichier_ressource_couleur);
+ if(preg_match("/^(?:(?!".'^#'.").)*$/i",$ligne))
+ {
+ // on split sur l'élément séparateur '=>' car le modèle de représentation est : API=>#codehexa
+ $ligne_explode = explode("=>", $ligne);
+ $phoneme_sampa = $ligne_explode[0];
+ $couleur_correspondante = $ligne_explode[1];
+ //on associe chaque clé de phonème avec la valeur en couleur correspondante
+ $tableau_regles_couleur[$phoneme_sampa]=$couleur_correspondante;
+ }
+ }
+ }
+ fclose($fichier_ressource_couleur);
+
+ if (!empty($_POST['texte_entree']))
+ {
+ //on vide le contenu de l'ancien fichier traitee par le programme, ceci servira au programme de récupération des graphies par phonèmes
+ $nothingness="";
+ file_put_contents( '../output/texte_phonetise.txt',$nothingness);
+ // ce compteur permettra de générer des micro fiches de style pour chaque diphtongue afin d'afficher des lettres de deux couleurs différentes
+ $cpt=0;
+ print"
\n";
+ print"\t
Résultats de la colorisation :
\n";
+ print" \n";
+
+ // début du calcul du temps d'execution du programme
+ $timestamp_debut = microtime(true);
+ // on passe le texte de l'utilisateur en minuscule, nos modèles de langue étant entrainés sur des corpus en minuscules et Phonetisaurus étant sensible à la casse
+ $texte_utilisateur_non_formate = trim(strtolower($_POST['texte_entree']));
+
+ // on tokénise le texte d'entrée de l'utilisateur afin d'envoyer comme argument à Phonétisaurus un seul token à la fois, il faut faire attention à backslahser certains éléments
+ $tokenisation = preg_split("/( |\.|,|;|:|\?|\!)/",$texte_utilisateur_non_formate);
+
+ foreach ($tokenisation as $token)
+ {
+ // chemin d'accès de Phonetisaurus, prenant en entrée un token à la fois et le modèle de langue correspondant à celui choisit par l'utilisateur
+ $cmd_phoneticize='python2 /var/www/html/phonochrome/Phonetisaurus/script/phoneticize.py -m /var/www/html/phonochrome/res/'.$select_lang.'/'.$select_lang.'.fst -w '.'"'.$token.'"';
+ // on lance le traitement de Phonetisaurus (en ne passant pas par le binaire, car trop lent pour chaque mot)
+ exec($cmd_phoneticize,$out,$status);
+
+ // phase de normalisation
+ // on réunit le résultat de la commande de phonetisaurus en plaçant une virgule entre chaque token traité
+ $array_out_to_string = implode(",",$out);
+ $pattern = '//';
+ $replacement = '##';
+ // on supprime les symboles "" qui ne s'affichent pas en PHP/HTML et ne servent à rien pour la suite du programme
+ $sanitized_output = preg_replace($pattern, $replacement, $array_out_to_string);
+
+ // on sépare les tokens traités et normalisés suivant les virgules et
+ $graphie_pho=explode(",",$sanitized_output);
+
+ // on traite chaque élément (tokens) dans une boucle foreach
+ foreach ($graphie_pho as $elem)
+ {
+ // on ne traite que les lignes n'étant pas "epsilon" et donc ne commençant pas par "##" comme précisé plus haut
+ if(preg_match("/^(?:(?!".'^#'.").)*$/i",$elem))
+ {
+ # on réunit les lettres qui doivent être colorisées de la même couleur car séparées par "|" dans Phonetisaurus
+ $elem=str_replace("|","",$elem);
+ # On sépare les graphies des phonèmes correspondant, ici séparés par "::" comme précisé dans le fichier de traitement de Phonetisaurus
+ $sep_graph_pho=explode("::",$elem);
+
+ // on vérifie que les valeurs existent pour les transférer à d'autres variables pour la suite
+ if(isset($sep_graph_pho[0]))
+ {
+ $graphie=$sep_graph_pho[0];
+ }
+ else
+ {
+ $graphie="";
+ }
+
+ if(isset($sep_graph_pho[1]))
+ {
+ $phoneme=$sep_graph_pho[1];
+ }
+ else
+ {
+ $phoneme="";
+ }
+
+ // si le phonème indiqué par Phonétisaurus existe dans les ressource de couleur on commence le traitement d'associations des couleurs aux graphies
+ if(array_key_exists($phoneme, $tableau_regles_couleur))
+ {
+
+ if (strlen($tableau_regles_couleur[$phoneme])>9)
+ {
+ $diphtongue=explode("|", $tableau_regles_couleur[$phoneme]);
+ // version où la diphtongue est affichée en surlignage et non de deux couleurs différentes
+ // echo '',$graphie,'';
+ echo'';
+ echo''.$graphie.'';
+ }
+ else
+ {
+ echo '',$graphie,'';
+ }
+ }
+ else
+ {
+ echo '',$graphie,'';
+ }
+
+ }
+
+ }
+ print(" ");
+ $cpt=$cpt+1;
+ $out="";
+ // à modifier si besoin pour ne pas tout écraser à chaque remise de $out à zéro
+ // file_put_contents( '../output/texte_phonetise.txt',$sanitized_output);
+ $fichier_traite_phonetisaurus='../output/texte_phonetise.txt';
+ $fichier_traite_ajout = fopen($fichier_traite_phonetisaurus, 'a+');
+
+ fwrite($fichier_traite_ajout, $sanitized_output);
+ fclose($fichier_traite_ajout);
+ }
+
+ $timestamp_fin = microtime(true);
+ $difference_ms = $timestamp_fin - $timestamp_debut;
+ $arrondir=round($difference_ms,2);
+ print" ";
+ print"
";
+ echo '
Traitement effectué en '.$arrondir.' secondes.
';
+ print'';
+ }
+
+?>
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/interface/style.css b/interface/style.css
new file mode 100644
index 0000000..11d845c
--- /dev/null
+++ b/interface/style.css
@@ -0,0 +1,185 @@
+body{
+margin:0;
+padding:0;
+font-size:13px;
+font-family:Verdana;
+background-color:#232323;
+}
+
+.clear:after{
+content:".";
+display:block;
+height:0;
+clear:both;
+visibility:hidden;
+line-height:0;
+}
+
+.clear{
+display:block;
+clear:both;
+}
+
+a{
+outline:none;
+text-decoration:none;
+}
+
+.fl_left{
+float:left;
+}
+
+.fl_right{
+float:right;
+}
+
+#texte_a_coloriser{
+width:100%;
+height:20em;
+resize:none;
+}
+
+#warning{
+color:#c63e03;
+}
+
+#warning_vide{
+color:red;
+}
+
+#resultats{
+background-color:black;
+color:grey;
+font-size:150%;
+line-height:25px;
+}
+
+#link_under_white{
+color:blue;
+text-decoration:underline;
+}
+
+.row1,.row1 a{
+color:#C0BAB6;
+background-color:#333333;
+}
+
+.row2{
+background-color:#FFFFFF;
+}
+.row2 a
+{color:#FF9900; background-color:#FFFFFF;
+}
+
+.row3{
+color:#989898;
+background-color:#333333;
+}
+
+.row3 a{
+color:#FF9900; background-color:#333333;
+}
+
+.row4,.row4 a{
+color:#919191;
+background-color:#232323;
+}
+
+#header,#container,#footer,#copyright{
+display:block;
+width:960px;
+margin:0 auto;
+}
+
+nav ul{
+margin:0;
+padding:0;
+list-style:none;
+}
+
+h1, h2, h3, h4, h5, h6{
+margin:0;
+padding:0;
+font-weight:bold;
+font-style:normal;
+line-height:normal;
+}
+
+.one_quarter{
+width:210px;
+}
+
+#header #hgroup{
+float:left;
+padding:10px 0;
+}
+
+#header #hgroup h1{
+font-weight:normal;
+text-transform:none;
+}
+
+#header #hgroup h1{
+font-size:40px;
+text-align:center;
+}
+
+#header nav{
+display:block; width:100%; margin:0; padding:20px 0; border-top:1px solid #DEDEDE; clear:both;
+}
+
+#header nav li{
+display:inline; margin-right:25px; text-transform:uppercase;
+}
+
+#header nav li.last{margin-right:0;
+}
+
+#header nav li a:hover{
+color:#FF9900; background-color:#333333;
+}
+
+#container{
+padding:15px 0;
+}
+
+#container #homepage{
+display:block;
+width:100%;
+line-height:1.6em;
+}
+
+#footer{
+padding:30px 0;
+font-size:12px;
+line-height:1.4em;
+}
+
+#footer section h2.title{
+margin:0 0 25px 0;
+padding:0;
+color:#FFFFFF;
+background-color:#333333;
+font-size:12px;
+font-weight:bold;
+text-transform:uppercase;
+}
+
+#footer section nav li{
+margin:0 0 5px 0;
+padding:0 0 5px 0;
+border-bottom:1px solid #555555;
+}
+
+#footer section nav li.last{
+margin:0;
+}
+
+#copyright{
+padding:20px 0;
+}
+
+#copyright p{
+margin:0;
+padding: 0;
+}
\ No newline at end of file
diff --git a/ressource_couleur.txt b/ressource_couleur.txt
new file mode 100644
index 0000000..5b8a3cf
--- /dev/null
+++ b/ressource_couleur.txt
@@ -0,0 +1,219 @@
+# Set de couleur le plus contrasté possible pour chaque phonèmes suivant son contexte droite le plus fréquent
+# modèle :
+# phonème en API => code hexadécimal correspondant
+# ou phonème (diphtongue) en API> => code hexadécimal correspondant 1|code hexadécimal 2
+# (dans ce fichier les lignes démarrant par "#" ne sont pas prises en compte par le programme)
+#
+ʂ=>#6272a6
+# rgb(98,114,166)
+#
+p=>#586564
+# rgb(88,101,100)
+#
+b=>#414033
+# rgb(65,64,51)
+#
+θ=>#949d3c
+# rgb(148,157,60)
+#
+h=>#73d295
+# rgb(115,210,149)
+#
+k=>#a15972
+# rgb(161,89,114)
+#
+ɕ=>#aec2bd
+# rgb(174,194,189)
+#
+ʉ=>#41a1a1
+# rgb(65,161,161)
+#
+z=>#78734f
+# rgb(120,115,79)
+#
+ð=>#a68653
+# rgb(166,134,83)
+#
+ɡ=>#59605c
+# rgb(89,96,92)
+#
+oʊ=>#9c690c|#78685d
+# rgb(156,105,12)|rgb(120,104,93)
+#
+d=>#295b64
+# rgb(41,91,100)
+#
+ə=>#73747d
+# rgb(115,116,125)
+#
+v=>#807b29
+# rgb(128,123,41)
+#
+w=>#997e72
+# rgb(153,126,114)
+#
+t=>#746a2a
+# rgb(116,106,42)
+#
+au=>#5d5d5d|#4b398b
+# rgb(93,93,93)|rgb(75,57,139)
+#
+aɪ=>#5d5d5d|#b14c3e
+# rgb(93,93,93)|rgb(177,76,62)
+#
+ɹ=>#fe6017
+# rgb(254,96,23)
+#
+m=>#788f97
+# rgb(120,143,151)
+#
+ᵻ=>#445c5d
+# rgb(68,92,93)
+#
+ɔɪ=>#9252a9|#b14c3e
+# rgb(146,82,169)|rgb(177,76,62)
+#
+ue=>#4b398b|#995981
+# rgb(75,57,139)|rgb(153,89,129)
+#
+dʒ=>#2e5a64|#465085
+# rgb(46,90,100)|rgb(70,80,133)
+#
+ɛ=>#8f7861
+# rgb(143,120,97)
+#
+ɲ=>#678c2a
+# rgb(103,140,42)
+#
+s=>#428b48
+# rgb(66,139,72)
+#
+ʌ=>#6a6f31
+# rgb(106,111,49)
+#
+ɑ=>#656565
+# rgb(101,101,101)
+#
+eɪ=>#995981|#b14c3e
+# rgb(153,89,129)|rgb(177,76,62)
+#
+n=>#8f8e85
+# rgb(143,142,133)
+#
+ts=>#706a2a|#3b8c46
+# rgb(112,106,42)|rgb(59,140,70)
+#
+o=>#a1690e
+# rgb(161,105,14)
+#
+ʊ=>#79675d
+# rgb(121,103,93)
+#
+ɔ=>#8c54a8
+# rgb(140,84,168)
+#
+x=>#736197
+# rgb(115,97,151)
+#
+ʃ=>#73d295
+# rgb(115,210,149)
+#
+æ=>#cca675
+# rgb(204,166,117)
+#
+ei=>#995981|#9d7d41
+# rgb(153,89,129)|rgb(157,125,65)
+#
+f=>#8f7b9c
+# rgb(143,123,156)
+#
+ɫ=>#525b99
+# rgb(82,91,153)
+#
+ɐ=>#d5d9de
+# rgb(213,217,222)
+#
+ʒ=>#3c5285
+# rgb(60,82,133)
+#
+j=>#912e4b
+# rgb(145,46,75)
+#
+e=>#995981
+# rgb(153,89,129)
+#
+ʐ=>#048a69
+# rgb(4,138,105)
+#
+ɝ=>#7d98c1
+# rgb(125,152,193)
+#
+i=>#a27d41
+# rgb(162,125,65)
+#
+tt=>#706a2a|#706a2a
+# rgb(112,106,42)|rgb(112,106,42)
+#
+ɚ=>#ef2d52
+# rgb(239,45,82)
+#
+ʎ=>#e773bc
+# rgb(231,115,188)
+#
+iu=>#9d7d41|#4b398b
+# rgb(157,125,65)|rgb(75,57,139)
+#
+ŋ=>#3a4a40
+# rgb(58,74,64)
+#
+l=>#589a93
+# rgb(88,154,147)
+#
+ɪ=>#b44d3d
+# rgb(180,77,61)
+#
+tʃ=>#706a2a|#6ed395
+# rgb(112,106,42)|rgb(110,211,149)
+#
+ɪa=>#b14c3e|#5d5d5d
+# rgb(177,76,62)|rgb(93,93,93)
+#
+ui=>#4b398b|#9d7d41
+# rgb(75,57,139)|rgb(157,125,65)
+#
+β=>#bea29c
+# rgb(190,162,156)
+#
+aʊ=>#5d5d5d|#78685d
+# rgb(93,93,93)|rgb(120,104,93)
+#
+ɣ=>#a597ab
+# rgb(165,151,171)
+#
+ɑʊ=>#656565|#78685d
+# rgb(101,101,101)|rgb(120,104,93)
+#
+a=>#5d5d5d
+# rgb(93,93,93)
+#
+ɪo=>#b14c3e|#9c690c
+# rgb(177,76,62)|rgb(156,105,12)
+#
+r=>#cc8b44
+# rgb(204,139,68)
+#
+ʝ=>#e645ab
+# rgb(230,69,171)
+#
+ua=>#4b398b|#5d5d5d
+# rgb(75,57,139)|rgb(93,93,93)
+#
+ɾ=>#a86f61
+# rgb(168,111,97)
+#
+ʔ=>#a3594e
+# rgb(163,89,78)
+#
+u=>#3f3c8b
+# rgb(63,60,139)
+#
diff --git a/tools/__pycache__/arpa_vers_api.cpython-35.pyc b/tools/__pycache__/arpa_vers_api.cpython-35.pyc
new file mode 100644
index 0000000..6e52a21
Binary files /dev/null and b/tools/__pycache__/arpa_vers_api.cpython-35.pyc differ
diff --git a/tools/__pycache__/espace_entre_caracteres.cpython-35.pyc b/tools/__pycache__/espace_entre_caracteres.cpython-35.pyc
new file mode 100644
index 0000000..f023fa7
Binary files /dev/null and b/tools/__pycache__/espace_entre_caracteres.cpython-35.pyc differ
diff --git a/tools/__pycache__/recup_phoneme.cpython-35.pyc b/tools/__pycache__/recup_phoneme.cpython-35.pyc
new file mode 100644
index 0000000..c98ca1c
Binary files /dev/null and b/tools/__pycache__/recup_phoneme.cpython-35.pyc differ
diff --git a/tools/__pycache__/sampa_vers_api.cpython-35.pyc b/tools/__pycache__/sampa_vers_api.cpython-35.pyc
new file mode 100644
index 0000000..789dc6d
Binary files /dev/null and b/tools/__pycache__/sampa_vers_api.cpython-35.pyc differ
diff --git a/tools/arpa_vers_api.py b/tools/arpa_vers_api.py
new file mode 100644
index 0000000..2ba1a9e
--- /dev/null
+++ b/tools/arpa_vers_api.py
@@ -0,0 +1,98 @@
+#!/usr/bin/python
+# -*- 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 script de normalisation ARPA vers API, il crée aussi un fichier contenant uniquement les mots en API du corpus en entrée.
+#
+# 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 re
+
+# Note : les emplacements des fichiers sont définis en partant de l'emplacement du main.py
+def arpa_vers_api(nom_fichier):
+
+ # Nom du fichier d'entrée tel que reçu par la fonction
+ nom_sans_ext=nom_fichier
+
+ # Emplacement du fichier d'entrée
+ emplacement_fichier_entree="import_corpus/"
+
+ # Nom complet du fichier d'entrée
+ nom_fichier=nom_fichier+".txt"
+
+ # emplacement du fichier de configuration nécessaire pour l'équivalence arpa/api
+ emplacement_fichier_config="config/"
+
+ # nom du fichier d'équivalences entre le format arpa et api
+ nom_fichier_equivalences="equiv_arpa_api.txt"
+
+ # nom du fichier où les résultats seront stockés
+ emplacement_fichier_sortie="output/"
+
+ # Ouverture des dictionnaires nécessaires au traitement
+ dic_arpa_to_api={}
+
+ reverse_dic_arpa_to_api={}
+
+ print("\n\tDébut de la normalisation Arpabet vers API...")
+ # Ouverture du fichier de configuration et mise en mémoire des équivalences arpa/api
+ ressource_equiv_arpa_api = open(emplacement_fichier_config+nom_fichier_equivalences,'r',encoding='utf-8')
+
+ # On traite chaque ligne ne commçant pas par un "#" qui représente un commentaire ou une information
+ for ligne in ressource_equiv_arpa_api:
+ if (re.search('^#',ligne)):
+ pass # à améliorer, faire l'équivalent de celle en php
+ else:
+ # on sauvegarde les relations d'équivalence dans un dictionnaire avec en clé l'api et en valeur l'arpa (et on fait l'inverse pour le deuxième dictionnaire)
+ split_arpa_api=ligne.strip().split('=>')
+ symbole_arpa=split_arpa_api[0]
+ symbole_api=split_arpa_api[1]
+ dic_arpa_to_api[symbole_api]=symbole_arpa
+ reverse_dic_arpa_to_api[symbole_arpa]=symbole_api
+
+ # on ferme le fichier de ressource une fois le traitement terminé
+ ressource_equiv_arpa_api.close()
+
+ # On ouvre en lecture le corpus a traité et en écriture les fichier de résultat de normalisation complet + API seulement
+ corpus_mot_arpa = open(emplacement_fichier_entree+nom_fichier,'r',encoding='utf-8')
+ fichier_norma_api = open(emplacement_fichier_sortie+nom_sans_ext+".train",'w',encoding='utf_8')
+ fichier_pho_api_only = open(emplacement_fichier_sortie+nom_sans_ext+".col.api.txt",'w',encoding='utf_8')
+
+ for ligne in corpus_mot_arpa:
+ # On isole les éléments à traiter : ici les phonèmes en arpa
+ split_corpus_mot_arpa=ligne.strip().split('\t')
+ corpus_mot=split_corpus_mot_arpa[0]
+ corpus_arpa=split_corpus_mot_arpa[1]
+ corpus_split_arpa=corpus_arpa.split(' ')
+ fichier_norma_api.write("\n")
+ fichier_pho_api_only.write("\n")
+ fichier_norma_api.write(corpus_mot.lower()+"\t")
+
+ for nbr_symb_arpa in corpus_split_arpa:
+ # on écrit les correspondances trouvées dans un fichier de résultat
+ fichier_norma_api.write(reverse_dic_arpa_to_api[nbr_symb_arpa]+" ")
+ fichier_pho_api_only.write(reverse_dic_arpa_to_api[nbr_symb_arpa]+" ")
+
+ fichier_norma_api.write("\n")
+ fichier_pho_api_only.write("\n")
+
+ # On ferme les différents fichiers ouverts, ceux de résultat et celui du corpus originel
+ corpus_mot_arpa.close()
+ fichier_norma_api.close()
+ fichier_pho_api_only.close()
+
+ print("\n\tFin de la normalisation Arpabet vers API.")
+ print("\nLe fichier normalisé au format API et converti en minuscule est disponible dans le dossier "+emplacement_fichier_sortie+" sous le nom de "+nom_sans_ext+".train")
+ print("\nLa liste des phonèmes en API de ce fichier est également disponible dans le dossier "+emplacement_fichier_sortie+" sous le nom de "+nom_sans_ext+".col.api.txt")
diff --git a/tools/espace_entre_caracteres.py b/tools/espace_entre_caracteres.py
new file mode 100644
index 0000000..c466434
--- /dev/null
+++ b/tools/espace_entre_caracteres.py
@@ -0,0 +1,59 @@
+#!/usr/bin/python
+# -*- 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 petit script permettant simplement de séparer les caractères d'un texte en entrée par des espaces
+#
+# 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 re
+
+# Note : les emplacements des fichiers sont définis en partant de l'emplacement du main.py
+def espaces_entre_carac(nom_fichier):
+
+ # Nom du fichier tel que reçu par la fonction
+ nom_sans_ext=nom_fichier
+
+ # Emplacement du fichier d'entrée
+ emplacement_fichier_entree="import_corpus/"
+
+ # Emplacement du résultat de sortie
+ emplacement_fichier_sortie="output/"
+
+ # Nom complet du fichier d'entrée
+ nom_fichier=nom_fichier+".txt"
+
+ print("\n\tDébut de la séparation de tous les caractères par des espaces.")
+
+ # On ouvre les fichiers en lecture et en écriture
+ fichier = open(emplacement_fichier_entree+nom_fichier,'r',encoding='utf_8')
+ fichier_ecriture = open(emplacement_fichier_sortie+nom_sans_ext+"_espace_entre_carac.txt",'w',encoding='utf_8')
+
+ # On crée une liste pour chaque ligne et on la convertis en string, on remplace alors les éléments séparateurs par des espaces
+ for ligne in fichier:
+ split_every_char=list(ligne)
+ to_string=str(split_every_char)
+ traitement=re.sub('\n|\'|\[|\]|,|\"','',to_string)
+ traitement=re.sub('\s{2,}',' ',traitement)
+ fichier_ecriture.write(traitement+"\n")
+
+ # Pour plus de flexibilité les marques de retour à la ligne ou de tabulation sont conservés
+ # On ferme les fichiers une fois le traitement fini
+ fichier.close()
+ fichier_ecriture.close()
+
+ print("\n\tFin du traitement.")
+ print("\nLe fichier où tous les caractères sont séparés par des espaces est disponible dans le dossier "+emplacement_fichier_sortie+" sous le nom de "+nom_sans_ext+"_espace_entre_carac.txt")
+
\ No newline at end of file
diff --git a/tools/recup_phoneme.py b/tools/recup_phoneme.py
new file mode 100644
index 0000000..71e9e52
--- /dev/null
+++ b/tools/recup_phoneme.py
@@ -0,0 +1,59 @@
+#!/usr/bin/python
+# -*- 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 petit script permettant simplement de récupérer les phonèmes d'un corpus
+# cet utilitaire est conçu pour traiter les corpus construits sur le modèle suivant : mot1 \tabulation p h o n è m es
+#
+# 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 re
+
+# Note : les emplacements des fichiers sont définis en partant de l'emplacement du main.py
+def recup_phoneme(nom_fichier):
+
+ # Nom du fichier tel que reçu par la fonction
+ nom_sans_ext=nom_fichier
+
+ # Emplacement du fichier d'entrée
+ emplacement_fichier_entree="import_corpus/"
+
+ # Emplacement du résultat de sortie
+ emplacement_fichier_sortie="output/"
+
+ # Nom complet du fichier d'entrée
+ nom_fichier=nom_fichier+".txt"
+
+ print("\n\tDébut de la séparation de tous les caractères par des espaces.")
+
+ # On ouvre les fichiers en lecture et en écriture
+ fichier = open(emplacement_fichier_entree+nom_fichier,'r',encoding='utf_8')
+ fichier_ecriture = open(emplacement_fichier_sortie+nom_sans_ext+".col.api.txt",'w',encoding='utf_8')
+
+ # On split sur les tabulation et on sauvegarde l'index[1] dans le fichier de résultat
+ for ligne in fichier:
+ try:
+ split_tab=ligne.split("\t")
+ fichier_ecriture.write(split_tab[1]+"\n")
+ except:
+ pass
+
+ # On ferme les fichiers une fois le traitement fini
+ fichier.close()
+ fichier_ecriture.close()
+
+ print("\n\tFin du traitement.")
+ print("\nLe fichier contenant uniquement les phonème est disponible dans le dossier "+emplacement_fichier_sortie+" sous le nom de "+nom_sans_ext+".col.api.txt")
+
\ No newline at end of file
diff --git a/tools/sampa_vers_api.py b/tools/sampa_vers_api.py
new file mode 100644
index 0000000..f8b7fda
--- /dev/null
+++ b/tools/sampa_vers_api.py
@@ -0,0 +1,105 @@
+#!/usr/bin/python
+# -*- 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 script de normalisation SAMPA vers API, il crée aussi un fichier contenant uniquement les mots en API du corpus en entrée.
+#
+# 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 re
+import collections
+
+# Note : les emplacements des fichiers sont définis en partant de l'emplacement du main.py
+def sampa_vers_api(nom_fichier):
+
+ # Nom du fichier d'entrée tel que reçu par la fonction
+ nom_sans_ext=nom_fichier
+
+ # Emplacement du fichier d'entrée
+ emplacement_fichier_entree="import_corpus/"
+
+ # Nom complet du fichier d'entrée
+ nom_fichier=nom_fichier+".txt"
+
+ # Emplacement du dossier de configuration de l'utilitaire
+ emplacement_fichier_config="config/"
+
+ # Nom du fichier d'équivalence arpa vers api
+ nom_fichier_equivalences="equiv_arpa_api.txt"
+
+ # Nom du dossier où le fichier de résultat sera créé
+ emplacement_fichier_sortie="output/"
+
+ # Ouverture des deux dictionnaires qui permettront la réalisation de la conversion
+ dic_sampa_to_api={}
+
+ reverse_dic_sampa_to_api={}
+
+ print("\n\tDébut de la normalisation Sampa vers API...")
+
+ # Ouverture du fichier de configuration
+ ressource_equiv_sampa_api = open(emplacement_fichier_config+nom_fichier_equivalences,'r',encoding='utf-8')
+
+ # Mise en mémoire de la correspondance des symboles arpa et api
+ # Les lignes commençant par "#" ne sont pas prises en compte dans le fichier de ressource
+ for ligne in ressource_equiv_sampa_api:
+ if (re.search('^#',ligne)):
+ pass
+ else:
+ # on sauvegarde les relations d'équivalence dans un dictionnaire avec en clé l'api et en valeur le sampa (et on fait l'inverse pour le deuxième dictionnaire)
+ split_sampa_api=ligne.strip().split('=>')
+ symbole_sampa=split_sampa_api[0]
+ symbole_api=split_sampa_api[1]
+ dic_sampa_to_api[symbole_api]=symbole_sampa
+ reverse_dic_sampa_to_api[symbole_sampa]=symbole_api
+
+ # Fermeture du fichier de configuration
+ ressource_equiv_sampa_api.close()
+
+ # Ouverture du corpus à traiter ainsi que des fichiers de résultats complet et avec API seulement
+ corpus_mot_sampa = open(emplacement_fichier_entree+nom_fichier,'r',encoding='utf-8')
+ fichier_norma_api = open(emplacement_fichier_sortie+nom_sans_ext+".train",'w',encoding='utf_8')
+ fichier_pho_api_only = open(emplacement_fichier_sortie+nom_sans_ext+".col.api.txt",'w',encoding='utf_8')
+
+ # On sépare le corpus en deux colonnes : mots et phonétique, utile par la suite pour créer deux fichiers de résultat
+ for ligne in corpus_mot_sampa:
+ split_corpus_mot_sampa=ligne.strip().split('\t')
+ corpus_mot=split_corpus_mot_sampa[0]
+ corpus_sampa=split_corpus_mot_sampa[1]
+ fichier_norma_api.write(corpus_mot.lower()+"\t")
+
+ # On essaye de faire correspondre caractère par caractère les phonèmes car sous le format SAMPA de lexique.org, 1 caractère = 1 phonème
+ # Ceci nécessite une bonne segmentation du corpus d'entrée
+ for c in corpus_sampa:
+ c.strip(" ")
+ for keys_sampa in reverse_dic_sampa_to_api:
+ m=re.search(keys_sampa,c)
+ if m:
+ # si l'équivalence existe, on l'imprime dans le nouveau corpus avant de passer au reste
+ get_pho_api=reverse_dic_sampa_to_api.get(m.group())
+ fichier_norma_api.write(get_pho_api+" ")
+ fichier_pho_api_only.write(get_pho_api+" ")
+
+ fichier_norma_api.write("\n")
+ fichier_pho_api_only.write("\n")
+
+ # On ferme les fichiers en écriture et lecture
+ corpus_mot_sampa.close()
+ fichier_norma_api.close()
+ fichier_pho_api_only.close()
+
+ print("\n\tFin de la normalisation Sampa vers API.")
+ print("\nLe fichier normalisé au format API et converti en minuscule est disponible dans le dossier "+emplacement_fichier_sortie+" sous le nom de "+nom_sans_ext+".train")
+ print("\nLa liste des phonèmes en API de ce fichier est également disponible dans le dossier "+emplacement_fichier_sortie+" sous le nom de "+nom_sans_ext+".col.api.txt")