File size: 6,290 Bytes
737c030 e656608 da34b5e 1c122b7 891f160 e12cdaf 8040f65 891f160 e656608 e12cdaf 1549aa1 115098a 8040f65 e12cdaf 1549aa1 e12cdaf 1549aa1 e12cdaf 1549aa1 e12cdaf 1549aa1 e12cdaf 1549aa1 da34b5e e12cdaf 1549aa1 e12cdaf 737c030 1549aa1 da34b5e 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 97 98 99 100 101 102 103 104 105 106 107 |
import streamlit as st
import importlib
from io import BytesIO
import time
st.set_page_config(page_title="Multilingual Translator", page_icon="🌐", layout="wide")
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"
native_lang_map = {
"en": ("English", "English"), "fr": ("Français", "French"), "es": ("Español", "Spanish"),
"de": ("Deutsch", "German"), "hi": ("हिन्दी", "Hindi"), "zh": ("中文", "Chinese"),
"ar": ("العربية", "Arabic"), "ru": ("Русский", "Russian"), "ja": ("日本語", "Japanese")
}
source_lang_code = next((k for k, v in LANGUAGES.items() if v[1] == source_lang), "en")
source_lang_display = st.selectbox("Source Language", [native_lang_map[source_lang_code][0]] + [v[0] for v in native_lang_map.values()], index=0, key="source_lang", help="Auto-detected, override if needed")
source_lang = next((k for k, v in native_lang_map.items() if v[0] == source_lang_display), "en")
with col2:
target_lang_display = st.selectbox("Target Language", [v[0] for v in native_lang_map.values()], index=list(native_lang_map.values()).index(native_lang_map["hi"]), key="target_lang")
target_lang = next((k for k, v in native_lang_map.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", ["Text", "File Upload"], horizontal=True, label_visibility="collapsed")
if input_type == "Text":
user_text = st.text_area("", height=200, key="user_text", on_change=trigger_translation, args=(translation, lang_detect, audio_processor,))
else:
user_text = st.file_uploader("Drag and drop or upload file", type=["txt", "docx", "pdf"], key="doc_input", on_change=trigger_translation, args=(translation, lang_detect, audio_processor,))
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,))
# 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("", value=st.session_state.translated_text, height=200, key="output_area", disabled=True)
col_c, col_a = st.columns([1, 1])
with col_c:
st.button("📋", key="copy_btn", on_click=copy_to_clipboard, help="Copy translation")
with col_a:
if st.button("🔊", key="audio_btn", on_click=play_audio, args=(audio_processor,)):
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()
st.session_state.translation_time = time.time() - start_time
def copy_to_clipboard():
st.clipboard(st.session_state.translated_text)
st.success("Copied to clipboard!")
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() |