File size: 5,794 Bytes
737c030 e656608 da34b5e 1c122b7 891f160 36fd6ed aa9d2fe 8040f65 891f160 e656608 e12cdaf 1549aa1 115098a 8040f65 e12cdaf 1549aa1 e12cdaf 1549aa1 6d9b506 1549aa1 6d9b506 aa9d2fe e12cdaf 1549aa1 e12cdaf 6d9b506 1549aa1 6d9b506 1549aa1 6d9b506 1549aa1 6d9b506 da34b5e e12cdaf 1549aa1 e12cdaf 737c030 6d9b506 1549aa1 8040f65 891f160 |
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 |
import streamlit as st
import importlib
from io import BytesIO
import time
st.set_page_config(page_title="Multilingual Translator", layout="centered")
# Import LANGUAGES from translation.py
from translation import LANGUAGES
def main():
translation = importlib.import_module("translation")
lang_detect = importlib.import_module("lang_detect")
audio_processor = importlib.import_module("audio_processor")
# Header
st.markdown("<h1 style='text-align: center; color: #4285F4;'>Multilingual Translator</h1>", unsafe_allow_html=True)
st.markdown("<p style='text-align: center; color: #666;'>Translate text like Google Translate</p>", unsafe_allow_html=True)
# Language Controls
col1, col2 = st.columns([1, 1])
with col1:
detected_options = lang_detect.detect_language(st.session_state.get("user_text", "")) if st.session_state.get("user_text", "").strip() and len(st.session_state.get("user_text", "").strip()) >= 10 else [("English", 1.0, "English")]
source_lang = detected_options[0][0] if detected_options else "English"
source_lang_code = next((k for k, v in LANGUAGES.items() if v[1] == source_lang), "en")
source_lang_display = st.selectbox("Source Language", options=[LANGUAGES[source_lang_code][0]] + [v[0] for v in LANGUAGES.values()], index=0, key="source_lang", help="Auto-detected, override if needed", label_visibility="hidden")
with col2:
target_lang_display = st.selectbox("Target Language", options=[v[0] for v in LANGUAGES.values()], index=list(LANGUAGES.values()).index(LANGUAGES["hi"]), key="target_lang", label_visibility="hidden")
target_lang = next((k for k, v in LANGUAGES.items() if v[0] == target_lang_display), "hi")
# Input Section
if "user_text" not in st.session_state:
st.session_state.user_text = ""
col_input = st.container()
with col_input:
input_type = st.radio("Input Method", ["Text", "File Upload"], horizontal=True, key="input_type", label_visibility="hidden")
if input_type == "Text":
user_text = st.text_area("Enter or paste text", height=200, key="user_text", on_change=trigger_translation, args=(translation, lang_detect, audio_processor,), label_visibility="hidden")
else:
user_text = st.file_uploader("Upload File", type=["txt", "docx", "pdf"], key="doc_input", on_change=trigger_translation, args=(translation, lang_detect, audio_processor,), label_visibility="hidden")
if user_text:
st.session_state.user_text = user_text.read().decode("utf-8").strip()
st.markdown(f"<small style='color: grey;'>Characters: {len(st.session_state.user_text)}/1000</small>", unsafe_allow_html=True)
st.button("Translate", key="translate_btn", on_click=trigger_translation, args=(translation, lang_detect, audio_processor,), label_visibility="hidden")
# Output Section
col_output = st.container()
with col_output:
if "translated_text" in st.session_state and st.session_state.translated_text:
st.text_area("Translation", value=st.session_state.translated_text, height=200, key="output_area", disabled=True, label_visibility="hidden")
col_a = st.columns([1])[0] # Single column for speaker icon
if st.button("🔊", key="audio_btn", on_click=play_audio, args=(audio_processor,), help="Listen to translation", label_visibility="hidden"):
pass # Handled by play_audio function
def trigger_translation(translation, lang_detect, audio_processor):
user_text = st.session_state.user_text.strip()
if user_text:
spinner = st.empty()
spinner.info("Translating...")
start_time = time.time()
try:
source_lang = next((k for k, v in LANGUAGES.items() if v[0] == st.session_state.source_lang), "en")
target_lang = next((k for k, v in LANGUAGES.items() if v[0] == st.session_state.target_lang), "hi")
if source_lang != "en" and target_lang != "en":
temp_translation = translation.translate(user_text, source_lang, "en")
if not temp_translation or len(temp_translation.split()) < 2:
raise ValueError("Intermediate translation invalid")
translated_text = translation.translate(temp_translation, "en", target_lang)
else:
translated_text = translation.translate(user_text, source_lang, target_lang)
if not translated_text or len(translated_text.split()) < 2:
raise ValueError("Final translation invalid")
st.session_state.translated_text = translated_text
except Exception as e:
st.session_state.translated_text = user_text
st.warning(f"Translation issue: {str(e)}. Using input as fallback.")
finally:
spinner.empty()
def play_audio(audio_processor):
if "translated_text" in st.session_state and st.session_state.translated_text:
target_lang = next((k for k, v in LANGUAGES.items() if v[0] == st.session_state.target_lang), "hi")
audio = audio_processor.text_to_speech(st.session_state.translated_text, target_lang)
if audio and audio.getbuffer().nbytes > 0:
st.audio(audio, format="audio/mp3", start_time=0)
st.success("Audio playing.")
else:
audio_fallback = audio_processor.text_to_speech(st.session_state.translated_text, "en")
if audio_fallback and audio_fallback.getbuffer().nbytes > 0:
st.audio(audio_fallback, format="audio/mp3", start_time=0)
st.success("Fallback audio in English playing.")
else:
st.error("Audio generation failed. Try again later.")
if __name__ == "__main__":
main() |