Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip | |
| from helpers import transcribe_and_map | |
| def overlay_subtitle(video_path, subtitle_text, position, color): | |
| output_path = "output.mp4" | |
| clip = VideoFileClip(video_path) | |
| txt_clip = TextClip( | |
| subtitle_text, | |
| fontsize=50, | |
| font="Arial-Bold", | |
| color=color, | |
| stroke_color="black", | |
| stroke_width=2, | |
| method="caption", | |
| size=(clip.w - 100, None) | |
| ) | |
| if position == "أعلى": | |
| txt_clip = txt_clip.set_position(("center", "top")) | |
| elif position == "أسفل": | |
| txt_clip = txt_clip.set_position(("center", "bottom")) | |
| else: | |
| txt_clip = txt_clip.set_position("center") | |
| txt_clip = txt_clip.set_duration(clip.duration) | |
| final = CompositeVideoClip([clip, txt_clip]) | |
| final.write_videofile(output_path, codec="libx264", audio_codec="aac", preset="ultrafast", threads=2, verbose=False, logger=None) | |
| return output_path | |
| def extract_text(video_path): | |
| subtitles_map, full_script, duration = transcribe_and_map(video_path) | |
| return full_script | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## 🧠 استخراج الترجمة وتعديلها قبل إضافتها إلى الفيديو") | |
| video_input = gr.Video(label="🎥 ضع الفيديو هنا") | |
| extract_btn = gr.Button("📄 استخراج الترجمة") | |
| transcript_box = gr.Textbox(label="📝 الترجمة المعدّلة") | |
| with gr.Row(): | |
| position = gr.Radio(["أعلى", "وسط", "أسفل"], label="📍 موضع الترجمة", value="أسفل") | |
| color = gr.ColorPicker(label="🎨 لون الخط", value="#FFFFFF") | |
| process_btn = gr.Button("🎬 أضف الترجمة إلى الفيديو") | |
| video_output = gr.Video(label="📤 الفيديو النهائي") | |
| extract_btn.click(fn=extract_text, inputs=video_input, outputs=transcript_box) | |
| process_btn.click(fn=overlay_subtitle, inputs=[video_input, transcript_box, position, color], outputs=video_output) | |
| demo.launch() | |