File size: 5,007 Bytes
891f160
e656608
da34b5e
1c122b7
891f160
d60f4d4
8040f65
891f160
e656608
 
 
 
8040f65
da34b5e
8040f65
da34b5e
 
d60f4d4
 
 
 
da34b5e
8040f65
 
1c122b7
da34b5e
 
 
 
 
 
 
 
d60f4d4
 
da34b5e
d60f4d4
 
 
 
 
da34b5e
 
1c122b7
 
 
 
 
 
 
 
 
da34b5e
d60f4d4
 
1c122b7
 
d60f4d4
 
 
 
 
 
da34b5e
1c122b7
 
 
 
 
 
 
da34b5e
 
 
d60f4d4
da34b5e
 
 
 
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
import streamlit as st
import importlib
from io import BytesIO
import time

st.set_page_config(page_title="Multilingual Translator", page_icon="🌐", layout="centered")

def main():
    translation = importlib.import_module("translation")
    lang_detect = importlib.import_module("lang_detect")
    audio_processor = importlib.import_module("audio_processor")

    st.markdown("<h1 style='text-align: center; color: #2E86C1;'>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)

    col1, col2 = st.columns([1, 1])
    with col1:
        input_type = st.radio("Input", ["Text", "File Upload"], horizontal=True, key="input_type")
        user_text = st.text_area("Enter or paste text", height=150, key="text_input").strip() if input_type == "Text" else ""
        if input_type == "File Upload":
            doc_file = st.file_uploader("Upload TXT File", type=["txt"], key="doc_input", accept_multiple_files=False)
            user_text = doc_file.read().decode("utf-8").strip() if doc_file else ""

        if user_text:
            start_time = time.time()
            detected_options = lang_detect.detect_language(user_text) if len(user_text) >= 10 else [("English", 1.0, "English")]
            source_lang = detected_options[0][0] if detected_options else "English"

            native_lang_map = {
                "English": "English", "French": "Français", "Spanish": "Español",
                "German": "Deutsch", "Hindi": "हिन्दी", "Chinese": "中文",
                "Arabic": "العربية", "Russian": "Русский", "Japanese": "日本語"
            }
            source_options = ["Detect"] + [native_lang_map.get(lang, lang) for lang, _, _ in detected_options] + list(native_lang_map.values())
            target_options = list(native_lang_map.values())

            source_lang_display = st.selectbox("From", source_options, index=0, key="source_lang").replace("Detect", native_lang_map.get(source_lang, source_lang))
            source_lang = next((k for k, v in native_lang_map.items() if v == source_lang_display), source_lang)

            target_lang_display = st.selectbox("To", target_options, index=target_options.index("हिन्दी") if "हिन्दी" in target_options else 0, key="target_lang")
            target_lang = next((k for k, v in native_lang_map.items() if v == target_lang_display), "Hindi")

            if st.button("Translate", key="translate_btn"):
                with st.spinner("Translating..."):
                    try:
                        translated_text = translation.translate(user_text, source_lang, target_lang)
                        st.session_state.translated_text = translated_text
                        st.session_state.translation_time = time.time() - start_time
                    except Exception as e:
                        st.error(f"Translation failed: {str(e)}. Using input as fallback.")
                        st.session_state.translated_text = user_text
                        st.session_state.translation_time = time.time() - start_time

    with col2:
        if "translated_text" in st.session_state and st.session_state.translated_text:
            st.text_area("Translation:", value=st.session_state.translated_text, height=len(st.session_state.translated_text.splitlines()) * 20 + 50, key="output_area")
            st.write(f"Translation time: {st.session_state.translation_time:.2f} seconds")
            output_option = st.radio("Output", ["Text", "Audio"], horizontal=True, key="output_option")
            if output_option == "Audio":
                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")
                    st.success("Audio playing.")
                else:
                    st.error("Audio generation failed. Retrying with English...")
                    audio_fallback = audio_processor.text_to_speech(st.session_state.translated_text, "English")
                    if audio_fallback and audio_fallback.getbuffer().nbytes > 0:
                        st.audio(audio_fallback, format="audio/mp3")
                        st.success("Fallback audio in English playing.")
                    else:
                        st.error("Audio generation failed. Try again later or use English/French.")

    st.markdown("""
        <p style='font-size: small; color: grey; text-align: center; margin-top: 20px;'>
            Developed by: Krishna Prakash <a href='https://www.linkedin.com/in/krishnaprakash-profile/' target='_blank'>
                <img src='https://img.icons8.com/ios-filled/30/0077b5/linkedin.png' alt='LinkedIn' style='vertical-align: middle; margin: 0 5px;'/>
            </a>
        </p>
    """, unsafe_allow_html=True)

if __name__ == "__main__":
    main()