Spaces:
Sleeping
Sleeping
| import os | |
| from gtts import gTTS | |
| from mutagen.mp3 import MP3 | |
| from moviepy.editor import * | |
| from PIL import Image, ImageDraw, ImageFont | |
| def video_gen(TEXT): | |
| # === SETTINGS === | |
| WIDTH, HEIGHT = 1280, 720 | |
| FONT_SIZE = 100 | |
| FONT_PATH = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" # Change for Windows/Mac | |
| FONT_COLOR = 'white' | |
| IMAGE_PATH = "images" | |
| TEMP_FRAME_PATH = "temp_frames" | |
| AUDIO_FILE = "voice.mp3" | |
| OUTPUT_VIDEO = "output_video.mp4" | |
| # === STEP 1: Convert text to audio === | |
| def generate_audio(text, filename): | |
| tts = gTTS(text, lang='ta') | |
| tts.save(filename) | |
| # === STEP 2: Get images === | |
| def get_images(folder): | |
| return sorted([os.path.join(folder, f) | |
| for f in os.listdir(folder) | |
| if f.lower().endswith(('.jpg', '.jpeg', '.png'))]) | |
| # === STEP 3: Create text-overlay images using Pillow === | |
| def create_text_image(background_img, text, output_path): | |
| img = Image.open(background_img).resize((WIDTH, HEIGHT)) | |
| draw = ImageDraw.Draw(img) | |
| try: | |
| font = ImageFont.truetype(FONT_PATH, FONT_SIZE) | |
| except: | |
| font = ImageFont.load_default() # Fallback if font fails | |
| margin = 60 | |
| offset = 100 | |
| for line in text.split('\n'): | |
| draw.text((margin, offset), line.strip(), font=font, fill=FONT_COLOR) | |
| offset += FONT_SIZE + 10 | |
| img.save(output_path) | |
| # === STEP 4: Create video slides === | |
| def create_video_slides(images, paragraphs, audio_duration): | |
| os.makedirs(TEMP_FRAME_PATH, exist_ok=True) | |
| clips = [] | |
| duration_per_slide = audio_duration / len(paragraphs) | |
| for i, para in enumerate(paragraphs): | |
| temp_image = os.path.join(TEMP_FRAME_PATH, f"frame_{i}.png") | |
| create_text_image(images[i % len(images)], para, temp_image) | |
| clip = ImageClip(temp_image).set_duration(duration_per_slide) | |
| clips.append(clip) | |
| return clips | |
| # === MAIN === | |
| if __name__ == "__main__": | |
| print("Generating audio...") | |
| generate_audio(TEXT, AUDIO_FILE) | |
| audio = AudioFileClip(AUDIO_FILE) | |
| duration = MP3(AUDIO_FILE).info.length | |
| print("Preparing images...") | |
| images = get_images(IMAGE_PATH) | |
| paragraphs = [p.strip() for p in TEXT.strip().split("\n\n") if p.strip()] | |
| print("Creating video slides...") | |
| video_clips = create_video_slides(images, paragraphs, duration) | |
| print("Finalizing video...") | |
| final_video = concatenate_videoclips(video_clips).set_audio(audio) | |
| final_video.write_videofile(OUTPUT_VIDEO, fps=24) | |
| print("Done! Output saved to:", OUTPUT_VIDEO) |