prasad6145's picture
Create app.py
e725596 verified
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("<h1>Word Bridge</h1>")
# 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()