|
import gradio as gr |
|
import whisper |
|
from deep_translator import GoogleTranslator |
|
from gtts import gTTS |
|
import tempfile |
|
import os |
|
import warnings |
|
warnings.filterwarnings("ignore") |
|
|
|
model = whisper.load_model("base") |
|
|
|
def translate_audio(text_input, upload_audio, mic_audio, source_lang="tr", target_lang="en"): |
|
audio_file = None |
|
audio_source = "" |
|
|
|
if mic_audio is not None and mic_audio != "": |
|
audio_file = mic_audio |
|
audio_source = "Microphone" |
|
print(f"Using microphone audio: {mic_audio}") |
|
elif upload_audio is not None: |
|
audio_file = upload_audio |
|
audio_source = "Upload" |
|
print(f"Using uploaded audio: {upload_audio}") |
|
elif text_input and text_input.strip(): |
|
try: |
|
original_text = text_input.strip() |
|
|
|
if source_lang != target_lang: |
|
translator = GoogleTranslator(source=source_lang, target=target_lang) |
|
translated_text = translator.translate(original_text) |
|
else: |
|
translated_text = original_text |
|
|
|
tts = gTTS(text=translated_text, lang=target_lang, slow=False) |
|
|
|
with tempfile.NamedTemporaryFile(delete=False, suffix='.mp3') as tmp_file: |
|
tts.save(tmp_file.name) |
|
return ( |
|
tmp_file.name, |
|
f"Original: {original_text}", |
|
f"Translated: {translated_text}", |
|
f" Source: Text Input" |
|
) |
|
except Exception as e: |
|
return None, f" Error: {str(e)}", "Please try again", "Source: Text Input" |
|
else: |
|
return None, " No input provided", "Please upload audio, record with microphone, OR enter text", "" |
|
|
|
try: |
|
print(f"Processing {audio_source} audio: {audio_file}") |
|
|
|
result = model.transcribe(audio_file, language=source_lang, fp16=False) |
|
original_text = result["text"].strip() |
|
|
|
if not original_text: |
|
return None, " No speech detected", "Please try again with clearer audio", f"Source: {audio_source}" |
|
|
|
print(f"Transcribed: {original_text}") |
|
|
|
if source_lang != target_lang: |
|
translator = GoogleTranslator(source=source_lang, target=target_lang) |
|
translated_text = translator.translate(original_text) |
|
else: |
|
translated_text = original_text |
|
|
|
print(f"Translated: {translated_text}") |
|
|
|
tts = gTTS(text=translated_text, lang=target_lang, slow=False) |
|
|
|
with tempfile.NamedTemporaryFile(delete=False, suffix='.mp3') as tmp_file: |
|
tts.save(tmp_file.name) |
|
return ( |
|
tmp_file.name, |
|
f"Original: {original_text}", |
|
f" Translated: {translated_text}", |
|
f" Source: {audio_source}" |
|
) |
|
|
|
except Exception as e: |
|
print(f"Error: {str(e)}") |
|
return None, f" Error: {str(e)}", "Please try again", f"Source: {audio_source}" |
|
|
|
languages = { |
|
"tr": "Turkish", |
|
"en": "English", |
|
"fr": "French", |
|
"es": "Spanish", |
|
"de": "German", |
|
"hi": "Hindi", |
|
"ja": "Japanese", |
|
"ar": "Arabic", |
|
"ru": "Russian", |
|
"zh": "Chinese" |
|
} |
|
|
|
demo = gr.Interface( |
|
fn=translate_audio, |
|
inputs=[ |
|
gr.Textbox( |
|
label="Enter text to translate", |
|
placeholder="Type text here or leave empty to use audio input...", |
|
lines=2 |
|
), |
|
gr.Audio( |
|
type="filepath", |
|
sources=["upload"], |
|
label="Upload Audio File" |
|
), |
|
gr.Audio( |
|
sources=["microphone"], |
|
label="OR Record with Microphone", |
|
type="filepath" |
|
), |
|
gr.Dropdown( |
|
choices=list(languages.keys()), |
|
value="tr", |
|
label="Source Language" |
|
), |
|
gr.Dropdown( |
|
choices=list(languages.keys()), |
|
value="en", |
|
label="Target Language" |
|
) |
|
], |
|
outputs=[ |
|
gr.Audio(label="Translated Audio Output"), |
|
gr.Textbox(label="Original Text"), |
|
gr.Textbox(label="Translated Text"), |
|
gr.Textbox(label="Audio Source Info") |
|
], |
|
|
|
title="VoiceAI61", |
|
article=""" |
|
<div style="text-align: center; margin-top: 20px;"> |
|
<p>📱 <strong>dear users:</strong> trabzon champion. </p> |
|
</div> |
|
""", |
|
|
|
examples=[ |
|
["", None, None, "tr", "en"], |
|
["", None, None, "en", "fr"], |
|
["Hello world", None, None, "en", "es"], |
|
], |
|
|
|
allow_flagging="never" |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |