import streamlit as st from deep_translator import GoogleTranslator import os from streamlit_option_menu import option_menu import css from voice import transcribe,text_to_speech from tone import tone import about os.environ["STREAMLIT_WATCHER_TYPE"] = "none" st.session_state.translate=False st.set_page_config(page_title="VoiceBridge",layout="wide",page_icon="fevicon.png") Languages = {'hindi':'hi','afrikaans':'af','albanian':'sq','amharic':'am','arabic':'ar','armenian':'hy','azerbaijani':'az', 'basque':'eu','belarusian':'be','bengali':'bn','bosnian':'bs','bulgarian':'bg','catalan':'ca', 'cebuano':'ceb','chichewa':'ny','chinese (simplified)':'zh-cn','chinese (traditional)':'zh-tw', 'corsican':'co','croatian':'hr','czech':'cs','danish':'da','dutch':'nl','english':'en','esperanto':'eo', 'estonian':'et','filipino':'tl','finnish':'fi','french':'fr','frisian':'fy','galician':'gl','georgian':'ka', 'german':'de','greek':'el','gujarati':'gu','haitian creole':'ht','hausa':'ha','hawaiian':'haw','hebrew':'iw', 'hebrew':'he','hmong':'hmn','hungarian':'hu','icelandic':'is','igbo':'ig','indonesian':'id', 'irish':'ga','italian':'it','japanese':'ja','javanese':'jw','kannada':'kn','kazakh':'kk','khmer':'km', 'korean':'ko','kurdish (kurmanji)':'ku','kyrgyz':'ky','lao':'lo','latin':'la','latvian':'lv','lithuanian':'lt', 'luxembourgish':'lb','macedonian':'mk','malagasy':'mg','malay':'ms','malayalam':'ml','maltese':'mt','maori':'mi', 'marathi':'mr','mongolian':'mn','myanmar (burmese)':'my','nepali':'ne','norwegian':'no','odia':'or','pashto':'ps', 'persian':'fa','polish':'pl','portuguese':'pt','punjabi':'pa','romanian':'ro','russian':'ru','samoan':'sm', 'scots gaelic':'gd','serbian':'sr','sesotho':'st','shona':'sn','sindhi':'sd','sinhala':'si','slovak':'sk', 'slovenian':'sl','somali':'so','spanish':'es','sundanese':'su','swahili':'sw','swedish':'sv','tajik':'tg', 'tamil':'ta','telugu':'te','thai':'th','turkish':'tr','turkmen':'tk','ukrainian':'uk','urdu':'ur','uyghur':'ug', 'uzbek':'uz','vietnamese':'vi','welsh':'cy','xhosa':'xh','yiddish':'yi','yoruba':'yo','zulu':'zu'} st.markdown( """ """, unsafe_allow_html=True ) col1, col2 = st.columns([1, 6]) with col1: st.markdown(""" """, unsafe_allow_html=True) st.logo("logo.png") with col2: css.nev() st.markdown('
', unsafe_allow_html=True) selected = option_menu( menu_title=None, options=["Translate", "Tone", "About"], icons=["bi-people-fill", "bi-soundwave", "gear"], menu_icon="cast", default_index=0, orientation="horizontal", styles={ "container": {"padding": "0!important", "background-color": "#0E1117"}, "icon": {"color": "white"}, "nav-link": { "text-align": "center", "margin": "0px", "--hover-color": "#204044", }, "nav-link-selected": {"background-color": "#1f6f78"}, } ) st.markdown('
', unsafe_allow_html=True) with st.container(): st.markdown(""" """, unsafe_allow_html=True) st.markdown('
', unsafe_allow_html=True) left_col, st.session_state.mid_col, st.session_state.right_col = st.columns([3, 2, 3]) # left user input # ------------------------------------------------------------------------------------------------------------------------------------------------ if (selected == "Translate" or selected == "Tone"): with left_col: with st.popover("", icon=":material/tune:"): inp = st.selectbox('Choose Input Format', ("Text", "Audio_file", "MIC")) st.session_state.inp = inp with st.form("my_form"): st.markdown("### 🎙️ Input") if st.session_state.inp == "Text": st.session_state.text = st.text_area("Enter Text:", help="Type your text here...") elif st.session_state.inp == "MIC": st.session_state.uploaded_file = st.audio_input("Record a Voice Message") else: st.session_state.uploaded_file = st.file_uploader("Upload an Audio File", type=["mp3", "wav", "m4a"]) submitted = st.form_submit_button("Submit") # ------------------------------------------------------------------------------------------------------------------------------------------------ if selected == "Translate": # ------------------------------------------------------------------------------------------------------------------------------------------------ # center button st.markdown('
', unsafe_allow_html=True) with st.session_state.mid_col: css.cicle_button() if st.button("Translate"): st.session_state.translate=False st.session_state.translate=True st.markdown('
', unsafe_allow_html=True) # ------------------------------------------------------------------------------------------------------------------------------------------------ # Right Output with st.session_state.right_col: with st.popover("", icon=":material/tune:"): out_type = st.selectbox('Choose Input Format', ("Text", "Voice", "Both")) st.session_state.out_type = out_type with st.form("output"): st.markdown("### 🔉 Voice Output") option2 = st.selectbox('Select Output Language', list(Languages.keys())) value2 = Languages[option2] if st.session_state.translate: c1,c2=st.columns(2) if st.session_state.inp != "Text": st.session_state.text = transcribe(st.session_state.uploaded_file) translated_text = GoogleTranslator(target=value2).translate(st.session_state.text) if st.session_state.out_type == "Text": st.text_area("Translated Text:", translated_text, height=100) elif st.session_state.out_type == "Voice": if translated_text.strip(): audio_file = text_to_speech(translated_text, value2) else: c2.warning("Please enter text before converting.") st.audio(audio_file, format='audio/mp3', autoplay=True) else: if translated_text.strip(): audio_file = text_to_speech(translated_text, value2) else: c2.warning("Please enter text before converting.") with c1.popover("", icon=":material/library_books:"): st.text_area("Translated Text:", translated_text, height=100) c2.audio(audio_file, format='audio/mp3', autoplay=True) reset = st.form_submit_button("Reset ↻ ") if reset: st.session_state.translate= False # Optional: Add some styling st.markdown(""" """, unsafe_allow_html=True) st.markdown('
', unsafe_allow_html=True) if selected == "Tone": tone() if selected == "About": about.about_page()