ankban commited on
Commit
ac86e3d
Β·
verified Β·
1 Parent(s): 8664e86

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -10
app.py CHANGED
@@ -1,4 +1,3 @@
1
-
2
  import gradio as gr
3
  import openai
4
  from openai import OpenAI
@@ -12,8 +11,12 @@ from datetime import datetime
12
  from sqlmodel import SQLModel, Field, create_engine, Session, select
13
  from typing import Optional
14
  import glob
 
 
 
 
15
 
16
- # === Clean temp audio files ===
17
  for pattern in ["/tmp/*.wav", "/tmp/*.mp3"]:
18
  for filepath in glob.glob(pattern):
19
  try:
@@ -21,22 +24,23 @@ for pattern in ["/tmp/*.wav", "/tmp/*.mp3"]:
21
  except Exception as e:
22
  print(f"Could not delete {filepath}: {e}")
23
 
24
- # === Environment Setup ===
25
  os.environ["HF_HOME"] = "/tmp/hf"
26
  os.environ["TRANSFORMERS_CACHE"] = "/tmp/hf"
27
  os.environ["XDG_CACHE_HOME"] = "/tmp/hf"
28
  os.environ["MPLCONFIGDIR"] = "/tmp/matplotlib"
29
  db_path = "/tmp/chatter_sessions.db"
30
  openai.api_key = os.getenv("OPENAI_API_KEY")
31
- client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
32
 
33
- # === Language Codes ===
34
  LANG_CODES = {
35
  "English": "en", "Spanish": "es", "Hindi": "hi", "French": "fr", "German": "de",
36
  "Arabic": "ar", "Chinese": "zh", "Portuguese": "pt", "Japanese": "ja", "Korean": "ko"
37
  }
 
38
 
39
- # === SQLModel with nickname support ===
40
  class SessionEntry(SQLModel, table=True):
41
  id: Optional[int] = Field(default=None, primary_key=True)
42
  user: str
@@ -68,7 +72,7 @@ def fetch_user_sessions(user):
68
  session.close()
69
  return results
70
 
71
- # === Load Whisper ===
72
  model = WhisperModel("base", compute_type="int8")
73
 
74
  def convert_to_wav(input_file):
@@ -81,7 +85,7 @@ def transcribe_audio(audio_path):
81
  segments, _ = model.transcribe(audio_path)
82
  return " ".join([segment.text for segment in segments])
83
 
84
- # === GPT Feedback ===
85
  def generate_feedback(transcript, language):
86
  prompt = f"""You are a communication coach. Please respond in [language={language}].
87
  Evaluate the user's speech on:
@@ -124,6 +128,41 @@ Transcript:
124
  )
125
  return response.choices[0].message.content
126
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  def tutor_feedback(audio_file, language, nickname):
128
  if not audio_file or not os.path.exists(audio_file):
129
  return "", "No audio received.", None, "", []
@@ -170,7 +209,12 @@ with gr.Blocks(css="light_mode_chatter_owl.css") as app:
170
  example_box = gr.Textbox(label="πŸ—£ Suggested Improvement", visible=True, placeholder="Click to generate improved speech...")
171
  history_table = gr.Dataframe(headers=["πŸ•’ Timestamp", "🌐 Language", "πŸ“ Transcript (Preview)", "πŸ“‹ Feedback (Preview)"])
172
 
173
- # Interactions
 
 
 
 
 
174
  audio_input.change(fn=tutor_feedback,
175
  inputs=[audio_input, language_dropdown, nickname_box],
176
  outputs=[transcript_box, feedback_box, audio_output, hidden_transcript, history_table])
@@ -183,7 +227,11 @@ with gr.Blocks(css="light_mode_chatter_owl.css") as app:
183
  inputs=[hidden_transcript, language_dropdown],
184
  outputs=example_box)
185
 
186
- # === Launch App ===
 
 
 
 
187
  if __name__ == "__main__":
188
  print("βœ… App is launching...")
189
  app.launch(server_name="0.0.0.0", server_port=7860, debug=True)
 
 
1
  import gradio as gr
2
  import openai
3
  from openai import OpenAI
 
11
  from sqlmodel import SQLModel, Field, create_engine, Session, select
12
  from typing import Optional
13
  import glob
14
+ import re
15
+ import matplotlib.pyplot as plt
16
+ import io
17
+ import base64
18
 
19
+ # === Temp file cleanup ===
20
  for pattern in ["/tmp/*.wav", "/tmp/*.mp3"]:
21
  for filepath in glob.glob(pattern):
22
  try:
 
24
  except Exception as e:
25
  print(f"Could not delete {filepath}: {e}")
26
 
27
+ # === Environment setup ===
28
  os.environ["HF_HOME"] = "/tmp/hf"
29
  os.environ["TRANSFORMERS_CACHE"] = "/tmp/hf"
30
  os.environ["XDG_CACHE_HOME"] = "/tmp/hf"
31
  os.environ["MPLCONFIGDIR"] = "/tmp/matplotlib"
32
  db_path = "/tmp/chatter_sessions.db"
33
  openai.api_key = os.getenv("OPENAI_API_KEY")
34
+ client = OpenAI(api_key=openai.api_key)
35
 
36
+ # === Language codes ===
37
  LANG_CODES = {
38
  "English": "en", "Spanish": "es", "Hindi": "hi", "French": "fr", "German": "de",
39
  "Arabic": "ar", "Chinese": "zh", "Portuguese": "pt", "Japanese": "ja", "Korean": "ko"
40
  }
41
+ CATEGORIES = ["Clarity", "Structure", "Fluency", "Content Relevance", "Tone & Expression", "Average"]
42
 
43
+ # === SQLModel setup ===
44
  class SessionEntry(SQLModel, table=True):
45
  id: Optional[int] = Field(default=None, primary_key=True)
46
  user: str
 
72
  session.close()
73
  return results
74
 
75
+ # === Whisper ===
76
  model = WhisperModel("base", compute_type="int8")
77
 
78
  def convert_to_wav(input_file):
 
85
  segments, _ = model.transcribe(audio_path)
86
  return " ".join([segment.text for segment in segments])
87
 
88
+ # === GPT-4 Feedback ===
89
  def generate_feedback(transcript, language):
90
  prompt = f"""You are a communication coach. Please respond in [language={language}].
91
  Evaluate the user's speech on:
 
128
  )
129
  return response.choices[0].message.content
130
 
131
+ def parse_scores(feedback):
132
+ scores = {}
133
+ for cat in CATEGORIES[:-1]: # Skip "Average" for now
134
+ match = re.search(fr"{cat}:\s*(\d+)/10", feedback)
135
+ scores[cat] = int(match.group(1)) if match else None
136
+ values = [s for s in scores.values() if s is not None]
137
+ scores["Average"] = round(sum(values)/len(values), 2) if values else None
138
+ return scores
139
+
140
+ def generate_user_chart(user, metric):
141
+ sessions = fetch_user_sessions(user)
142
+ if not sessions or metric not in CATEGORIES:
143
+ return None
144
+
145
+ session_ids = list(range(1, len(sessions) + 1))
146
+ scores = []
147
+ for s in sessions:
148
+ parsed = parse_scores(s.feedback)
149
+ scores.append(parsed.get(metric, 0))
150
+
151
+ fig, ax = plt.subplots()
152
+ ax.plot(session_ids, scores, marker='o', label=metric)
153
+ ax.set_title(f"{metric} Score Over Time for {user}")
154
+ ax.set_xlabel("Session")
155
+ ax.set_ylabel("Score (0–10)")
156
+ ax.set_ylim(0, 10)
157
+ ax.grid(True)
158
+ ax.legend()
159
+
160
+ buf = io.BytesIO()
161
+ plt.savefig(buf, format="png")
162
+ plt.close(fig)
163
+ buf.seek(0)
164
+ return f"data:image/png;base64,{base64.b64encode(buf.read()).decode()}"
165
+
166
  def tutor_feedback(audio_file, language, nickname):
167
  if not audio_file or not os.path.exists(audio_file):
168
  return "", "No audio received.", None, "", []
 
209
  example_box = gr.Textbox(label="πŸ—£ Suggested Improvement", visible=True, placeholder="Click to generate improved speech...")
210
  history_table = gr.Dataframe(headers=["πŸ•’ Timestamp", "🌐 Language", "πŸ“ Transcript (Preview)", "πŸ“‹ Feedback (Preview)"])
211
 
212
+ with gr.Row():
213
+ chart_metric = gr.Dropdown(label="πŸ“ˆ Choose Metric to Visualize", choices=CATEGORIES, value="Average")
214
+ view_chart = gr.Button("πŸ“Š Show Progress Chart")
215
+
216
+ chart_output = gr.Image(label="πŸ“‰ Your Progress")
217
+
218
  audio_input.change(fn=tutor_feedback,
219
  inputs=[audio_input, language_dropdown, nickname_box],
220
  outputs=[transcript_box, feedback_box, audio_output, hidden_transcript, history_table])
 
227
  inputs=[hidden_transcript, language_dropdown],
228
  outputs=example_box)
229
 
230
+ view_chart.click(fn=generate_user_chart,
231
+ inputs=[nickname_box, chart_metric],
232
+ outputs=chart_output)
233
+
234
+ # === Launch ===
235
  if __name__ == "__main__":
236
  print("βœ… App is launching...")
237
  app.launch(server_name="0.0.0.0", server_port=7860, debug=True)