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