WhisperGradioAI / app.py
mohsin1539's picture
Update app.py
9747fb5 verified
Raw
History Blame Contribute Delete
7.79 kB
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)