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") 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 tutor_feedback(audio_file, language, nickname): if not audio_file: return "", "No audio received.", None, "", [] wav_path = convert_to_wav(audio_file) transcript = transcribe_audio(wav_path) feedback_text = generate_feedback(transcript, language) 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) 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], outputs=[transcript_box, feedback_box, audio_output, hidden_transcript, history_table] ) 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