vidscript / app.py
n-yousefi's picture
Upload 2 files
02605fa verified
Raw
History Blame Contribute Delete
2.02 kB
import gradio as gr
import ffmpeg
import io
import tempfile
import srt
import datetime
from transformers import WhisperForConditionalGeneration, WhisperProcessor, pipeline, MT5ForConditionalGeneration, MT5Tokenizer
# مدل‌ها
asr_model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base.en")
asr_processor = WhisperProcessor.from_pretrained("openai/whisper-base.en")
translator = pipeline("text2text-generation", model="persiannlp/mt5-small-parsinlu-translation_en_fa", tokenizer="persiannlp/mt5-small-parsinlu-translation_en_fa")
def process(video):
# استخراج فایل صوتی
ytmp = tempfile.NamedTemporaryFile(suffix=".wav", delete=False)
(
ffmpeg
.input(video)
.output(ytmp.name, format="wav", ac=1, ar="16000")
.run(quiet=True, overwrite_output=True)
)
# ASR
input_feat = asr_processor(ytmp.name, return_tensors="pt", sampling_rate=16000)
out = asr_model.generate(**input_feat)
segments = asr_processor.batch_decode(out, skip_special_tokens=True) # متن کامل
# برای زمان‌بندی دستی، تقسیم به جملات
subs = []
text = segments[0]
lines = [l for l in text.split('.') if l.strip()]
for i, line in enumerate(lines):
start = datetime.timedelta(seconds=i*5)
end = datetime.timedelta(seconds=(i+1)*5)
# ترجمه
tr = translator(line.strip(), max_length=128)[0]['generated_text']
subs.append(srt.Subtitle(index=i+1, start=start, end=end, content=tr))
srt_data = srt.compose(subs)
return video, srt_data
demo = gr.Interface(
fn=process,
inputs=gr.Video(source="upload", format="mp4"),
outputs=[gr.Video(), gr.Textbox(label="Subtitles (SRT)")],
title="Offline English→Persian Subtitle Maker",
description="ویدیو را آپلود کنید؛ زیرنویس فارسی تولید می‌شود."
)
if __name__ == "__main__":
demo.launch()