video-chak / app.py
mrdilaw's picture
Update app.py
72608fc verified
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()