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