rocketmandrey's picture
Update app.py
1bb4e73 verified
raw
history blame
8.35 kB
import os
import torch
import gradio as gr
import numpy as np
from huggingface_hub import hf_hub_download
import tempfile
import subprocess
from pathlib import Path
# Получаем токен из переменных окружения
HF_HUB_TOKEN = os.environ.get("HF_HUB_TOKEN")
# Инициализация модели будет происходить лениво
model = None
processor = None
def load_model():
"""Ленивая загрузка модели"""
global model, processor
if model is None:
try:
# Скачиваем файлы модели
model_files = [
"diffusion_pytorch_model.safetensors.index.json",
"multitalk.safetensors"
]
local_dir = "./multitalk_weights"
os.makedirs(local_dir, exist_ok=True)
for file in model_files:
if not os.path.exists(os.path.join(local_dir, file)):
print(f"Скачиваем {file}...")
hf_hub_download(
repo_id="MeiGen-AI/MeiGen-MultiTalk",
filename=file,
local_dir=local_dir,
token=HF_HUB_TOKEN
)
print("Модель загружена!")
return True
except Exception as e:
print(f"Ошибка загрузки модели: {e}")
return False
return True
def generate_talking_video(audio_file, reference_image, prompt_text="A person is talking"):
"""
Генерирует видео с говорящим персонажем
"""
try:
if not load_model():
return None, "Ошибка загрузки модели"
if audio_file is None or reference_image is None:
return None, "Пожалуйста, загрузите аудио файл и референсное изображение"
# Создаем временные файлы
with tempfile.TemporaryDirectory() as temp_dir:
# Сохраняем входные файлы
audio_path = os.path.join(temp_dir, "input_audio.wav")
image_path = os.path.join(temp_dir, "reference_image.jpg")
output_path = os.path.join(temp_dir, "output_video.mp4")
# Копируем файлы
import shutil
shutil.copy2(audio_file, audio_path)
# Сохраняем изображение
if hasattr(reference_image, 'save'):
reference_image.save(image_path)
else:
from PIL import Image
Image.fromarray(reference_image).save(image_path)
# Здесь должна быть логика inference с моделью
# Пока что возвращаем заглушку
return None, f"Модель загружена. Получены файлы:\n- Аудио: {audio_path}\n- Изображение: {image_path}\n- Промпт: {prompt_text}\n\nДля полной реализации нужна интеграция с MultiTalk pipeline."
except Exception as e:
return None, f"Ошибка генерации: {str(e)}"
def generate_from_text(text, reference_image, voice_type="female"):
"""
Генерирует видео из текста (сначала TTS, потом lip-sync)
"""
try:
if not text.strip():
return None, "Введите текст для озвучивания"
if reference_image is None:
return None, "Загрузите референсное изображение"
# Здесь нужно сначала сгенерировать аудио из текста
# Затем использовать его для генерации видео
return None, f"Функция text-to-video в разработке.\nТекст: {text}\nТип голоса: {voice_type}"
except Exception as e:
return None, f"Ошибка: {str(e)}"
# Создаем интерфейс Gradio
with gr.Blocks(title="MeiGen-MultiTalk Demo") as demo:
gr.Markdown("# MeiGen-MultiTalk: Audio-Driven Talking Video Generation")
gr.Markdown("Создавайте видео с говорящими персонажами из аудио и референсных изображений")
with gr.Tabs():
with gr.Tab("Аудио → Видео"):
gr.Markdown("### Загрузите аудио и референсное изображение для создания говорящего видео")
with gr.Row():
with gr.Column():
audio_input = gr.Audio(
label="Аудио файл",
type="filepath",
sources=["upload", "microphone"]
)
image_input = gr.Image(
label="Референсное изображение лица",
type="pil"
)
prompt_input = gr.Textbox(
label="Описание видео (опционально)",
value="A person is talking naturally",
lines=2
)
generate_btn = gr.Button("Генерировать видео", variant="primary")
with gr.Column():
video_output = gr.Video(label="Результат")
status_output = gr.Textbox(label="Статус", lines=3)
generate_btn.click(
fn=generate_talking_video,
inputs=[audio_input, image_input, prompt_input],
outputs=[video_output, status_output]
)
with gr.Tab("Текст → Видео"):
gr.Markdown("### Введите текст для создания говорящего видео")
with gr.Row():
with gr.Column():
text_input = gr.Textbox(
label="Текст для озвучивания",
lines=4,
placeholder="Введите текст, который должен произнести персонаж..."
)
image_input2 = gr.Image(
label="Референсное изображение лица",
type="pil"
)
voice_select = gr.Dropdown(
choices=["female", "male", "child"],
value="female",
label="Тип голоса"
)
generate_btn2 = gr.Button("Генерировать видео", variant="primary")
with gr.Column():
video_output2 = gr.Video(label="Результат")
status_output2 = gr.Textbox(label="Статус", lines=3)
generate_btn2.click(
fn=generate_from_text,
inputs=[text_input, image_input2, voice_select],
outputs=[video_output2, status_output2]
)
gr.Markdown("""
### Инструкция по использованию:
1. **Аудио → Видео**: Загрузите аудио файл и фото лица для создания lip-sync видео
2. **Текст → Видео**: Введите текст, выберите тип голоса и загрузите фото
### Требования:
- Изображение должно содержать четко видимое лицо
- Аудио должно содержать речь (не музыку)
- Рекомендуемая длительность аудио: до 15 секунд
""")
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)