File size: 4,927 Bytes
5e64bf4
 
 
800a0b9
5e64bf4
4a49001
5e64bf4
 
a50b135
5e64bf4
800a0b9
 
 
 
 
 
 
 
 
 
e97f221
 
 
 
 
800a0b9
 
e97f221
 
048dc25
 
60c8df4
e97f221
 
800a0b9
 
 
a50b135
 
800a0b9
 
 
a50b135
800a0b9
a50b135
800a0b9
 
a50b135
5e64bf4
a50b135
 
5e64bf4
a50b135
 
5e64bf4
a50b135
 
 
800a0b9
a50b135
 
 
800a0b9
a50b135
 
800a0b9
a50b135
 
5e64bf4
a50b135
 
 
 
 
 
 
 
 
 
5e64bf4
8d470a5
7a09345
 
61c0d04
8d470a5
 
 
 
628f4e2
7a09345
8d470a5
 
 
 
 
 
ffde5bb
 
 
628f4e2
a50b135
 
 
 
5e64bf4
628f4e2
 
a50b135
5e64bf4
a77a456
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import gradio as gr
import whisper
from openai import OpenAI
from langdetect import detect
import os
import time

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
whisper_model = whisper.load_model("tiny")

LANGUAGES = ["Turkish", "Arabic", "Kurdish", "Japanese", "English"]
LANG_CODES = {
    "Turkish": "tr",
    "Arabic": "ar",
    "Kurdish": "ku",
    "Japanese": "ja",
    "English": "en"
}

SUMMARY_PROMPTS = {
    "Turkish": "Lütfen aşağıdaki metni açık ve öz bir şekilde özetle:\n\n{text}",
    "Arabic": "يرجى تلخيص النص التالي بطريقة واضحة وموجزة:\n\n{text}",
    "Kurdish": "Ji kerema xwe nivîsa jêr bi awayekê zelal û kurt re kurt bike:\n\n{text}",
    "Japanese": "以下の文章を簡潔に要約してください:\n\n{text}",
    "English": "Please summarize the following text clearly and briefly:\n\n{text}"
}
QUIZ_PROMPTS = {
    "Turkish": "Aşağıdaki özetten yola çıkarak 2 adet çoktan seçmeli soru üret (her biri 4 şıklı):\n\n{text}",
    "Arabic": "استنادًا إلى الملخص التالي، أنشئ سؤالين من نوع الاختيار من متعدد (لكل منهما 4 خيارات):\n\n{text}",
    "Kurdish": """Ji bo vê kurtkirinê, 2 pirsyarên bijartinê (her yek bi 4 vebijêrk) binivîse. Her pirsyar divê bi awayekê zelal were nivîsîn û vebijêrkên wê bi (a), (b), (c), (d) were nîşandan. Vebijêrkên rast û çewt li hev biguherînin.
Ev kurtkirinê:
{text}""",
    "Japanese": "以下の要約に基づいて、4つの選択肢を持つ選択式の質問を2つ作成してください:\n\n{text}",
    "English": "Based on the following summary, generate 2 multiple choice questions (each with 4 options):\n\n{text}"
}

def translate_text(text, target_lang):
    prompt = f"""Translate the following text into {target_lang}:\n\n{text}"""
    start = time.time()
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=1000
    )
    print(f"⏱️ Translate time: {time.time() - start:.2f}s")
    return response.choices[0].message.content.strip()

def transcribe_audio(audio):
    if audio is None:
        return "No audio uploaded", ""
    start = time.time()
    result = whisper_model.transcribe(audio)
    print(f"⏱️ Transcription time: {time.time() - start:.2f}s")
    return result["text"], result["text"]

def summarize_text(text, summary_lang):
    start = time.time()
    detected = detect(text)
    target_code = LANG_CODES[summary_lang]
    translated = translate_text(text, summary_lang) if detected != target_code else text
    prompt = SUMMARY_PROMPTS[summary_lang].format(text=translated)
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=500
    )
    print(f"⏱️ Summarization time: {time.time() - start:.2f}s")
    return response.choices[0].message.content.strip()

def generate_quiz(summary, lang):
    start = time.time()
    prompt = QUIZ_PROMPTS[lang].format(text=summary)
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=500
    )
    print(f"⏱️ Quiz generation time: {time.time() - start:.2f}s")
    return response.choices[0].message.content.strip()

custom_css = """
.audio-col {width: 320px !important;}
.lang-col {width: 200px !important; margin-left: 16px;}
.trans-box, .sum-box, .quiz-box {min-height: 60px; max-height: 210px; font-size: 1rem;}
#output_row .gr-box {margin-bottom: 10px;}
"""

with gr.Blocks(css=custom_css) as demo:
    gr.Markdown("# 🧠 Multilingual Audio Summarizer + Quiz Generator")

    with gr.Row():
        with gr.Column(elem_classes="audio-col"):
            audio_input = gr.Audio(type="filepath", label="🎙️ Upload audio")
        with gr.Column(elem_classes="lang-col"):
            summary_lang = gr.Dropdown(choices=LANGUAGES, value="Turkish", label="🌐 Output Language")
    with gr.Row(elem_id="output_row"):
        transcribed_text = gr.Textbox(label="📄 Transcription", lines=7, elem_classes="trans-box")
        summary_output = gr.Textbox(label="✂️ Summary", lines=7, elem_classes="sum-box")
        quiz_output = gr.Textbox(label="📘 Quiz", lines=7, elem_classes="quiz-box")

    with gr.Row():
        transcribe_btn = gr.Button("🎧 Transcribe")
        summarize_btn = gr.Button("✂️ Summarize")
        quiz_btn = gr.Button("📘 Generate Quiz")

    transcribe_btn.click(fn=transcribe_audio, inputs=[audio_input], outputs=[transcribed_text, transcribed_text])
    summarize_btn.click(fn=summarize_text, inputs=[transcribed_text, summary_lang], outputs=summary_output)
    quiz_btn.click(fn=generate_quiz, inputs=[summary_output, summary_lang], outputs=quiz_output)

demo.launch()