import gradio as gr import speech_recognition as sr from deep_translator import GoogleTranslator from gtts import gTTS import os from pydub import AudioSegment # Initialize the recognizer recognizer = sr.Recognizer() # Function to perform translation def translate_text(text, src_lang, target_lang): try: translation = GoogleTranslator(source=src_lang, target=target_lang).translate(text) return translation except Exception as e: return str(e) # Function to provide text-to-speech for the translation def text_to_speech(translation, lang): try: tts = gTTS(translation, lang=lang) audio_path = "output.mp3" tts.save(audio_path) return audio_path if os.path.exists(audio_path) else "Audio generation failed" except Exception as e: return str(e) # Function to count words and characters in the source text def count_words_and_chars(text): word_count = len(text.split()) char_count = len(text) return f"Words: {word_count}, Characters: {char_count}" # Function to clear text fields def clear_text_fields(): return "", "", "", "" # Function to save translation to a text file def save_translation(text, translation): with open("saved_translations.txt", "a") as f: f.write(f"Original: {text}\nTranslated: {translation}\n\n") return "Translation saved!" # Function for speech recognition (live voice input to text) def recognize_speech(audio): try: audio_segment = AudioSegment.from_file(audio) audio_segment.export("temp.wav", format="wav") with sr.AudioFile("temp.wav") as source: audio_data = recognizer.record(source) # read the entire audio file text = recognizer.recognize_google(audio_data) return text except sr.UnknownValueError: return "Could not understand audio." except sr.RequestError as e: return f"Could not request results from Google Speech Recognition service; {e}" # List of languages languages = [ ('English', 'en'), ('Spanish', 'es'), ('French', 'fr'), ('German', 'de'), ('Italian', 'it'), ('Portuguese', 'pt'), ('Russian', 'ru'), ('Chinese (Simplified)', 'zh-CN'), ('Chinese (Traditional)', 'zh-TW'), ('Japanese', 'ja'), ('Korean', 'ko'), ('Hindi', 'hi'), ('Telugu', 'te'), ('Tamil', 'ta'), ('Arabic', 'ar') ] # Define Gradio interface with merged components and custom title style css = """ body { background-color: white; /* Set background color to white */ color: black; /* Set text color to black */ margin: 0; padding: 0; height: 100vh; display: flex; justify-content: center; align-items: center; } .gradio-container { background-color: white; /* Container background color */ padding: 20px; display: flex; flex-direction: column; align-items: center; gap: 10px; overflow-y: auto; /* Enable vertical scrolling */ max-height: 100vh; width: 100%; box-sizing: border-box; } .textbox-group, .button-row { display: flex; flex-direction: column; align-items: center; gap: 10px; width: 100%; } #translate-btn { background-color: #4CAF50; /* Green */ color: white; /* White text */ } #tts-btn { background-color: #2196F3; /* Blue */ color: white; /* White text */ } #clear-btn { background-color: #f44336; /* Red */ color: white; /* White text */ } #save-btn { background-color: #FF9800; /* Orange */ color: white; /* White text */ } #upload-audio-btn { background-color: #9C27B0; /* Purple */ color: white; /* White text */ } #translate-btn, #tts-btn, #clear-btn, #save-btn, #upload-audio-btn { width: 100%; /* Stretch buttons to full width */ margin: 5px 0; border: none; /* Remove border */ padding: 10px; /* Add padding */ border-radius: 5px; /* Rounded corners */ cursor: pointer; /* Pointer cursor */ font-size: 16px; /* Font size */ } h1 { text-align: center; /* Center the title */ font-family: 'Algerian', sans-serif; /* Change the font style */ font-weight: bold; /* Make the font bold */ font-size: 32px; /* Increase font size */ color: black; /* Set title color to dark purple */ } #label { color: black; /* Set label text color to black */ font-size: 16px; /* Set label font size */ font-weight: bold; } """ with gr.Blocks(css=css) as demo: gr.Markdown("

Word Bridge

") # Grouping all components in a single column for unified layout with gr.Column(elem_classes="textbox-group"): # Input fields src_text = gr.Textbox(label="Text / Upload Audio", placeholder="Type text or upload audio below...", lines=4, interactive=True, elem_id="src-text-area") src_lang = gr.Dropdown(choices=[(name, code) for name, code in languages], value='en', label="Source Language") target_lang = gr.Dropdown(choices=[(name, code) for name, code in languages], value='fr', label="Target Language") # Outputs translation_output = gr.Textbox(label="Translated Text", interactive=False, lines=4, elem_id="translation-output") audio_output = gr.Audio(label="Listen to Translation") word_char_count = gr.Textbox(label="Word and Character Count", interactive=False, elem_id="word-char-count") status_message = gr.Textbox(label="Status", interactive=False, elem_id="status-message") # Buttons all merged into a single column with gr.Column(elem_classes="button-row"): translate_btn = gr.Button("Translate", elem_id="translate-btn", variant="primary") tts_btn = gr.Button("Listen to Translation", elem_id="tts-btn", variant="secondary") clear_btn = gr.Button("Clear", elem_id="clear-btn", variant="secondary") save_btn = gr.Button("Save Translation", elem_id="save-btn", variant="secondary") upload_audio_btn = gr.Button("Upload Audio", elem_id="upload-audio-btn", variant="secondary") # When the translate button is clicked translate_btn.click(translate_text, [src_text, src_lang, target_lang], translation_output) # Count words and characters after translation src_text.change(count_words_and_chars, src_text, word_char_count) # When the text-to-speech button is clicked tts_btn.click(text_to_speech, [translation_output, target_lang], audio_output) # When the clear button is clicked clear_btn.click(clear_text_fields, [], [src_text, translation_output, word_char_count, status_message]) # When the save button is clicked save_btn.click(save_translation, [src_text, translation_output], status_message) # Upload audio button to start voice recognition upload_audio_btn.click(recognize_speech, inputs=gr.Audio(type='filepath'), outputs=src_text) # Launch the app demo.launch()