mramirez2001 commited on
Commit
e4e7415
verified
1 Parent(s): 5b37622

Upload 3 files

Browse files
Files changed (4) hide show
  1. .gitattributes +1 -0
  2. ES_SP_A2_23_4_14_B.mp3 +3 -0
  3. app.py +135 -0
  4. requirements.txt +3 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ ES_SP_A2_23_4_14_B.mp3 filter=lfs diff=lfs merge=lfs -text
ES_SP_A2_23_4_14_B.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6fb735b421820d07a0ab9433fe54c6feb4889e5e2300b241429ac6d0862a541d
3
+ size 4498911
app.py ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # app.py
2
+
3
+ import gradio as gr
4
+ import os
5
+ from openai import OpenAI
6
+ import json
7
+
8
+ # --- 1. Configurar el Cliente de OpenAI ---
9
+ # La clave de API se cargar谩 de forma segura desde los "Secrets" de Hugging Face
10
+ try:
11
+ client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
12
+ api_key_found = True
13
+ except TypeError:
14
+ api_key_found = False
15
+
16
+ # --- 2. El Prompt: El Cerebro de la Operaci贸n ---
17
+ # Este prompt le dice a GPT-4o c贸mo actuar y qu茅 analizar.
18
+ SYSTEM_PROMPT = """
19
+ Eres un experto evaluador de ingl茅s como segundo idioma (ESL) con un doctorado en fon茅tica.
20
+ Tu tarea es analizar un audio, la transcripci贸n del usuario y la transcripci贸n generada por Whisper.
21
+ Debes calificar la pronunciaci贸n general en una escala de 0 a 100.
22
+ Tu an谩lisis debe ser profundo, considerando:
23
+ 1. **Precisi贸n (Accuracy):** Compara la transcripci贸n del usuario con la de Whisper para detectar palabras omitidas o incorrectas.
24
+ 2. **Fluidez (Fluency):** Analiza el ritmo, la cadencia y la presencia de pausas o muletillas (uh, um).
25
+ 3. **Prosodia (Prosody):** Eval煤a la entonaci贸n y el acento de la frase. 驴Suena natural o mon贸tono?
26
+
27
+ Devuelve tu an谩lisis 煤nicamente en un formato JSON estricto con la siguiente estructura:
28
+ {
29
+ "calificacion_general_100": integer,
30
+ "nivel_mcerl_estimado": "string (ej. A2)",
31
+ "analisis_fluidez": "string (un p谩rrafo corto)",
32
+ "analisis_precision": "string (un p谩rrafo corto)",
33
+ "palabras_a_mejorar": [
34
+ {"palabra": "string", "error_detectado": "string (ej. pronunciado como '...')" }
35
+ ]
36
+ }
37
+ """
38
+
39
+ # --- 3. La Funci贸n Principal que se Conecta a Gradio ---
40
+ def evaluate_pronunciation_openai(audio_input, user_transcript):
41
+ """
42
+ Toma un audio y un texto, los env铆a a la API de OpenAI y formatea la respuesta.
43
+ """
44
+ if not api_key_found:
45
+ raise gr.Error("Clave de API de OpenAI no encontrada. Aseg煤rate de configurarla en los 'Secrets' de tu Space.")
46
+
47
+ if audio_input is None or not user_transcript:
48
+ return 0, "N/A", "N/A", "N/A", [("Por favor, proporciona un audio y una transcripci贸n.", None)]
49
+
50
+ sr, waveform = audio_input # Gradio nos da el audio
51
+
52
+ # Guardar temporalmente el audio para enviarlo a la API
53
+ temp_audio_path = "temp_audio.wav"
54
+ import soundfile as sf
55
+ sf.write(temp_audio_path, waveform, sr)
56
+
57
+ # 1. Transcribir el audio con la API de Whisper de OpenAI
58
+ print("Transcribiendo audio con Whisper API...")
59
+ with open(temp_audio_path, "rb") as audio_file:
60
+ ai_transcript = client.audio.transcriptions.create(
61
+ model="whisper-1",
62
+ file=audio_file
63
+ ).text
64
+
65
+ # 2. Construir el prompt final para el modelo de lenguaje
66
+ user_prompt = f"""
67
+ Eval煤a el audio proporcionado.
68
+ Transcripci贸n del usuario: "{user_transcript}"
69
+ Transcripci贸n generada por la IA (Whisper): "{ai_transcript}"
70
+ """
71
+
72
+ # 3. Llamar a la API de Chat (GPT-4o) para la evaluaci贸n
73
+ print("Enviando a GPT-4o para evaluaci贸n...")
74
+ response = client.chat.completions.create(
75
+ model="gpt-4o",
76
+ response_format={"type": "json_object"},
77
+ messages=[
78
+ {"role": "system", "content": SYSTEM_PROMPT},
79
+ {"role": "user", "content": user_prompt}
80
+ ]
81
+ )
82
+
83
+ # 4. Procesar y formatear la respuesta JSON
84
+ try:
85
+ result = json.loads(response.choices[0].message.content)
86
+ score = result.get("calificacion_general_100", 0)
87
+ level = result.get("nivel_mcerl_estimado", "N/A")
88
+ fluency = result.get("analisis_fluidez", "")
89
+ accuracy = result.get("analisis_precision", "")
90
+
91
+ highlighted_feedback = []
92
+ # Crear retroalimentaci贸n visual a partir de la transcripci贸n de la IA
93
+ words_to_improve = {item['palabra'].upper() for item in result.get("palabras_a_mejorar", [])}
94
+ for word in ai_transcript.split():
95
+ if word.upper().strip(".,?!") in words_to_improve:
96
+ highlighted_feedback.append((word, "Mejorar"))
97
+ else:
98
+ highlighted_feedback.append(word)
99
+
100
+ return score, level, fluency, accuracy, highlighted_feedback
101
+ except (json.JSONDecodeError, KeyError) as e:
102
+ print(f"Error al parsear la respuesta de la API: {e}")
103
+ return 0, "Error", "Error", "Error", [("La respuesta de la API no tuvo el formato esperado.", None)]
104
+
105
+
106
+ # --- 5. Definir y Lanzar la Interfaz de Gradio ---
107
+ description = """
108
+ Sube un audio y escribe la transcripci贸n. La IA de OpenAI (Whisper + GPT-4o)
109
+ analizar谩 tu pronunciaci贸n, fluidez y prosodia para darte una calificaci贸n completa
110
+ y una retroalimentaci贸n detallada.
111
+ """
112
+
113
+ demo = gr.Interface(
114
+ fn=evaluate_pronunciation_openai,
115
+ inputs=[
116
+ gr.Audio(type="numpy", label="Sube tu Audio (.wav o .mp3)"),
117
+ gr.Textbox(lines=5, label="Escribe la Transcripci贸n Aqu铆")
118
+ ],
119
+ outputs=[
120
+ gr.Number(label="Calificaci贸n General (0-100)"),
121
+ gr.Textbox(label="Nivel MCERL Estimado"),
122
+ gr.Textbox(label="An谩lisis de Fluidez"),
123
+ gr.Textbox(label="An谩lisis de Precisi贸n"),
124
+ gr.HighlightedText(
125
+ label="Retroalimentaci贸n por Palabra",
126
+ color_map={"Mejorar": "yellow"}
127
+ )
128
+ ],
129
+ title="馃 Evaluador de Pronunciaci贸n con OpenAI API",
130
+ description=description,
131
+ examples=[["audio_ejemplo.mp3", "MARK IS GOING TO SEE ELEPHANT"]]
132
+ )
133
+
134
+ if __name__ == "__main__":
135
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ gradio
2
+ openai
3
+ soundfile