|
import os |
|
import random |
|
import gradio as gr |
|
from gtts import gTTS |
|
import tempfile |
|
|
|
|
|
IMAGE_FOLDER = "IMAGES/" |
|
|
|
|
|
letter_words = { |
|
"A": "Apple", "B": "Bat", "C": "Cat", "D": "Duck", "E": "Eyes", "F": "Fish" |
|
} |
|
|
|
|
|
alphabet_data = {f.split(".")[0].upper(): os.path.join(IMAGE_FOLDER, f) |
|
for f in os.listdir(IMAGE_FOLDER) if f.endswith(('.png', '.jpg', '.jpeg'))} |
|
|
|
|
|
def get_random_image(): |
|
letter = random.choice(list(alphabet_data.keys())) |
|
image_path = alphabet_data[letter] |
|
word = letter_words.get(letter, "Unknown") |
|
|
|
|
|
sentence = f"{letter} for {word}" |
|
tts = gTTS(sentence, lang="en") |
|
|
|
|
|
temp_audio = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") |
|
tts.save(temp_audio.name) |
|
|
|
return image_path, sentence, temp_audio.name |
|
|
|
|
|
with gr.Blocks(css=""" |
|
body { |
|
background-color: #f8f9fa; |
|
} |
|
.title { |
|
text-align: center; |
|
font-size: 2.5rem; |
|
font-weight: bold; |
|
color: #333; |
|
padding-bottom: 10px; |
|
} |
|
.sub-title { |
|
text-align: center; |
|
font-size: 1.2rem; |
|
color: #666; |
|
margin-bottom: 20px; |
|
} |
|
.container { |
|
max-width: 500px; |
|
margin: auto; |
|
text-align: center; |
|
} |
|
.gradio-image img { |
|
border-radius: 20px; |
|
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2); |
|
} |
|
.gradio-button { |
|
font-size: 1.2rem; |
|
padding: 10px; |
|
border-radius: 15px; |
|
background: linear-gradient(135deg, #ff7eb3, #ff758c); |
|
color: white; |
|
border: none; |
|
cursor: pointer; |
|
transition: transform 0.2s ease; |
|
} |
|
.gradio-button:hover { |
|
transform: scale(1.05); |
|
} |
|
""") as demo: |
|
gr.Markdown("<div class='title'>π€ Alphabet Learning Game with Audio</div>") |
|
|
|
|
|
with gr.Row(): |
|
img_display = gr.Image(label="Letter Image", elem_classes="gradio-image") |
|
|
|
text_display = gr.Textbox(label="What you hear", interactive=False) |
|
audio_output = gr.Audio() |
|
|
|
next_btn = gr.Button("π΅ Next Letter", elem_classes="gradio-button") |
|
|
|
next_btn.click(get_random_image, inputs=[], outputs=[img_display, text_display, audio_output]) |
|
|
|
demo.launch() |
|
|