import os import tempfile import gradio as gr from gtts import gTTS from pydub import AudioSegment VOCAB_FOLDER = "vocab_files" def get_date_choices(): files = [f for f in os.listdir(VOCAB_FOLDER) if f.endswith(".txt")] dates = [os.path.splitext(f)[0] for f in files] return sorted(dates) def load_vocab(selected_date): if not selected_date or selected_date == "datum": return [ [], # State ostaje prazan gr.update(choices=[], value=None), gr.update(value="Odaberite datum da biste vidjeli riječi za taj dan.") ] path = os.path.join(VOCAB_FOLDER, f"{selected_date}.txt") with open(path, "r", encoding="utf-8") as f: words = [line.strip() for line in f if line.strip()] markdown_content = "\n".join([f"- {w}" for w in words]) return [ words, gr.update(choices=words, value=words[0] if words else None), gr.update(value=markdown_content) ] def word_to_audio(word): tts = gTTS(text=word, lang="hr") tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") tts.save(tmp.name) return tmp.name def words_to_audio(words): combined = AudioSegment.empty() for w in words: tts = gTTS(text=w, lang="hr") tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") tts.save(tmp.name) segment = AudioSegment.from_file(tmp.name, format="mp3") combined += segment out_tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") combined.export(out_tmp.name, format="mp3") return out_tmp.name with gr.Blocks() as demo: title = gr.HTML("

Vokabular Audio Tool

") date_dropdown = gr.Dropdown(choices=["datum"] + get_date_choices(), label="Odaberite datum") words_state = gr.State(value=[]) word_dropdown = gr.Dropdown(choices=[], label="Odaberite riječ") listen_btn = gr.Button("Slušaj") play_all_btn = gr.Button("Slušaj sve riječi") audio_out = gr.Audio(label="Preuzmi audio", type="filepath") words_md = gr.Markdown(value="Odaberite datum da biste vidjeli riječi za taj dan.") date_dropdown.change( fn=load_vocab, inputs=date_dropdown, outputs=[words_state, word_dropdown, words_md] ) listen_btn.click( fn=word_to_audio, inputs=word_dropdown, outputs=audio_out ) play_all_btn.click( fn=words_to_audio, inputs=words_state, outputs=audio_out ) demo.launch()