|
import gradio as gr |
|
import requests |
|
import os |
|
|
|
API_URL = os.getenv('API_URL') |
|
ACCESS_KEY = os.getenv('ACCESS_KEY') |
|
|
|
|
|
mapping_style_en = { |
|
"Close, friendly": "Gần gũi, thân thiện", |
|
"Short, concise": "Ngắn gọn, xúc tích", |
|
"Emotions": "Nhiều cảm xúc", |
|
} |
|
|
|
|
|
|
|
def generate_comment( |
|
title, |
|
style, |
|
content, |
|
bodyLanguage, |
|
facialEyeContact, |
|
voice, |
|
pronunciation, |
|
fluency, |
|
slideDesign, |
|
): |
|
payload = { |
|
"title": title, |
|
"style": mapping_style_en.get(style, style), |
|
"content": content, |
|
"bodyLanguage": bodyLanguage, |
|
"facialEyeContact": facialEyeContact, |
|
"voice": voice, |
|
"pronunciation": pronunciation, |
|
"fluency": fluency, |
|
"slideDesign": slideDesign, |
|
} |
|
headers = { |
|
"accept": "application/json", |
|
"access-key": ACCESS_KEY, |
|
"Content-Type": "application/json", |
|
} |
|
resp = requests.post(API_URL, headers=headers, json=payload) |
|
if resp.ok: |
|
return resp.json().get("data", {}).get("vietnamese", "No comment") |
|
return f"Error {resp.status_code}: {resp.text}" |
|
|
|
|
|
|
|
base_choices = [ |
|
"1 - Needs Work (Hard to follow or lacks structure)", |
|
"2 - Good (Clear but simple structure or idea)", |
|
"3 - Excellent (Clear, well-organized, logical structure, and interesting ideas)", |
|
] |
|
|
|
content_choices = base_choices |
|
body_language_choices = [ |
|
"1 - Needs Work (No hand gestures or distracting movements)", |
|
"2 - Good (Student sometimes uses hand gestures appropriately)", |
|
"3 - Excellent (Student uses hand gestures confidently to support message)", |
|
] |
|
facial_eye_contact_choices = [ |
|
"1 - Needs Work (Looks away from camera (e.g., down or to the side), no expression)", |
|
"2 - Good (Sometimes looks at camera, with some expression)", |
|
"3 - Excellent (Student looks directly at camera, with appropriate facial expression)", |
|
] |
|
|
|
voice_choices = [ |
|
"1 - Needs Work (Too quiet, flat or hard to hear)", |
|
"2 - Good (Mostly clear and loud)", |
|
"3 - Excellent (Clear, loud, varied tone)", |
|
] |
|
pronunciation_choices = [ |
|
"1 - Needs Work (Hard to understand, many pronunciation mistakes)", |
|
"2 - Good (Mostly clear, some errors)", |
|
"3 - Excellent (Easy to understand, correct pronunciation)", |
|
] |
|
|
|
fluency_choices = [ |
|
"1 - Needs Work (Frequent pauses, hard to follow)", |
|
"2 - Good (Some hesitation or uneven pace)", |
|
"3 - Excellent (Speaks smoothly, natural pace, few pauses or fillers)", |
|
] |
|
slide_design_choices = [ |
|
"1 - Needs Work (Hard to read, messy or too much text)", |
|
"2 - Good (Basic but readable, some visuals)", |
|
"3 - Excellent (Clear, well-organized, visual support, not too much text)", |
|
] |
|
|
|
with gr.Blocks(gr.themes.Origin()) as demo: |
|
with gr.Row(): |
|
with gr.Column(): |
|
with gr.Group(): |
|
title = gr.Radio(["Cô", "Thầy"], label="Title", value="Cô") |
|
with gr.Group(): |
|
style = gr.Radio(["Short, concise", "Close, friendly"], label="Writing tone", value="Short, concise") |
|
with gr.Group(): |
|
content = gr.Radio(content_choices, label="Content (incl. Structure)", value=content_choices[1]) |
|
with gr.Group(): |
|
voice = gr.Radio(voice_choices, label="Voice", value=voice_choices[1]) |
|
with gr.Group(): |
|
pronunciation = gr.Radio(pronunciation_choices, label="Pronunciation (Only for HBC)") |
|
with gr.Column(): |
|
with gr.Group(): |
|
bodyLanguage = gr.Radio(body_language_choices, label="Body Language", value=body_language_choices[1]) |
|
with gr.Group(): |
|
facialEyeContact = gr.Radio(facial_eye_contact_choices, label="Facial Expression + Eye Contact", value=facial_eye_contact_choices[1]) |
|
with gr.Group(): |
|
fluency = gr.Radio(fluency_choices, label="Fluency", value=fluency_choices[1]) |
|
with gr.Group(): |
|
slideDesign = gr.Radio(slide_design_choices, label="Slide Design (Only for HBS)") |
|
with gr.Row(): |
|
gen_btn = gr.Button("Generate comment") |
|
output = gr.Textbox(label="Teacher’s Comment", lines=5) |
|
gen_btn.click( |
|
generate_comment, |
|
[title, style, content, bodyLanguage, facialEyeContact, voice, pronunciation, fluency, slideDesign], |
|
output, |
|
) |
|
|
|
demo.launch(server_name="0.0.0.0") |
|
|