File size: 4,345 Bytes
737c030 e656608 da34b5e 891f160 ec946c9 aa9d2fe ff5aa1c 8040f65 891f160 ff5aa1c e656608 ff5aa1c 8040f65 ff5aa1c e8fb859 ff5aa1c e8fb859 ff5aa1c e8fb859 ff5aa1c e8fb859 ff5aa1c e8fb859 ff5aa1c 1549aa1 14a91a0 e8fb859 460acea 14a91a0 460acea 1549aa1 e8fb859 1549aa1 14a91a0 1549aa1 14a91a0 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 |
import streamlit as st
import importlib
from io import BytesIO
st.set_page_config(page_title="Multilingual Translator", page_icon="🌐", layout="centered")
# Import LANGUAGES from translation.py
try:
from translation import LANGUAGES
except ImportError as e:
st.error(f"Failed to import translation module: {e}")
st.stop()
def main():
try:
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)
# Language and Input/Output Layout
col1, col2 = st.columns(2)
with col1:
detected_options = lang_detect.detect_language(st.session_state.get("input_text", "")) if st.session_state.get("input_text", "").strip() and len(st.session_state.get("input_text", "").strip()) >= 10 else [("Hindi", 1.0, "हिन्दी")]
source_lang = detected_options[0][0] if detected_options else "Hindi"
source_lang_code = next((k for k, v in LANGUAGES.items() if v[1] == source_lang), "hi")
st.selectbox("Source", options=[LANGUAGES[source_lang_code][0]] + [v[0] for v in LANGUAGES.values()], index=0, key="source_lang")
input_type = st.radio("Input", ["Text", "File"], horizontal=True, key="input_type", label_visibility="hidden")
if input_type == "Text":
input_text = st.text_area("Input", height=200, key="input_text", on_change=trigger_translation, args=(translation, lang_detect, audio_processor,), label_visibility="hidden")
else:
input_text = st.file_uploader("Input", type=["txt", "docx", "pdf"], key="file_input", on_change=trigger_translation, args=(translation, lang_detect, audio_processor,), label_visibility="hidden")
if input_text:
st.session_state.input_text = input_text.read().decode("utf-8").strip()
st.button("Translate", key="translate_btn", on_click=trigger_translation, args=(translation, lang_detect, audio_processor,))
with col2:
st.selectbox("Target", options=[v[0] for v in LANGUAGES.values()], index=list(LANGUAGES.values()).index(LANGUAGES["en"]), key="target_lang")
if "translated_text" in st.session_state:
st.text_area("Output", value=st.session_state.translated_text, height=200, key="output_text", disabled=True, label_visibility="hidden")
if st.button("🔊", key="audio_btn", on_click=play_audio, args=(audio_processor,), help="Play audio"):
pass # Handled by play_audio
except Exception as e:
st.error(f"App error: {e}")
st.stop()
def trigger_translation(translation, lang_detect, audio_processor):
text = st.session_state.input_text.strip()
if text:
source_lang = next((k for k, v in LANGUAGES.items() if v[0] == st.session_state.source_lang), "hi")
target_lang = next((k for k, v in LANGUAGES.items() if v[0] == st.session_state.target_lang), "en")
if source_lang != "en" and target_lang != "en":
temp = translation.translate(text, source_lang, "en")
if temp and len(temp.split()) >= 2:
st.session_state.translated_text = translation.translate(temp, "en", target_lang)
else:
st.session_state.translated_text = text
else:
st.session_state.translated_text = translation.translate(text, source_lang, target_lang) or text
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), "en")
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")
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")
if __name__ == "__main__":
main() |