| 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() |