| import gradio as gr |
| import torch |
| from diffusers import StableDiffusionPipeline |
| from moviepy.editor import ImageClip, concatenate_videoclips, AudioFileClip |
| from moviepy.video.fx.all import resize |
| from PIL import Image, ImageDraw |
| import numpy as np |
| import os |
| from TTS.api import TTS |
| import random |
|
|
| device = "cpu" |
|
|
| |
| pipe = StableDiffusionPipeline.from_pretrained( |
| "stabilityai/stable-diffusion-xl-base-1.0", |
| torch_dtype=torch.float32, |
| use_safetensors=True |
| ).to(device) |
|
|
| |
| tts = TTS(model_name="tts_models/en/ljspeech/tacotron2-DDC", progress_bar=False) |
|
|
| def generate_script(prompt): |
| hooks = [ |
| "They laugh when you start.", |
| "They doubt your discipline.", |
| "They mock your silence.", |
| "But they fear your results." |
| ] |
| random.shuffle(hooks) |
| return hooks |
|
|
| def generate_image(text, index): |
| prompt = f"dark cinematic, luxury wealth, night city, dramatic lighting, 9:16 portrait, {text}" |
| image = pipe(prompt, height=1024, width=576).images[0] |
| path = f"scene_{index}.png" |
| image.save(path) |
| return path |
|
|
| def add_subtitle(image_path, text): |
| img = Image.open(image_path) |
| draw = ImageDraw.Draw(img) |
| w, h = img.size |
|
|
| draw.text((40, h - 180), text, fill="white") |
|
|
| new_path = image_path.replace(".png", "_text.png") |
| img.save(new_path) |
| return new_path |
|
|
| def create_kenburns_clip(image_path, duration=5): |
| clip = ImageClip(image_path).set_duration(duration) |
| clip = clip.resize(height=1280) |
| clip = clip.fx(resize, lambda t: 1 + 0.05 * t) |
| return clip |
|
|
| def generate_voice(script): |
| full_text = " ".join(script) |
| tts.tts_to_file(text=full_text, file_path="voice.wav") |
| return "voice.wav" |
|
|
| def create_video(image_paths, voice_path): |
| clips = [] |
| for img in image_paths: |
| clip = create_kenburns_clip(img) |
| clips.append(clip) |
|
|
| final = concatenate_videoclips(clips, method="compose") |
|
|
| if os.path.exists("music.mp3"): |
| bg_music = AudioFileClip("music.mp3").volumex(0.3) |
| voice = AudioFileClip(voice_path) |
| final = final.set_audio(voice.audio_fadein(1)) |
| else: |
| voice = AudioFileClip(voice_path) |
| final = final.set_audio(voice) |
|
|
| output_path = "final_dark_money.mp4" |
| final.write_videofile(output_path, fps=24) |
|
|
| return output_path |
|
|
| def generate_video(prompt): |
| scenes = generate_script(prompt) |
|
|
| images = [] |
| for i, scene in enumerate(scenes): |
| img = generate_image(scene, i) |
| img_with_text = add_subtitle(img, scene) |
| images.append(img_with_text) |
|
|
| voice = generate_voice(scenes) |
| video = create_video(images, voice) |
|
|
| return video |
|
|
| iface = gr.Interface( |
| fn=generate_video, |
| inputs=gr.Textbox(label="Enter Dark Money Motivation Prompt"), |
| outputs=gr.Video(label="Generated Reel"), |
| title="🔥 Dark Money AI Shorts Generator PRO" |
| ) |
|
|
| iface.launch() |