gnosticdev commited on
Commit
4fc5eaa
verified
1 Parent(s): 2c33aad

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +41 -112
app.py CHANGED
@@ -44,97 +44,19 @@ def cleanup_temp_files():
44
 
45
  def resize_and_blur_video(clip, target_width=1920, target_height=1080):
46
  """Redimensiona el video al tama帽o 1080p (16:9) y aplica desenfoque si es necesario."""
47
- try:
48
- w, h = clip.size
49
- current_aspect_ratio = w / h
50
- target_aspect_ratio = target_width / target_height
51
-
52
- if abs(current_aspect_ratio - target_aspect_ratio) < 0.1:
53
- # Si la relaci贸n de aspecto ya es cercana a 16:9, solo redimensionamos
54
- return clip.resize((target_width, target_height))
55
-
56
- # Crear un fondo borroso con las dimensiones objetivo
57
- background = ColorClip(size=(target_width, target_height), color=[0, 0, 0]).set_duration(clip.duration)
58
- try:
59
- background = background.fx(vfx.blur, sigma=50)
60
- except Exception as e:
61
- print(f"Error al aplicar blur: {e}")
62
-
63
- # Redimensionar el video original para mantener su proporci贸n
64
- if current_aspect_ratio < target_aspect_ratio: # Video vertical
65
- new_height = target_height
66
- new_width = int(new_height * current_aspect_ratio)
67
- x_center = (target_width - new_width) / 2
68
- resized_clip = clip.resize(width=new_width).set_position((x_center, 0))
69
- else: # Video horizontal
70
- new_width = target_width
71
- new_height = int(new_width / current_aspect_ratio)
72
- y_center = (target_height - new_height) / 2
73
- resized_clip = clip.resize(height=new_height).set_position((0, y_center))
74
-
75
- # Combinar el fondo borroso con el video redimensionado
76
- return CompositeVideoClip([background, resized_clip], size=(target_width, target_height))
77
- except Exception as e:
78
- print(f"Error en resize_and_blur_video: {e}")
79
- return clip
80
 
81
  def download_video(link):
82
  """Descarga un video desde un enlace y lo guarda en la carpeta temporal."""
83
- try:
84
- video_response = requests.get(link)
85
- if video_response.status_code != 200:
86
- return None
87
- temp_video_path = os.path.join(temp_dir, f"temp_video_{int(time.time())}.mp4")
88
- with open(temp_video_path, "wb") as f:
89
- f.write(video_response.content)
90
- return temp_video_path
91
- except Exception as e:
92
- print(f"Error downloading video: {e}")
93
- return None
94
 
95
  def concatenate_pixabay_videos(keywords, num_videos_per_keyword=1):
96
  """Concatena videos de Pixabay basados en palabras clave."""
97
- keyword_list = [keyword.strip() for keyword in keywords.split(",") if keyword.strip()]
98
- if not keyword_list:
99
- keyword_list = ["nature"] # Palabra clave por defecto
100
- video_clips = []
101
- for keyword in keyword_list:
102
- try:
103
- print(f"Buscando videos para la palabra clave '{keyword}'...")
104
- links = search_pixabay(keyword, num_results=num_videos_per_keyword)
105
- if not links:
106
- print(f"No se encontraron videos para '{keyword}', probando con 'nature'")
107
- links = search_pixabay("nature", num_results=num_videos_per_keyword)
108
- if not links:
109
- continue
110
- temp_video_path = download_video(links[0])
111
- if temp_video_path:
112
- clip = VideoFileClip(temp_video_path)
113
- processed_clip = resize_and_blur_video(clip)
114
- video_clips.append(processed_clip)
115
- os.remove(temp_video_path) # Eliminar archivo temporal despu茅s de usarlo
116
- except Exception as e:
117
- print(f"Error procesando palabra clave '{keyword}': {e}")
118
- continue
119
- if not video_clips:
120
- # Si no hay videos, creamos un clip negro de 5 segundos
121
- return ColorClip(size=(1920, 1080), color=[0, 0, 0], duration=5)
122
- random.shuffle(video_clips)
123
- return concatenate_videoclips(video_clips, method="compose")
124
 
125
  def adjust_background_music(video_duration, music_file):
126
  """Ajusta la m煤sica de fondo para que coincida con la duraci贸n del video."""
127
- try:
128
- music = AudioFileClip(music_file)
129
- if music.duration < video_duration:
130
- repetitions = int(video_duration / music.duration) + 1
131
- music_clips = [music] * repetitions
132
- music = concatenate_audioclips(music_clips)
133
- music = music.subclip(0, video_duration)
134
- return music.volumex(0.2)
135
- except Exception as e:
136
- print(f"Error ajustando m煤sica: {e}")
137
- return None
138
 
139
  def combine_audio_video(audio_file, video_clip, music_clip=None):
140
  """Combina el audio y el video en un archivo final."""
@@ -148,30 +70,33 @@ def combine_audio_video(audio_file, video_clip, music_clip=None):
148
 
149
  # Combinamos el audio principal
150
  final_clip = video_clip.set_audio(audio_clip)
 
151
  # A帽adimos la m煤sica de fondo si existe
152
  if music_clip:
153
  music_clip = music_clip.set_duration(total_duration).audio_fadeout(2)
154
  final_clip = final_clip.set_audio(CompositeAudioClip([audio_clip, music_clip]))
155
- # Generamos el nombre del archivo y la ruta
156
- output_filename = f"final_video_{int(time.time())}.mp4"
157
- output_path = os.path.join(output_folder, output_filename)
158
-
159
- # Guardamos el video
160
- final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac", fps=24)
161
 
162
- # Limpiamos los clips
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  final_clip.close()
164
- video_clip.close()
165
- audio_clip.close()
166
- if music_clip:
167
- music_clip.close()
168
-
169
- return output_path
170
- except Exception as e:
171
- print(f"Error combinando audio y video: {e}")
172
- if 'final_clip' in locals():
173
- final_clip.close()
174
- return None
175
 
176
  def upload_to_google_drive(file_path, folder_id):
177
  """Sube un archivo a Google Drive y devuelve el enlace p煤blico."""
@@ -215,34 +140,38 @@ def process_input(text, txt_file, mp3_file, selected_voice, rate, pitch, keyword
215
  final_text = txt_file.decode("utf-8")
216
  else:
217
  raise ValueError("No text input provided")
 
218
  # Generamos el audio
219
  audio_file = asyncio.run(text_to_speech(final_text, selected_voice, rate, pitch))
220
  if not audio_file:
221
  raise ValueError("Failed to generate audio")
 
222
  # Generamos el video
223
  video_clip = concatenate_pixabay_videos(keywords, num_videos_per_keyword=1)
224
  if not video_clip:
225
  raise ValueError("Failed to generate video")
 
226
  # Procesamos la m煤sica de fondo si existe
227
  music_clip = None
228
  if mp3_file is not None:
229
  music_clip = adjust_background_music(video_clip.duration, mp3_file.name)
 
230
  # Combinamos todo
231
  final_video_path = combine_audio_video(audio_file, video_clip, music_clip)
232
  if not final_video_path:
233
  raise ValueError("Failed to combine audio and video")
234
  # Subimos a Google Drive y obtenemos el enlace
235
- download_link = upload_to_google_drive(final_video_path, folder_id=FOLDER_ID)
236
- if download_link:
237
- print(f"Video subido a Google Drive. Enlace de descarga: {download_link}")
238
- return f"[Descargar video]({download_link})"
239
- else:
240
- raise ValueError("Error subiendo el video a Google Drive")
241
- except Exception as e:
242
- print(f"Error durante el procesamiento: {e}")
243
- return None
244
- finally:
245
- cleanup_temp_files() # Limpiar archivos temporales al finalizar
246
 
247
  # Interfaz Gradio
248
  with gr.Blocks() as demo:
@@ -274,4 +203,4 @@ with gr.Blocks() as demo:
274
  port = int(os.getenv("PORT", 7860))
275
 
276
  # Lanzar la aplicaci贸n
277
- demo.launch(server_name="0.0.0.0", server_port=port, share=True, show_error=True)
 
44
 
45
  def resize_and_blur_video(clip, target_width=1920, target_height=1080):
46
  """Redimensiona el video al tama帽o 1080p (16:9) y aplica desenfoque si es necesario."""
47
+ # (c贸digo existente)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
  def download_video(link):
50
  """Descarga un video desde un enlace y lo guarda en la carpeta temporal."""
51
+ # (c贸digo existente)
 
 
 
 
 
 
 
 
 
 
52
 
53
  def concatenate_pixabay_videos(keywords, num_videos_per_keyword=1):
54
  """Concatena videos de Pixabay basados en palabras clave."""
55
+ # (c贸digo existente)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
 
57
  def adjust_background_music(video_duration, music_file):
58
  """Ajusta la m煤sica de fondo para que coincida con la duraci贸n del video."""
59
+ # (c贸digo existente)
 
 
 
 
 
 
 
 
 
 
60
 
61
  def combine_audio_video(audio_file, video_clip, music_clip=None):
62
  """Combina el audio y el video en un archivo final."""
 
70
 
71
  # Combinamos el audio principal
72
  final_clip = video_clip.set_audio(audio_clip)
73
+
74
  # A帽adimos la m煤sica de fondo si existe
75
  if music_clip:
76
  music_clip = music_clip.set_duration(total_duration).audio_fadeout(2)
77
  final_clip = final_clip.set_audio(CompositeAudioClip([audio_clip, music_clip]))
 
 
 
 
 
 
78
 
79
+ # Generamos el nombre del archivo y la ruta
80
+ output_filename = f"final_video_{int(time.time())}.mp4"
81
+ output_path = os.path.join(output_folder, output_filename)
82
+
83
+ # Guardamos el video
84
+ final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac", fps=24)
85
+
86
+ # Limpiamos los clips
87
+ final_clip.close()
88
+ video_clip.close()
89
+ audio_clip.close()
90
+ if music_clip:
91
+ music_clip.close()
92
+
93
+ return output_path
94
+
95
+ except Exception as e:
96
+ print(f"Error combinando audio y video: {e}")
97
+ if 'final_clip' in locals():
98
  final_clip.close()
99
+ return None
 
 
 
 
 
 
 
 
 
 
100
 
101
  def upload_to_google_drive(file_path, folder_id):
102
  """Sube un archivo a Google Drive y devuelve el enlace p煤blico."""
 
140
  final_text = txt_file.decode("utf-8")
141
  else:
142
  raise ValueError("No text input provided")
143
+
144
  # Generamos el audio
145
  audio_file = asyncio.run(text_to_speech(final_text, selected_voice, rate, pitch))
146
  if not audio_file:
147
  raise ValueError("Failed to generate audio")
148
+
149
  # Generamos el video
150
  video_clip = concatenate_pixabay_videos(keywords, num_videos_per_keyword=1)
151
  if not video_clip:
152
  raise ValueError("Failed to generate video")
153
+
154
  # Procesamos la m煤sica de fondo si existe
155
  music_clip = None
156
  if mp3_file is not None:
157
  music_clip = adjust_background_music(video_clip.duration, mp3_file.name)
158
+
159
  # Combinamos todo
160
  final_video_path = combine_audio_video(audio_file, video_clip, music_clip)
161
  if not final_video_path:
162
  raise ValueError("Failed to combine audio and video")
163
  # Subimos a Google Drive y obtenemos el enlace
164
+ download_link = upload_to_google_drive(final_video_path, folder_id=FOLDER_ID)
165
+ if download_link:
166
+ print(f"Video subido a Google Drive. Enlace de descarga: {download_link}")
167
+ return f"[Descargar video]({download_link})"
168
+ else:
169
+ raise ValueError("Error subiendo el video a Google Drive")
170
+ except Exception as e:
171
+ print(f"Error durante el procesamiento: {e}")
172
+ return None
173
+ finally:
174
+ cleanup_temp_files() # Limpiar archivos temporales al finalizar
175
 
176
  # Interfaz Gradio
177
  with gr.Blocks() as demo:
 
203
  port = int(os.getenv("PORT", 7860))
204
 
205
  # Lanzar la aplicaci贸n
206
+ demo.launch(server_name="0.0.0.0", server_port=port, share=True, show_error=True)