MakerVideo / app.py
Nikolaygod777's picture
Update app.py
f3d7684 verified
import gradio as gr
import torch
import subprocess
from diffusers import StableDiffusionPipeline, StableVideoDiffusionPipeline
from transformers import MusicgenForConditionalGeneration, MusicgenProcessor, pipeline
import soundfile as sf
from PIL import Image
from torch import autocast
device = "cuda" if torch.cuda.is_available() else "cpu"
# Модель перевода русского текста на английский
translator = pipeline("translation_ru_to_en", "Helsinki-NLP/opus-mt-ru-en")
# Загрузка моделей
image_pipe = StableDiffusionPipeline.from_pretrained(
"CompVis/stable-diffusion-v1-4",
torch_dtype=torch.float16 if device == "cuda" else torch.float32
).to(device)
video_pipe = StableVideoDiffusionPipeline.from_pretrained(
"stabilityai/stable-video-diffusion-img2vid",
torch_dtype=torch.float16 if device == "cuda" else torch.float32
).to(device)
music_model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
music_processor = MusicgenProcessor.from_pretrained("facebook/musicgen-small")
# Перевод промта
def translate_prompt(prompt):
translation = translator(prompt)
return translation[0]['translation_text']
# Генерация изображения
def generate_image(prompt):
prompt_en = translate_prompt(prompt)
with autocast(device):
image = image_pipe(prompt_en, num_inference_steps=10).images[0]
image_path = "generated_image.png"
image.save(image_path)
return image_path
# Генерация видео
def generate_video(image_path):
image = Image.open(image_path)
with autocast(device):
video_frames = video_pipe(image, num_inference_steps=10, num_frames=16).frames
video_path = "generated_video.mp4"
video_pipe.save_video(video_frames, video_path, fps=8)
return video_path
# Генерация музыки
def generate_music(prompt):
prompt_en = translate_prompt(prompt)
inputs = music_processor(text=[prompt_en], return_tensors="pt")
audio_output = music_model.generate(**inputs, max_new_tokens=512)
audio_array = audio_output[0].cpu().numpy().squeeze()
audio_path = "generated_audio.wav"
sf.write(audio_path, audio_array, samplerate=16000)
return audio_path
# Объединение видео и музыки
def merge_video_audio(video_path, audio_path):
output_path = "final_video.mp4"
subprocess.run(
f"ffmpeg -y -i {video_path} -i {audio_path} -c:v copy -c:a aac {output_path}",
shell=True
)
return output_path
# Главная функция для генерации всех элементов отдельно
def create_all(prompt):
image_path = generate_image(prompt)
video_path = generate_video(image_path)
audio_path = generate_music(prompt)
final_video = merge_video_audio(video_path, audio_path)
return image_path, video_path, audio_path, final_video
# Интерфейс Gradio
with gr.Blocks() as demo:
gr.Markdown("# OnlyReels.AI 🎥🎵 - Генерация изображения, видео и музыки")
prompt_input = gr.Textbox(label="Описание (русский язык)",
placeholder="Пример: Киберпанк-город ночью, синтезаторная музыка")
btn_image = gr.Button("🖼️ Сгенерировать изображение")
btn_video = gr.Button("🎥 Сгенерировать видео")
btn_music = gr.Button("🎵 Сгенерировать музыку")
btn_merge = gr.Button("✨ Объединить видео и музыку")
image_output = gr.Image(label="Изображение")
video_output = gr.Video(label="Видео")
audio_output = gr.Audio(label="Музыка")
final_video_output = gr.Video(label="Итоговое видео с музыкой")
btn_image.click(fn=generate_image, inputs=prompt_input, outputs=image_output)
btn_video.click(fn=generate_video, inputs=image_output, outputs=video_output)
btn_music.click(fn=generate_music, inputs=prompt_input, outputs=audio_output)
btn_merge.click(fn=merge_video_audio, inputs=[video_output, audio_output], outputs=final_video_output)
#btn_generate = gr.Button("✨ Сгенерировать все")
#image_output = gr.Image(label="Изображение")
#video_output = gr.Video(label="Видео")
#audio_output = gr.Audio(label="Музыка")
#final_video_output = gr.Video(label="Итоговое видео с музыкой")
#btn_generate.click(
# fn=create_all,
# inputs=prompt_input,
# outputs=[image_output, video_output, audio_output, final_video_output]
#)
if __name__ == "__main__":
demo.launch()