srt-generator / app.py
isaac-talb's picture
Rollbacked original
9eb173e
Raw
History Blame Contribute Delete
4.74 kB
import os
import gradio as gr
import whisper
import tempfile
# Cache models so they don’t reload each time
loaded_models = {}
def load_model(model_name):
if model_name not in loaded_models:
loaded_models[model_name] = whisper.load_model(model_name)
return loaded_models[model_name]
def transcribe(video, model_name, language):
# Save uploaded video to temp file
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4")
temp_file.write(video)
temp_file.close()
# Load selected model
model = load_model(model_name)
# Transcribe with Whisper
result = model.transcribe(temp_file.name, language=language, fp16=False)
# Generate SRT text
srt_text = []
for i, segment in enumerate(result["segments"], start=1):
start = segment["start"]
end = segment["end"]
text = segment["text"]
srt_text.append(f"{i}")
srt_text.append(f"{format_timestamp(start)} --> {format_timestamp(end)}")
srt_text.append(text.strip())
srt_text.append("")
srt_output = "\n".join(srt_text)
# Save as .srt file
srt_file_path = tempfile.NamedTemporaryFile(delete=False, suffix=".srt").name
with open(srt_file_path, "w", encoding="utf-8") as f:
f.write(srt_output)
# Delete uploaded video to save space
os.remove(temp_file.name)
return srt_file_path
def format_timestamp(seconds: float) -> str:
"""Convert seconds to SRT timestamp format."""
millisec = int((seconds - int(seconds)) * 1000)
return f"{int(seconds // 3600):02}:{int((seconds % 3600) // 60):02}:{int(seconds % 60):02},{millisec:03}"
# Gradio interface
demo = gr.Interface(
fn=transcribe,
inputs=[
gr.File(type="binary", label="Upload Video"),
gr.Dropdown(choices=["tiny", "base", "small", "medium", "large", "turbo"], value="tiny", label="Choose Whisper Model"),
gr.Dropdown(
choices=[
("Afrikaans", "af"),
("Albanian", "sq"),
("Amharic", "am"),
("Arabic", "ar"),
("Armenian", "hy"),
("Azerbaijani", "az"),
("Basque", "eu"),
("Belarusian", "be"),
("Bengali", "bn"),
("Bosnian", "bs"),
("Bulgarian", "bg"),
("Burmesse", "my"),
("Catalan", "ca"),
("Chinese", "zh"),
("Croatian", "hr"),
("Czech", "cs"),
("Danish", "da"),
("Dutch", "nl"),
("English", "en"),
("Estonian", "et"),
("Finnish", "fi"),
("French", "fr"),
("Galician", "gl"),
("Georgian", "ka"),
("German", "de"),
("Greek", "el"),
("Hebrew", "he"),
("Hindi", "hi"),
("Hungarian", "hu"),
("Icelandic", "is"),
("Indonesian", "id"),
("Irish", "ga"),
("Italian", "it"),
("Japanese", "ja"),
("Kannada", "kn"),
("Kazakh", "kk"),
("Khmer", "km"),
("Korean", "ko"),
("Latin", "la"),
("Latvian", "lv"),
("Lithuanian", "lt"),
("Macedonian", "mk"),
("Malay", "ms"),
("Malayalam", "ml"),
("Maori", "mi"),
("Marathi", "mr"),
("Mongolian", "mn"),
("Nepali", "ne"),
("Norwegian", "no"),
("Persian", "fa"),
("Polish", "pl"),
("Portuguese", "pt"),
("Romanian", "ro"),
("Russian", "ru"),
("Serbian", "sr"),
("Slovak", "sk"),
("Slovenian", "sl"),
("Spanish", "es"),
("Swahili", "sw"),
("Swedish", "sv"),
("Tagalog", "tl"),
("Tamil", "ta"),
("Telugu", "te"),
("Thai", "th"),
("Turkish", "tr"),
("Ukrainian", "uk"),
("Urdu", "ur"),
("Vietnamese", "vi"),
("Welsh", "cy"),
],
value="en",
label="Language Code (ISO)"
)
],
outputs=gr.File(label="Download SRT File"),
title="Video → SRT Generator",
description="Upload a video, select Whisper model and language, then download auto-generated subtitles. Video is deleted after processing."
)
if __name__ == "__main__":
demo.launch()