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()