|
|
import gradio as gr |
|
|
import cv2 |
|
|
import numpy as np |
|
|
import os |
|
|
from moviepy.editor import ImageSequenceClip |
|
|
|
|
|
def generate_video(photo, audio): |
|
|
|
|
|
photo_path = "user_photo.jpg" |
|
|
audio_path = "user_audio.wav" |
|
|
cv2.imwrite(photo_path, photo) |
|
|
audio.write_audiofile(audio_path) |
|
|
|
|
|
|
|
|
frames = [] |
|
|
for i in range(30): |
|
|
frame = photo.copy() |
|
|
|
|
|
|
|
|
y_offset = int(10 * np.sin(i/3)) |
|
|
cv2.rectangle(frame, |
|
|
(100, 150 + y_offset), |
|
|
(200, 250 - y_offset), |
|
|
(0, 0, 0), -1) |
|
|
|
|
|
frames.append(frame) |
|
|
|
|
|
|
|
|
video_path = "output.mp4" |
|
|
clip = ImageSequenceClip([cv2.cvtColor(f, cv2.COLOR_BGR2RGB) for f in frames], |
|
|
fps=30) |
|
|
clip.write_videofile(video_path, codec="libx264", audio=audio_path) |
|
|
|
|
|
return video_path |
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
gr.Markdown("## 🎥 Video Resume Generator") |
|
|
|
|
|
with gr.Row(): |
|
|
photo_input = gr.Image(label="Upload Your Photo", type="numpy") |
|
|
audio_input = gr.Audio(label="Record/Upload Audio", type="filepath") |
|
|
|
|
|
generate_btn = gr.Button("Generate Video") |
|
|
video_output = gr.Video(label="Result") |
|
|
|
|
|
generate_btn.click( |
|
|
fn=generate_video, |
|
|
inputs=[photo_input, audio_input], |
|
|
outputs=video_output |
|
|
) |
|
|
|
|
|
demo.launch() |