File size: 3,242 Bytes
6cb4362 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
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("""
<div id="header" style="text-align: center;">
<img src="file/images/chatter_owl.png" width="120">
<h2>π¦ Meet <strong>Chatter the Owl</strong></h2>
<p>Enter your name, choose a language, and speak! Iβll help you grow as a communicator.</p>
</div>
""")
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
|