import streamlit as st import speech_recognition as sr from googletrans import Translator from gtts import gTTS from playsound import playsound from PIL import Image from streamlit_mic_recorder import mic_recorder,speech_to_text from transformers import AutoTokenizer, AutoModelForSeq2SeqLM from transformers import pipeline #from transformers import Wav2Vec2ForCTC, Wav2Vec2Tokenizer # import logging # import logging.handlers # import queue # import threading # import time # import urllib.request # import os # from collections import deque # from pathlib import Path # from typing import List # import av # import numpy as np # import pydub # import streamlit as st # from twilio.rest import Client # from streamlit_webrtc import WebRtcMode, webrtc_streamer #from streamlit_mic_recorder import mic_recorder,speech_to_text # Initialize the recognizer recognizer = sr.Recognizer() # Initialize the translator translator = Translator() # Language dictionary language_dict = { 'bengali': 'bn', 'english': 'en', 'gujarati': 'gu', 'hindi': 'hi', 'malayalam': 'ml', 'marathi': 'mr', 'nepali': 'ne', 'odia': 'or', 'punjabi': 'pa', 'tamil': 'ta', 'telugu': 'te', 'urdu': 'ur', } # language_dict = { # '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', # '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': 'he', # 'hindi': 'hi', # 'hmong': 'hmn', # 'hungarian': 'hu', # 'icelandic': 'is', # 'igbo': 'ig', # 'indonesian': 'id', # 'irish': 'ga', # 'italian': 'it', # 'japanese': 'ja', # 'javanese': 'jv', # 'kannada': 'kn', # 'kazakh': 'kk', # 'khmer': 'km', # 'kinyarwanda': 'rw', # 'korean': 'ko', # 'kurdish': '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', # 'ukrainian': 'uk', # 'urdu': 'ur', # 'uyghur': 'ug', # 'uzbek': 'uz', # 'vietnamese': 'vi', # 'welsh': 'cy', # 'xhosa': 'xh', # 'yiddish': 'yi', # 'yoruba': 'yo', # 'zulu': 'zu', # } #img=Image.open('finallogo.jpg') # col1, col2 = st.columns([1,3]) # #with col1: # #st.image(img, width=220) # with col2: # custom_theme = { # "theme": { # "primaryColor": "#000000", # "backgroundColor": "#89939E", # "secondaryBackgroundColor": "#262730", # "textColor": "#FFFFFF", # "font": "Serif" # } # } # # Apply custom theme to Streamlit # st.markdown( # f""" # # """, # unsafe_allow_html=True # ) # st.header("") # hide_st_style = """ # # """ # st.markdown(hide_st_style, unsafe_allow_html=True) # @st.cache_data # type: ignore # def get_ice_servers(): # """Use Twilio's TURN server because Streamlit Community Cloud has changed # its infrastructure and WebRTC connection cannot be established without TURN server now. # noqa: E501 # We considered Open Relay Project (https://www.metered.ca/tools/openrelay/) too, # but it is not stable and hardly works as some people reported like https://github.com/aiortc/aiortc/issues/832#issuecomment-1482420656 # noqa: E501 # See https://github.com/whitphx/streamlit-webrtc/issues/1213 # """ # # Ref: https://www.twilio.com/docs/stun-turn/api # try: # account_sid = "ACbea2776671d07a28bfa473b522b609fb" # auth_token = "f9d226593c16124f8eaed4b8d2d5397b" # except KeyError: # logger.warning( # "Twilio credentials are not set. Fallback to a free STUN server from Google." # noqa: E501 # ) # return [{"urls": ["stun:stun.l.google.com:19302"]}] # client = Client(account_sid, auth_token) # token = client.tokens.create() # return token.ice_servers # Function to recognize speech # def recognize_speech(prompt, language='en'): # try: # # audio_source = mic_recorder( # # start_prompt="Start recording", # # stop_prompt="Stop recording", # # just_once=False, # # use_container_width=False, # # key='recorder') # with sr.Microphone() as source: # st.write(prompt) # # Use recognizer to adjust to ambient noise # recognizer.adjust_for_ambient_noise(source, duration=1) # audio = recognizer.listen(source) # st.write("Recognizing...") # # Recognize the speech in the specified language # spoken_text = recognizer.recognize_google(audio, language=language) # return spoken_text # except sr.UnknownValueError: # st.write("Sorry, I couldn't understand your speech.") # Function to translate speech def translate_speech(): # Get source language name and convert it to code #source_language_name = recognize_speech("Please speak the source language name (e.g., 'English'): ") # st.write("Record your voice, and play the recorded audio:") # audio=mic_recorder(start_prompt="⏺️",stop_prompt="⏹️",key='recorder') # if audio: # st.audio(audio['bytes']) st.title("BITranSlate") source_language_name = st.selectbox('Please input the source language',language_dict) source_language = language_dict[source_language_name] target_language_name = st.selectbox('Please input the target language',language_dict) target_language = language_dict[target_language_name] #state=st.session_state # if 'text_received' not in state: # state.text_received=[] c1,c2=st.columns(2) with c1: st.write("Convert speech to text:") with c2: text=speech_to_text(language=source_language,use_container_width=True,just_once=True,key='STT') # if text: # state.text_received.append(text) # for text in state.text_received: # st.text(text) # Get sentence to translate sentence = text # while sentence is None: # sentence = recognize_speech("Please speak the sentence to translate:", language=source_language) # Get destination language name and convert it to code # destination_language_name = recognize_speech("Please speak the destination language name (e.g., 'French'): ") # destination_language = language_dict.get(destination_language_name.lower(), 'en') # Translate the text to the desired language #translated_text = translator.translate(sentence, src=source_language, dest=target_language) nllb_langs = {'hindi':'hin_Deva', 'english':'eng_Latn', 'punjabi':'pan_Guru', 'odia':'ory_Orya', 'bengali':'ben_Beng', 'telugu':'tel_Tulu', 'tamil':'tam_Taml', 'nepali':'npi_Deva', 'marathi':'mar_Deva', 'malayalam':'mal_Mlym', 'kannada':'kan_Knda', 'gujarati':'guj_Gujr', 'afrikaans':'hin_Deva' } translator = pipeline('translation', model=AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M"), tokenizer=AutoTokenizer.from_pretrained("facebook/nllb-200-distilled-600M"), src_lang=nllb_langs[source_language_name], tgt_lang=nllb_langs[target_language_name], max_length = 4000) text_to_translate = text translated_text = translator(text_to_translate)[0]['translation_text'] st.write(f"Source Language: {source_language_name}") st.write(f"Sentence: {sentence}") st.write(f"Destination Language: {target_language_name}") st.write(f"Translated Text: {translated_text}") # Using Google-Text-to-Speech to speak the translated text # speak = gTTS(text=translated_text, lang=target_language, slow=False) # speak.save("translated_voice.mp3") # # Play the translated voice # playsound('translated_voice.mp3') #if st.button(" CLICK HERE TO TRANSLATE "): translate_speech()