Zeroistheoneq commited on
Commit
d408bab
·
verified ·
1 Parent(s): 506b7f0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +83 -67
app.py CHANGED
@@ -1,95 +1,111 @@
1
  # app.py
 
2
  import gradio as gr
3
- from audio_analyzer import AudioAnalyzer
4
- from asset_generator import AssetGenerator
5
- from renderer import VideoRenderer
 
 
 
 
 
6
 
7
- # --- Глобальные объекты ---
8
- # Инициализируем тяжелые классы один раз
9
- audio_analyzer = AudioAnalyzer()
10
- asset_generator = AssetGenerator()
11
 
12
  # --- Главная функция-оркестратор ---
13
  def generate_visualization(
14
- audio_file, artist, title, theme,
15
  enable_particles, enable_spectrum, enable_camera,
16
  duration, progress=gr.Progress(track_tqdm=True)
17
  ):
18
- if not audio_file:
19
- raise gr.Error("Пожалуйста, загрузите аудиофайл.")
20
-
21
- # 1. Анализ аудио
22
- progress(0.1, desc="Шаг 1/4: Глубокий анализ аудио...")
23
- audio_features = audio_analyzer.analyze(audio_file)
24
-
25
- # 2. Загрузка AI-модели для графики (если еще не загружена)
26
- progress(0.3, desc="Шаг 2/4: Загрузка AI-модели для графики...")
27
- asset_generator.load_model()
28
-
29
- # 3. Создание фоновой текстуры
30
- progress(0.5, desc="Шаг 3/4: Генерация уникальной AI-текстуры...")
31
- base_texture = asset_generator.create_background_texture(theme, audio_features)
32
-
33
- # 4. Рендеринг видео
34
- progress(0.7, desc="Шаг 4/4: Рендеринг видео с эффектами...")
 
 
 
 
 
 
 
 
 
 
 
 
35
  user_settings = {
36
- 'artist': artist,
37
- 'title': title,
38
- 'enable_particles': enable_particles,
39
- 'enable_spectrum': enable_spectrum,
40
- 'enable_camera_effect': enable_camera,
41
  'duration': duration
42
  }
43
-
44
  renderer = VideoRenderer(1920, 1080, 30, base_texture, audio_features, user_settings)
45
  final_video_path = renderer.render(audio_file)
46
-
47
  progress(1.0, desc="Готово!")
48
- return final_video_path, base_texture, audio_features
49
-
50
-
51
- # --- Интерфейс Gradio ---
52
- with gr.Blocks(theme=gr.themes.Soft(), title="Ultimate AI Music Visualizer") as demo:
53
- gr.Markdown("# 🎵 Ultimate AI Music Visualizer (Архитектура v3.1)")
54
- gr.Markdown("Создание профес��иональной аудио-визуализации с помощью нескольких нейронных сетей на Gradio " + gr.__version__)
55
 
 
 
 
 
 
56
  with gr.Row():
57
  with gr.Column(scale=1):
58
  gr.Markdown("### 1. Загрузите трек")
59
- audio_input = gr.Audio(label="Аудиофайл", type="filepath")
60
-
61
- gr.Markdown("### 2. Информация о треке")
62
- artist_input = gr.Textbox(label="Имя артиста (для бегущей строки)")
63
- title_input = gr.Textbox(label="Название трека (для бегущей строки)")
64
-
65
- gr.Markdown("### 3. Визуальный стиль")
66
- theme_input = gr.Dropdown(
67
- label="Основная тема",
68
- choices=["Cosmic Symphony", "Cyberpunk Night", "Liquid Metal Dreams", "Organic Universe", "Fantasy Landscape"],
69
- value="Cosmic Symphony"
70
  )
71
-
72
- gr.Markdown("### 4. Настройки эффектов")
73
- with gr.Accordion("Включить/выключить модули", open=True):
 
 
 
 
 
74
  particles_toggle = gr.Checkbox(label="Эффект частиц", value=True)
75
- spectrum_toggle = gr.Checkbox(label="Эквалайзер (Спектр)", value=True)
76
- camera_toggle = gr.Checkbox(label="AI-эффект камеры (зум на битах)", value=True)
77
-
78
- gr.Markdown("### 5. Настройки рендера")
79
- duration_slider = gr.Slider(label="Максимальная длительность (секунды)", minimum=10, maximum=180, value=30, step=1)
80
-
81
- generate_btn = gr.Button("🚀 Сгенерировать Визуализацию!", variant="primary")
82
-
83
  with gr.Column(scale=2):
84
- output_video = gr.Video(label="Итоговое видео")
85
- output_image = gr.Image(label="Сгенерированная AI-текстура")
86
- output_json = gr.JSON(label="Результаты анализа аудио")
87
 
88
  generate_btn.click(
89
  fn=generate_visualization,
90
  inputs=[
91
- audio_input, artist_input, title_input, theme_input,
92
  particles_toggle, spectrum_toggle, camera_toggle, duration_slider
93
  ],
94
- outputs=[output_video, output_image, output_json]
95
- )
 
 
 
 
 
1
  # app.py
2
+ # app.py
3
  import gradio as gr
4
+ import time
5
+
6
+ # --- ИЗМЕНЕНИЕ: "Ленивое" хранилище для наших тяжелых объектов ---
7
+ # Используем простой класс, чтобы хранить объекты после их первой загрузки.
8
+ # Это гарантирует, что модель Stable Diffusion загрузится в память только один раз.
9
+ class AppState:
10
+ audio_analyzer = None
11
+ asset_generator = None
12
 
13
+ APP_STATE = AppState()
 
 
 
14
 
15
  # --- Главная функция-оркестратор ---
16
  def generate_visualization(
17
+ audio_file, user_prompt, style,
18
  enable_particles, enable_spectrum, enable_camera,
19
  duration, progress=gr.Progress(track_tqdm=True)
20
  ):
21
+ # --- ГЛАВНОЕ ИЗМЕНЕНИЕ: Все импорты и инициализация происходят здесь ---
22
+ # Это гарантирует, что приложение запустится без проблем с памятью.
23
+ from audio_analyzer import AudioAnalyzer
24
+ from asset_generator import AssetGenerator
25
+ from renderer import VideoRenderer
26
+
27
+ # Ленивая инициализация: создаем объекты только если их еще нет
28
+ if APP_STATE.audio_analyzer is None:
29
+ progress(0, desc="Первый запуск: инициализация анализатора...")
30
+ APP_STATE.audio_analyzer = AudioAnalyzer()
31
+
32
+ if APP_STATE.asset_generator is None:
33
+ progress(0, desc="Первый запуск: инициализация AI-художника...")
34
+ APP_STATE.asset_generator = AssetGenerator()
35
+ # Загружаем тяжелую модель Stable Diffusion в память. Это займет время.
36
+ progress(0.1, desc="Первый запуск: загрузка модели Stable Diffusion (до 2-3 минут)...")
37
+ APP_STATE.asset_generator.load_model()
38
+
39
+ # Дальнейшая логика остается той же
40
+ if not audio_file: raise gr.Error("Пожалуйста, загрузите аудиофайл.")
41
+ if not user_prompt: raise gr.Error("Пожалуйста, опишите вашу идею в поле для промпта.")
42
+
43
+ progress(0.3, desc="Шаг 1/3: Анализ ритма и энергии...")
44
+ audio_features = APP_STATE.audio_analyzer.analyze(audio_file)
45
+
46
+ progress(0.5, desc="Шаг 2/3: ИИ-художник рисует вашу идею...")
47
+ base_texture = APP_STATE.asset_generator.create_background_texture(style, user_prompt)
48
+
49
+ progress(0.7, desc="Шаг 3/3: Анимация и синхронизация с музыкой...")
50
  user_settings = {
51
+ 'artist': '', 'title': '',
52
+ 'enable_particles': enable_particles,
53
+ 'enable_spectrum': enable_spectrum,
54
+ 'enable_camera_effect': enable_camera,
 
55
  'duration': duration
56
  }
57
+ # Renderer легкий, его можно создавать каждый раз
58
  renderer = VideoRenderer(1920, 1080, 30, base_texture, audio_features, user_settings)
59
  final_video_path = renderer.render(audio_file)
60
+
61
  progress(1.0, desc="Готово!")
62
+ return final_video_path, base_texture
 
 
 
 
 
 
63
 
64
+ # --- Интерфейс Gradio (без изменений) ---
65
+ with gr.Blocks(theme=gr.themes.Soft(), title="Creative AI Music Visualizer") as demo:
66
+ gr.Markdown("# 🎨 Creative AI Music Visualizer v5.3 (Bulletproof Fix)")
67
+ gr.Markdown("**Вы — режиссёр. ИИ — ваш инструмент.**")
68
+
69
  with gr.Row():
70
  with gr.Column(scale=1):
71
  gr.Markdown("### 1. Загрузите трек")
72
+ audio_input = gr.Audio(label="Аудиофайл (для анализа ритма и синхронизации)", type="filepath")
73
+
74
+ gr.Markdown("### 2. Опишите вашу идею")
75
+ style_input = gr.Dropdown(
76
+ label="Общий стиль",
77
+ choices=["Cinematic 8K Wallpaper", "Dark Fantasy Art", "Surrealism", "Symbolic Masterpiece", "Abstract Painting"],
78
+ value="Cinematic 8K Wallpaper"
 
 
 
 
79
  )
80
+ prompt_input = gr.Textbox(
81
+ label="Ваш творческий промпт",
82
+ lines=5,
83
+ placeholder="Опишите здесь вашу метафору, например: 'потресканные песочные часы с черным песком внутри, на черном фоне с тяжелыми цепями, которые медленно качаются'..."
84
+ )
85
+
86
+ gr.Markdown("### 3. Настройки анимации")
87
+ with gr.Accordion("Включить/выключить эффекты", open=True):
88
  particles_toggle = gr.Checkbox(label="Эффект частиц", value=True)
89
+ spectrum_toggle = gr.Checkbox(label="Эквалайзер", value=False)
90
+ camera_toggle = gr.Checkbox(label="Эффект камеры (зум на битах)", value=True)
91
+
92
+ duration_slider = gr.Slider(label="Длительность видео (сек)", minimum=10, maximum=60, value=20, step=1)
93
+
94
+ generate_btn = gr.Button("✨ Воплотить идею!", variant="primary")
95
+
 
96
  with gr.Column(scale=2):
97
+ output_video = gr.Video(label="Ваше видео")
98
+ output_image = gr.Image(label="Концепт-арт, созданный по вашему промпту")
 
99
 
100
  generate_btn.click(
101
  fn=generate_visualization,
102
  inputs=[
103
+ audio_input, prompt_input, style_input,
104
  particles_toggle, spectrum_toggle, camera_toggle, duration_slider
105
  ],
106
+ outputs=[output_video, output_image]
107
+ )
108
+
109
+ # --- Запуск приложения (без изменений) ---
110
+ if __name__ == "__main__":
111
+ demo.launch()