Lenylvt commited on
Commit
ec5aa3a
·
verified ·
1 Parent(s): c755bb6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +59 -19
app.py CHANGED
@@ -10,6 +10,7 @@ from pydub import AudioSegment
10
  # Initialize Hugging Face InferenceClient
11
  client_hf = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1")
12
 
 
13
  async def text_to_speech_edge(text, language_code):
14
  voice = {"fr": "fr-FR-RemyMultilingualNeural"}[language_code]
15
  communicate = edge_tts.Communicate(text, voice)
@@ -18,6 +19,7 @@ async def text_to_speech_edge(text, language_code):
18
  await communicate.save(tmp_path)
19
  return tmp_path
20
 
 
21
  def run_in_threadpool(func, *args, **kwargs):
22
  loop = asyncio.new_event_loop()
23
  asyncio.set_event_loop(loop)
@@ -33,6 +35,7 @@ def concatenate_audio(paths):
33
  combined.export(combined_path, format="mp3")
34
  return combined_path
35
 
 
36
  def dictee_to_audio_segmented(dictee):
37
  sentences = segmenter_texte(dictee)
38
  audio_urls = []
@@ -60,6 +63,23 @@ def generer_dictee(classe, longueur):
60
  dictee = dictee.replace("</s>", "").strip()
61
  return dictee
62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  def replace_punctuation(text):
64
  replacements = {
65
  ".": " point.",
@@ -77,30 +97,50 @@ def segmenter_texte(texte):
77
  sentences = re.split(r'(?<=[.!?]) +', texte)
78
  return sentences
79
 
 
 
 
 
 
80
  st.set_page_config(layout="wide")
81
  st.title('Générateur de Dictée')
82
 
83
  with st.expander("Paramètres de la dictée", expanded=True):
84
- mode = st.radio("Mode:", ["S'entrainer", "Entrainer"])
85
  classe = st.selectbox("Classe", ["CP", "CE1", "CE2", "CM1", "CM2", "6ème", "5ème", "4ème", "3ème", "Seconde", "Premiere", "Terminale"], index=2)
86
  longueur = st.slider("Longueur de la dictée (nombre de mots)", 50, 500, 200)
87
-
88
- if st.button('Générer la Dictée'):
 
89
  with st.spinner("Génération de la dictée en cours..."):
90
  dictee = generer_dictee(classe, longueur)
91
- if mode == "S'entrainer":
92
- audio_urls = dictee_to_audio_segmented(dictee)
93
- concatenated_audio_path = concatenate_audio(audio_urls)
94
- col1, col2 = st.columns(2)
95
- with col1:
96
- st.audio(concatenated_audio_path, format='audio/mp3')
97
- with col2:
98
- # Utiliser st.session_state pour conserver la saisie de l'utilisateur
99
- user_input = st.text_area("Écrivez la dictée ici:", value=st.session_state.get('user_input', ''), height=300, key='user_input')
100
- if st.button('Correction'):
101
- st.write("Dictée originale:")
102
- st.text(dictee)
103
- # Ajouter ici la logique de comparaison/correction détaillée si nécessaire
104
-
105
- elif mode == "Entrainer":
106
- st.text_area("Voici votre dictée :", dictee, height=300)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  # Initialize Hugging Face InferenceClient
11
  client_hf = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1")
12
 
13
+ # Define the async function for text-to-speech conversion using Edge TTS
14
  async def text_to_speech_edge(text, language_code):
15
  voice = {"fr": "fr-FR-RemyMultilingualNeural"}[language_code]
16
  communicate = edge_tts.Communicate(text, voice)
 
19
  await communicate.save(tmp_path)
20
  return tmp_path
21
 
22
+ # Helper function to run async functions from within Streamlit (synchronous context)
23
  def run_in_threadpool(func, *args, **kwargs):
24
  loop = asyncio.new_event_loop()
25
  asyncio.set_event_loop(loop)
 
35
  combined.export(combined_path, format="mp3")
36
  return combined_path
37
 
38
+ # Modified function to work with async Edge TTS
39
  def dictee_to_audio_segmented(dictee):
40
  sentences = segmenter_texte(dictee)
41
  audio_urls = []
 
63
  dictee = dictee.replace("</s>", "").strip()
64
  return dictee
65
 
66
+ def correction_dictee(dictee, dictee_utilisateur):
67
+ prompt = f"Voici une dictée crée: {dictee} | Voici la dictée faite par l'utilisateur : {dictee_utilisateur} - Corrige la dictée en donnant les explications, utilise les syntax du markdown pour une meilleur comprehesion de la correction."
68
+ generate_kwargs = {
69
+ "temperature": 0.7,
70
+ "max_new_tokens": 2000, # Ajustez selon la longueur attendue de la correction
71
+ "top_p": 0.95,
72
+ "repetition_penalty": 1.2,
73
+ "do_sample": True,
74
+ }
75
+ formatted_prompt = f"<s>[INST] {prompt} [/INST]"
76
+ stream = client_hf.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
77
+ texte_ameliore = ""
78
+ for response in stream:
79
+ texte_ameliore += response.token.text
80
+ texte_ameliore = texte_ameliore.replace("</s>", "").strip()
81
+ return correction
82
+
83
  def replace_punctuation(text):
84
  replacements = {
85
  ".": " point.",
 
97
  sentences = re.split(r'(?<=[.!?]) +', texte)
98
  return sentences
99
 
100
+ # Stocker la dictée dans une variable de session pour qu'elle persiste
101
+ if 'dictée' not in st.session_state:
102
+ st.session_state.dictée = None
103
+
104
+ # Streamlit App Interface
105
  st.set_page_config(layout="wide")
106
  st.title('Générateur de Dictée')
107
 
108
  with st.expander("Paramètres de la dictée", expanded=True):
109
+ mode = st.radio("Mode:", ["S'entrainer: Vous aurez uniquement les audios suivi d'une correction par IA (Pour 1 seul personne)", "Entrainer: Vous aurez uniquement le texte de la dictée pour entrainer quelqu'un d'autre (Pour 2 ou + personnes)"])
110
  classe = st.selectbox("Classe", ["CP", "CE1", "CE2", "CM1", "CM2", "6ème", "5ème", "4ème", "3ème", "Seconde", "Premiere", "Terminale"], index=2)
111
  longueur = st.slider("Longueur de la dictée (nombre de mots)", 50, 500, 200)
112
+ bouton_generer = st.button('Générer la Dictée')
113
+
114
+ if bouton_generer:
115
  with st.spinner("Génération de la dictée en cours..."):
116
  dictee = generer_dictee(classe, longueur)
117
+ st.session_state.dictée = dictee
118
+
119
+ if st.session_state.dictée:
120
+ # Afficher la dictée ou les audios en fonction du mode
121
+ if mode == "S'entrainer: Vous aurez uniquement les audios suivi d'une correction par IA (Pour 1 seul personne)":
122
+ audio_urls = dictee_to_audio_segmented(st.session_state.dictée)
123
+ concatenated_audio_path = concatenate_audio(audio_urls)
124
+
125
+ col1, col2 = st.columns(2)
126
+
127
+ with col1:
128
+ st.audio(concatenated_audio_path, format='audio/wav', start_time=0)
129
+ with st.expander("Phrases de la Dictée"):
130
+ for idx, url in enumerate(audio_urls, start=1):
131
+ st.markdown(f"**Phrase {idx}:**")
132
+ st.audio(url, format='audio/wav')
133
+
134
+ with col2:
135
+ dictee_utilisateur = st.text_input("Écrivez la dictée ici:")
136
+ if st.button('Correction'):
137
+ with st.spinner("Génération de la correction en cours..."):
138
+ correction = correction_dictee(st.session_state.dictée, dictee_utilisateur)
139
+ st.text_area("Voici la correction :", correction, height=500)
140
+
141
+ elif mode == "Entrainer: Vous aurez uniquement le texte de la dictée pour entrainer quelqu'un d'autre (Pour 2 ou + personnes)":
142
+ st.text_area("Voici votre dictée :", st.session_state.dictée, height=300)
143
+
144
+ # Ajouter un bouton "Retour" pour réinitialiser la session
145
+ if st.button('Retour'):
146
+ st.session_state.dictée = None