from deep_translator import GoogleTranslator from gradio.themes.base import Base import gradio as gr import datetime import whisper # Create Subtitles Format def Format_Timestamp(Seconds): TimeDelta = datetime.timedelta(seconds=Seconds) Total_Seconds = int(TimeDelta.total_seconds()) Hours = Total_Seconds // 3600 Minutes = (Total_Seconds % 3600) // 60 Seconds = Total_Seconds % 60 Milliseconds = int((TimeDelta.total_seconds() - Total_Seconds) * 1000) return f"{Hours:02}:{Minutes:02}:{Seconds:02},{Milliseconds:03}" # Transcribe the Audio File def Transcribe_Audio(Audio_File): model = whisper.load_model("base") result = model.transcribe(Audio_File) Text = result["text"] # Create SRT File Srt_File_Path = "TranscriboSubtitles.srt" Subtitles = "" with open(Srt_File_Path, "w", encoding="utf-8") as Srt_File: for i, seg in enumerate(result["segments"], start=1): Start_Time = Format_Timestamp(seg['start']) End_Time = Format_Timestamp(seg['end']) Srt_File.write(f"{i}\n{Start_Time} --> {End_Time}\n{seg['text']}\n\n") Subtitles += f"{i}\n{Start_Time} --> {End_Time}\n{seg['text']}\n\n" # Create TXT File Text_File_Path = "TranscriboTranscription.txt" with open(Text_File_Path, "w", encoding="utf-8") as Txt_File: Txt_File.write(Text) return Text, Subtitles, Text_File_Path, Srt_File_Path # Translate the Transcription Text def Translate_Text(Text, Target_Language): Translator = GoogleTranslator(source="auto", target=Target_Language) Translated_Text = Translator.translate(Text) # Create Translated TXT File Translated_File_Path = "TranscriboTranslatedTranscription.txt" with open(Translated_File_Path, "w") as Txt_File: Txt_File.write(Translated_Text) return Translated_Text, Translated_File_Path # Translate the Subtitles def Generate_Translated_Subtitles(Subtitles, Target_Language): Translator = GoogleTranslator(source="auto", target=Target_Language) Translated_Lines = [] for Line in Subtitles.split("\n"): if "-->" in Line: Translated_Lines.append(Line) elif Line.strip().isdigit(): Translated_Lines.append(Line) else: Translated_Lines.append(Translator.translate(Line)) Translated_Subtitles = "\n".join(Translated_Lines) # Create Translated SRT File Translated_Srt_File_Path = "TranscriboTranslatedSubtitles.srt" with open(Translated_Srt_File_Path, "w", encoding="utf-8") as Srt_File: Srt_File.write(Translated_Subtitles) return Translated_Subtitles, Translated_Srt_File_Path # All Available Languages in deep_translator Languages = { "af": "Afrikaans", "ar": "Arabic", "bn": "Bengali", "zh": "Chinese", "cs": "Czech", "da": "Danish", "nl": "Dutch", "en": "English", "fi": "Finnish", "fr": "French", "de": "German", "el": "Greek", "hi": "Hindi", "hu": "Hungarian", "id": "Indonesian", "it": "Italian", "ja": "Japanese", "ko": "Korean", "no": "Norwegian", "fa": "Persian", "pl": "Polish", "pt": "Portuguese", "ru": "Russian", "es": "Spanish", "sv": "Swedish", "ta": "Tamil", "th": "Thai", "tr": "Turkish", "uk": "Ukrainian", "ur": "Urdu", "vi": "Vietnamese" } # Customize UI class Seafoam(Base): pass seafoam = Seafoam(font=gr.themes.GoogleFont("Plus Jakarta Sans")) style =""" .gradio-audio { border-radius: 15px !important; } .gradio-primary-button { background: #007bff; color: white; font-weight: bold; border: none; border-radius: 20px; } .gradio-primary-button:hover { background: #0056b3; } .gradio-dropdown { background: #00000000; } .gradio-secondary-button { background: transparent; border: 1.5px solid var(--input-border-color); font-weight: bold; border-radius: 20px; } .gradio-secondary-button:hover { background: var(--input-border-color); } label.container.show_textbox_border.svelte-173056l textarea.svelte-173056l { background:transparent; border-radius: 20px; } div.svelte-633qhp { border-radius: 15px; overflow-y: hidden; } span.svelte-1gfkn6j { padding-left: 20px, font-size:16px; font-weight: bold; } .gradio-container.gradio-container-5-16-0 .contain span.svelte-1gfkn6j { padding-left: 12px; } .icon-button-wrapper.hide-top-corner.svelte-1jx2rq3 { border-radius: 20px; margin: 5px 6.09px 0px 0px; padding: 6px 5.5px 5px 5.5px; } """ # Gradio Interface with Better UI with gr.Blocks(theme=seafoam, css=style) as iface: gr.Markdown("# Transcribo") with gr.Column(): audio_input = gr.Audio(type="filepath", label="Upload Audio", elem_classes=["gradio-audio"]) transcribe_btn = gr.Button("Transcribe", elem_classes=["gradio-primary-button"]) with gr.Row(): transcribed_text = gr.Textbox(label="Transcribed Text", placeholder="Transcribed Text will appear here ...") subtitles_text = gr.Textbox(label="Subtitles", placeholder="Subtitles will appear here ...") with gr.Row(): download_text_btn = gr.DownloadButton("Download Transcription", value="TranscriboTranscription.txt", visible=False, elem_classes=["gradio-secondary-button"]) download_srt_btn = gr.DownloadButton("Download Subtitles (.srt)", value="TranscriboSubtitles.srt", visible=False, elem_classes=["gradio-secondary-button"]) with gr.Column(): target_language = gr.Dropdown(label="Select Target Language", choices=list(Languages.values()), value="English", elem_classes=["gradio-dropdown"]) translate_btn = gr.Button("Translate", elem_classes=["gradio-primary-button"]) with gr.Row(): translated_text = gr.Textbox(label="Translated Text", placeholder="Translated Text will appear here ...") translated_subtitles_text = gr.Textbox(label="Translated Subtitles", placeholder="Translated Subtitles will appear here ...") with gr.Row(): download_translated_btn = gr.DownloadButton("Download Translation", value="TranscriboTranslatedTranscription.txt", visible=False, elem_classes=["gradio-secondary-button"]) download_translated_srt_btn = gr.DownloadButton("Download Translated Subtitles (.srt)", value="TranscriboTranslatedSubtitles.srt", visible=False, elem_classes=["gradio-secondary-button"]) def generate_download_links(audio_file): text, subtitles, text_file, srt_file = Transcribe_Audio(audio_file) return text, subtitles, gr.update(value=text_file, visible=True), gr.update(value=srt_file, visible=True) def generate_translation_and_subtitles(text, subtitles, target_language_label): target_language_code = next(code for code, name in Languages.items() if name == target_language_label) translated_text, translated_file = Translate_Text(text, target_language_code) translated_subtitles, translated_srt_file = Generate_Translated_Subtitles(subtitles, target_language_code) return translated_text, translated_subtitles, gr.update(value=translated_file, visible=True), gr.update(value=translated_srt_file, visible=True) transcribe_btn.click(generate_download_links, inputs=audio_input, outputs=[transcribed_text, subtitles_text, download_text_btn, download_srt_btn]) translate_btn.click(generate_translation_and_subtitles, inputs=[transcribed_text, subtitles_text, target_language], outputs=[translated_text, translated_subtitles_text, download_translated_btn, download_translated_srt_btn]) #This launch the app with Gradio interface if __name__ == "__main__": iface.launch(share=True, inbrowser=True)