File size: 1,713 Bytes
9499791
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

import gradio as gr
from diffusers import StableVideoDiffusionPipeline, StableDiffusionPipeline
from PIL import Image
from gtts import gTTS
from moviepy.editor import ImageSequenceClip, AudioFileClip
from moviepy.audio.AudioClip import CompositeAudioClip
import torch, os

pipe_img = StableDiffusionPipeline.from_pretrained(
    "dreamlike-art/dreamlike-photoreal-2.0", torch_dtype=torch.float16
).to("cuda")

pipe_vid = StableVideoDiffusionPipeline.from_pretrained(
    "stabilityai/stable-video-diffusion-img2vid-xt", torch_dtype=torch.float16, variant="fp16"
).to("cuda")

os.makedirs("bgm_samples", exist_ok=True)
os.system("wget -q -nc -O bgm_samples/calm.mp3 https://github.com/mekarpeles/sample-audio/raw/main/calming.mp3")

def generate(prompt, lang):
    image = pipe_img(prompt, height=512, width=896).images[0]
    image.save("input.png")
    frames = pipe_vid(Image.open("input.png")).frames
    clip = ImageSequenceClip(frames, fps=6)

    tts = gTTS(text=prompt, lang=lang)
    tts.save("voice.mp3")

    music = AudioFileClip("bgm_samples/calm.mp3").subclip(0, clip.duration)
    voice = AudioFileClip("voice.mp3").set_duration(clip.duration)
    audio = CompositeAudioClip([music.volumex(0.3), voice])
    clip = clip.set_audio(audio)

    clip.write_videofile("output.mp4", codec="libx264", audio_codec="aac")
    return "output.mp4"

demo = gr.Interface(
    fn=generate,
    inputs=[gr.Textbox(label="Prompt"), gr.Dropdown(["vi", "en", "ja", "ko"], label="Language", value="vi")],
    outputs=gr.Video(label="🎬 Video kết quả"),
    title="Prompt2Video",
    description="Tạo video AI từ prompt với hình ảnh, chuyển động, giọng đọc và nhạc nền."
)

demo.launch()