NIKOLAJ5313 commited on
Commit
44d28d5
·
verified ·
1 Parent(s): e08fe2c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -98
app.py CHANGED
@@ -1,116 +1,115 @@
1
  import gradio as gr
 
2
  import torch
3
- import numpy as np
4
  import tempfile
5
- import os
6
- from pathlib import Path
7
-
8
- # Импорты для озвучки (TTS)
9
- from transformers import SpeechT5Processor, SpeechT5ForTextToSpeech, SpeechT5HifiGan
10
- from datasets import load_dataset
11
-
12
- # Импорты для генерации изображений (слайдов)
13
- from diffusers import DiffusionPipeline
14
- import PIL.Image
15
-
16
- print("🚀 Начинаю загрузку моделей для AI Video Slide Maker...")
17
-
18
- # ---- 1. ЗАГРУЗКА МОДЕЛИ ОЗВУЧКИ (TTS) ----
19
- try:
20
- tts_processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts")
21
- tts_model = SpeechT5ForTextToSpeech.from_pretrained("microsoft/speecht5_tts")
22
- tts_vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan")
23
- embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation")
24
- speaker_embeddings = torch.tensor(embeddings_dataset[7306]["xvector"]).unsqueeze(0)
25
- print("✅ Модель озвучки (TTS) загружена!")
26
- except Exception as e:
27
- print(f"⚠️ Не удалось загрузить модель озвучки: {e}")
28
- tts_model = None
29
-
30
- # ---- 2. ЗАГРУЗКА МОДЕЛИ ГЕНЕРАЦИИ ИЗОБРАЖЕНИЙ (СЛАЙДОВ) ----
31
- try:
32
- # Используем быструю и лёгкую модель для генерации картинок
33
- image_pipe = DiffusionPipeline.from_pretrained("black-forest-labs/FLUX.1-schnell", torch_dtype=torch.float16)
34
- # Если будет работать медленно, можно попробовать "stabilityai/sdxl-turbo"
35
- print("✅ Модель для генерации слайдов загружена!")
36
- except Exception as e:
37
- print(f"⚠️ Не удалось загрузить модель для слайдов: {e}")
38
- image_pipe = None
39
-
40
- # ---- 3. ОСНОВНЫЕ ФУНКЦИИ КОМБАЙНА ----
 
 
41
  def generate_speech(text):
42
- """Создаёт аудио из текста."""
43
- if tts_model is None:
44
- return None, "Модель озвучки не загружена"
45
- if len(text) > 300:
46
- text = text[:300] + "..."
47
- inputs = tts_processor(text=text, return_tensors="pt")
48
- speech = tts_model.generate_speech(inputs["input_ids"], speaker_embeddings, vocoder=tts_vocoder)
49
- audio_array = speech.cpu().numpy()
50
- return 16000, audio_array # частота дискретизации, данные
 
 
 
 
51
 
52
  def generate_slide(prompt):
53
- """Создаёт изображение (слайд) по текстовому описанию."""
54
- if image_pipe is None:
55
- return None, "Модель для слайдов не загружена"
56
  try:
57
- image = image_pipe(
 
 
 
 
58
  prompt,
59
- num_inference_steps=4, # Мало шагов для скорости
60
- guidance_scale=3.5
 
 
61
  ).images[0]
62
- return image, None
 
 
 
 
 
63
  except Exception as e:
64
- return None, f"Ошибка генерации: {e}"
65
 
66
- def create_video_from_slides(images, audio):
67
- """Собирает видео из списка изображений и аудио (заглушка)."""
68
- # Это сложная часть. Пока возвращаем первое изображение как "видео".
69
- if images and isinstance(images, list) and images[0]:
70
- return images[0], "Видео (сборка): Показ слайда с аудио"
71
- return None, "Нет данных для сборки видео"
72
-
73
- # ---- 4. СОЗДАНИЕ ИНТЕРФЕЙСА GRADIO ----
74
- with gr.Blocks(title="🎬 AI Video Slide Maker", theme=gr.themes.Soft()) as demo:
75
- gr.Markdown("# 🎬 AI Video Slide Maker")
76
- gr.Markdown("**Комбайн для создания видео со слайдами и озвучкой**")
77
 
 
 
 
 
 
78
  with gr.Tab("🎤 Озвучка (TTS)"):
79
- tts_input = gr.Textbox(label="Текст для озвучки", lines=3,
80
- placeholder="Введите текст на русском...",
81
- value="Привет! Это тест озвучки от нашего комбайна.")
82
- tts_button = gr.Button("Сгенерировать речь")
83
- tts_audio = gr.Audio(label="Результат", type="numpy")
84
- tts_status = gr.Textbox(label="Статус", interactive=False)
85
-
86
- tts_button.click(fn=generate_speech,
87
- inputs=tts_input,
88
- outputs=[tts_audio, tts_status])
89
-
90
  with gr.Tab("📊 Генератор слайдов"):
91
- slide_prompt = gr.Textbox(label="Опишите ваш слайд", lines=2,
92
- placeholder="Например: Космонавт с котом в космосе, цифровое искусство",
93
- value="Абстрактный фон с градиентом для презентации")
94
- slide_button = gr.Button("Сгенерировать слайд")
95
- slide_image = gr.Image(label="Сгенерированный слайд", type="pil")
96
- slide_status = gr.Textbox(label="Статус", interactive=False)
97
-
98
- slide_button.click(fn=generate_slide,
99
- inputs=slide_prompt,
100
- outputs=[slide_image, slide_status])
101
-
102
- with gr.Tab("🚀 Сборка видео (прототип)"):
103
- gr.Markdown("Здесь будет сборка видео из слайдов и аудио.")
104
- video_output = gr.Image(label="Результат (первый слайд)")
105
- video_status = gr.Textbox(label="Статус сборки", interactive=False)
106
- # Кнопка сборки появится позже, когда добавим логику
107
 
108
  gr.Markdown("---")
109
- gr.Markdown("### 🔧 Следующие шаги:")
110
- gr.Markdown("1. Нажмите **'Сгенерировать речь'** в первой вкладке должна появиться озвучка.")
111
- gr.Markdown("2. Нажмите **'Сгенерировать слайд'** во второй вкладке — должна появиться картинка.")
112
- gr.Markdown("3. Если оба шага работают — основа комбайна готова!")
113
 
114
- # ---- 5. ЗАПУСК ----
115
  if __name__ == "__main__":
116
- demo.launch(debug=True, server_name="0.0.0.0")
 
1
  import gradio as gr
2
+ import os
3
  import torch
 
4
  import tempfile
5
+ from diffusers import StableDiffusionPipeline
6
+ from transformers import pipeline as transformers_pipeline
7
+ import warnings
8
+ warnings.filterwarnings("ignore")
9
+
10
+ # ========== ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ (Ленивая загрузка) ==========
11
+ tts_pipeline = None
12
+ image_pipeline = None
13
+
14
+ def get_tts_model():
15
+ """Ленивая загрузка модели для TTS (речь)"""
16
+ global tts_pipeline
17
+ if tts_pipeline is None:
18
+ print("🔄 Загружаю модель TTS...")
19
+ # Используем маленькую модель для русской речи
20
+ tts_pipeline = transformers_pipeline("text-to-speech", model="ai-forever/rugpt3small_based_on_gpt2")
21
+ return tts_pipeline
22
+
23
+ def get_image_model():
24
+ """Ленивая загрузка модели для генерации изображений"""
25
+ global image_pipeline
26
+ if image_pipeline is None:
27
+ print("🔄 Загружаю модель для генерации изображений...")
28
+ # 1. Самая лёгкая модель: Stable Diffusion 1.5 Tiny (очень быстро, мало памяти)
29
+ model_id = "OFA-Sys/small-stable-diffusion-v0"
30
+ # 2. Альтернатива: Базовая SD 1.5 (лучше качество, но тяжелее)
31
+ # model_id = "runwayml/stable-diffusion-v1-5"
32
+
33
+ # Настройка для CPU: float32 и явное указание device
34
+ image_pipeline = StableDiffusionPipeline.from_pretrained(
35
+ model_id,
36
+ torch_dtype=torch.float32,
37
+ use_auth_token=os.getenv("HF_TOKEN") # Токен для доступа
38
+ )
39
+ image_pipeline = image_pipeline.to("cpu") # Явно указываем CPU
40
+ return image_pipeline
41
+
42
+ # ========== ОСНОВНЫЕ ФУНКЦИИ ==========
43
  def generate_speech(text):
44
+ """Генерация аудио из текста"""
45
+ try:
46
+ tts = get_tts_model()
47
+ # Создаём аудиофайл во временной папке
48
+ with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp_file:
49
+ audio_path = tmp_file.name
50
+ # Здесь должен быть код генерации аудио через tts_pipeline
51
+ # Временная заглушка: создаём пустой файл для демонстрации
52
+ with open(audio_path, 'wb') as f:
53
+ f.write(b'') # Заглушка
54
+ return audio_path
55
+ except Exception as e:
56
+ return f"❌ Ошибка TTS: {str(e)}"
57
 
58
  def generate_slide(prompt):
59
+ """Генерация изображения по промпту"""
 
 
60
  try:
61
+ pipe = get_image_model()
62
+ print(f"✅ Генерация изображения для промпта: {prompt[:50]}...")
63
+
64
+ # Генерация с минимальными требованиями к памяти
65
+ image = pipe(
66
  prompt,
67
+ num_inference_steps=20, # Меньше шагов = меньше памяти
68
+ guidance_scale=7.5,
69
+ height=256, # Маленькое разрешение
70
+ width=256
71
  ).images[0]
72
+
73
+ # Сохраняем во временный файл
74
+ with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp_file:
75
+ image_path = tmp_file.name
76
+ image.save(image_path)
77
+ return image_path
78
  except Exception as e:
79
+ return f"Ошибка генерации: {str(e)}"
80
 
81
+ def assemble_video():
82
+ """Заглушка для сборки видео"""
83
+ return "🎬 Функция сборки видео в разработке"
 
 
 
 
 
 
 
 
84
 
85
+ # ========== ИНТЕРФЕЙС GRADIO ==========
86
+ with gr.Blocks(title="AI Video Slide Maker (Free CPU Version)") as demo:
87
+ gr.Markdown("# 🎥 AI Video Slide Maker (Free CPU Version)")
88
+ gr.Markdown("Облегченная версия, работающая в бесплатном Hugging Face Space")
89
+
90
  with gr.Tab("🎤 Озвучка (TTS)"):
91
+ tts_input = gr.Textbox(label="Текст для озвучки", lines=3,
92
+ placeholder="Введите текст на русском языке...")
93
+ tts_button = gr.Button("Сгенерировать аудио")
94
+ tts_output = gr.Audio(label="Результат", type="filepath")
95
+ tts_button.click(generate_speech, inputs=tts_input, outputs=tts_output)
96
+
 
 
 
 
 
97
  with gr.Tab("📊 Генератор слайдов"):
98
+ img_input = gr.Textbox(label="Описание слайда (промпт)", lines=2,
99
+ placeholder="Например: профессиональная презентация о данных, синий фон")
100
+ img_button = gr.Button("Сгенерировать слайд")
101
+ img_output = gr.Image(label="Сгенерированный слайд", type="filepath")
102
+ img_button.click(generate_slide, inputs=img_input, outputs=img_output)
103
+
104
+ with gr.Tab("🎬 Сборка видео (заглушка)"):
105
+ video_button = gr.Button("Собрать видео (заглушка)")
106
+ video_output = gr.Textbox(label="Статус")
107
+ video_button.click(assemble_video, inputs=None, outputs=video_output)
 
 
 
 
 
 
108
 
109
  gr.Markdown("---")
110
+ gr.Markdown("### ℹ️ Примечание")
111
+ gr.Markdown("Эта версия использует **Stable Diffusion Tiny** для работы в 2 ГБ памяти. Изображения генерируются в низком разрешении.")
 
 
112
 
113
+ # ========== ЗАПУСК ПРИЛОЖЕНИЯ ==========
114
  if __name__ == "__main__":
115
+ demo.launch(debug=False)