import gradio as gr import uuid from gtts import gTTS from datetime import datetime from sqlmodel import Session from app_utils import ( model, LANG_CODES, client, save_to_db, fetch_user_sessions, convert_to_wav, transcribe_audio, generate_feedback, generate_example_response ) def spoken_dashboard(): with gr.Column() as spoken_panel: gr.Markdown(""" """) nickname_box = gr.Textbox(label="πŸ‘€ Your Nickname", placeholder="Enter your name...") language_dropdown = gr.Dropdown(label="🌍 Select Your Language", choices=list(LANG_CODES.keys()), value="English") goal_dropdown = gr.Dropdown( label="🎯 Communication Goal", choices=[ "Interview preparation", "Public speaking", "Class presentation", "General improvement" ], value="General improvement" ) focus_checkboxes = gr.CheckboxGroup( label="🧠 Areas to Focus On", choices=["Clarity", "Structure", "Fluency", "Tone", "Content Relevance"], value=["Clarity", "Structure", "Fluency", "Tone", "Content Relevance"] ) with gr.Row(): audio_input = gr.Audio(type="filepath", label="πŸŽ™ Speak or Upload Audio") transcript_box = gr.Textbox(label="πŸ“– What You Said", interactive=False) feedback_box = gr.Textbox(label="πŸ’‘ Chatter’s Feedback", interactive=False) audio_output = gr.Audio(label="πŸ”Š Chatter Speaks", type="filepath") hidden_transcript = gr.Textbox(visible=False) with gr.Row(): try_again = gr.Button("πŸ” Try Again") show_example = gr.Button("🎯 Show Me an Example") example_box = gr.Textbox(label="πŸ—£ Suggested Improvement", visible=True, placeholder="Click to generate improved speech...") history_table = gr.Dataframe(headers=["πŸ•’ Timestamp", "🌐 Language", "πŸ“ Transcript (Preview)", "πŸ“‹ Feedback (Preview)"]) def fetch_last_transcript(nickname): if not nickname: return None sessions = fetch_user_sessions(nickname) return sessions[-1].transcript if sessions else None def tutor_feedback(audio_file, language, nickname, goal, focus_areas): if not audio_file: return "", "No audio received.", None, "", [] wav_path = convert_to_wav(audio_file) transcript = transcribe_audio(wav_path) previous = fetch_last_transcript(nickname) feedback_text = generate_feedback( transcript=transcript, language=language, goal=goal, focus_areas=focus_areas, previous_transcript=previous ) lang_code = LANG_CODES.get(language, "en") tts = gTTS(feedback_text, lang=lang_code) mp3_path = f"/tmp/{uuid.uuid4()}.mp3" tts.save(mp3_path) if nickname: save_to_db(nickname, transcript, feedback_text, language) sessions = fetch_user_sessions(nickname) session_table = [[s.timestamp, s.language, s.transcript[:40], s.feedback[:40]] for s in sessions] return transcript, feedback_text, mp3_path, transcript, session_table audio_input.change( fn=tutor_feedback, inputs=[audio_input, language_dropdown, nickname_box, goal_dropdown, focus_checkboxes], outputs=[transcript_box, feedback_box, audio_output, hidden_transcript, history_table], show_progress="minimal" ) try_again.click(fn=lambda: ("", "", None, "", "", []), inputs=None, outputs=[transcript_box, feedback_box, audio_output, hidden_transcript, example_box, history_table]) show_example.click(fn=generate_example_response, inputs=[hidden_transcript, language_dropdown], outputs=example_box) return spoken_panel