import tempfile from gtts import gTTS from deep_translator import GoogleTranslator import gradio as gr def translate_and_speak(text: str, target: str, log: list): if not text.strip(): # return empty outputs and keep log untouched return "", None, log, log # 1️⃣ translate dest = "es" if target == "Spanish" else "en" translated = GoogleTranslator(source='auto', target=dest).translate(text) # 2️⃣ speak tts = gTTS(translated, lang=dest) tmp = tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) tts.write_to_fp(tmp) tmp.flush() # 3️⃣ update log log_entry = [text, target, translated] new_log = log + [log_entry] # outputs: translated text, audio filepath, session table rows, updated state return translated, tmp.name, new_log, new_log with gr.Blocks(title="🌐💬 Translate & Speak + Session Log") as demo: gr.Markdown( "# 🗣️ Translate & Speak + Session Log\n" "Type text, choose language, click **Go**, and watch your session history." ) with gr.Row(): text_in = gr.Textbox(lines=3, placeholder="Enter text here…") lang_sel = gr.Radio(["Spanish", "English"], value="Spanish", label="Translate to") go_btn = gr.Button("Go 🔄", variant="primary") translated_out = gr.Textbox(label="Translated text", interactive=False) audio_out = gr.Audio(label="Speech output", type="filepath") session_log = gr.Dataframe( headers=["Input Text", "Target Language", "Translated Text"], datatype=["str", "str", "str"], wrap=True, interactive=False, label="Session Log" ) log_state = gr.State([]) # holds list of [input, lang, translation] go_btn.click( translate_and_speak, inputs=[text_in, lang_sel, log_state], outputs=[translated_out, audio_out, session_log, log_state] ) if __name__ == "__main__": demo.launch(server_name="0.0.0.0")