gnosticdev commited on
Commit
7e2dbc1
verified
1 Parent(s): 3529354

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -22
app.py CHANGED
@@ -3,7 +3,8 @@ from tts_module import get_voices, text_to_speech
3
  from pixabay_api import search_pixabay
4
  from moviepy.editor import (
5
  AudioFileClip, VideoFileClip, CompositeAudioClip,
6
- concatenate_audioclips, concatenate_videoclips, vfx, CompositeVideoClip
 
7
  )
8
  import asyncio
9
  import os
@@ -12,7 +13,8 @@ import requests
12
  import tempfile
13
  import re
14
  import random
15
- from google_drive_upload import upload_to_google_drive # Importa la nueva funci贸n
 
16
 
17
  # Define la carpeta de salida
18
  output_folder = "outputs"
@@ -20,9 +22,9 @@ os.makedirs(output_folder, exist_ok=True)
20
 
21
  # Crear un video predeterminado si no existe
22
  if not os.path.exists(os.path.join(output_folder, "blank.mp4")):
23
- from moviepy.editor import VideoClip
24
- blank_clip = VideoClip(lambda t: None, duration=1) # Video vac铆o de 1 segundo
25
- blank_clip.write_videofile(os.path.join(output_folder, "blank.mp4"), fps=24)
26
 
27
  def clean_text_for_search(text):
28
  """Limpia el texto para hacer b煤squedas v谩lidas en Pixabay"""
@@ -65,7 +67,9 @@ def concatenate_pixabay_videos(keywords, num_videos_per_keyword=1):
65
  """Concatena videos de Pixabay basados en palabras clave."""
66
  keyword_list = [keyword.strip() for keyword in keywords.split(",") if keyword.strip()]
67
  if not keyword_list:
68
- raise Exception("No se proporcionaron palabras clave v谩lidas.")
 
 
69
 
70
  video_clips = []
71
 
@@ -75,11 +79,11 @@ def concatenate_pixabay_videos(keywords, num_videos_per_keyword=1):
75
  links = search_pixabay(keyword, num_results=num_videos_per_keyword)
76
  if not links:
77
  print(f"No se encontraron videos para la palabra clave '{keyword}'. Usando palabra clave predeterminada 'nature'.")
78
- links = search_pixabay("nature", num_results=num_videos_per_keyword) # Palabra clave predeterminada
79
  if not links:
80
  continue
81
 
82
- link = links[0] # Usamos solo el primer video encontrado
83
  video_response = requests.get(link)
84
  if video_response.status_code != 200:
85
  print(f"Error al descargar video desde {link}: C贸digo de estado {video_response.status_code}")
@@ -96,7 +100,9 @@ def concatenate_pixabay_videos(keywords, num_videos_per_keyword=1):
96
  continue
97
 
98
  if not video_clips:
99
- raise Exception("No se pudieron obtener videos v谩lidos.")
 
 
100
 
101
  random.shuffle(video_clips)
102
  return concatenate_videoclips(video_clips, method="compose")
@@ -144,7 +150,7 @@ def combine_audio_video(audio_file, video_clip, music_clip=None):
144
 
145
  except Exception as e:
146
  print(f"Error combinando audio y video: {e}")
147
- return os.path.join(output_folder, "blank.mp4") # Devuelve un video predeterminado en caso de error
148
 
149
  def process_input(text, txt_file, mp3_file, selected_voice, rate, pitch, keywords):
150
  """Procesa la entrada del usuario y genera el video final."""
@@ -154,23 +160,23 @@ def process_input(text, txt_file, mp3_file, selected_voice, rate, pitch, keyword
154
  elif txt_file is not None:
155
  final_text = txt_file.decode("utf-8")
156
  else:
157
- return os.path.join(output_folder, "blank.mp4") # Devuelve un video predeterminado si no hay entrada
158
 
159
  voices = asyncio.run(get_voices())
160
  if selected_voice not in voices:
161
- return os.path.join(output_folder, "blank.mp4") # Devuelve un video predeterminado si la voz no es v谩lida
162
 
163
  try:
164
  audio_file = asyncio.run(text_to_speech(final_text, selected_voice, rate, pitch))
165
  except Exception as e:
166
  print(f"Error generando audio: {e}")
167
- return os.path.join(output_folder, "blank.mp4") # Devuelve un video predeterminado en caso de error
168
 
169
  try:
170
  video_clip = concatenate_pixabay_videos(keywords, num_videos_per_keyword=1)
171
  except Exception as e:
172
  print(f"Error concatenando videos: {e}")
173
- return os.path.join(output_folder, "blank.mp4") # Devuelve un video predeterminado en caso de error
174
 
175
  if mp3_file is not None:
176
  music_clip = adjust_background_music(video_clip.duration, mp3_file.name)
@@ -178,12 +184,12 @@ def process_input(text, txt_file, mp3_file, selected_voice, rate, pitch, keyword
178
  music_clip = None
179
 
180
  final_video_path = combine_audio_video(audio_file, video_clip, music_clip)
181
- upload_to_google_drive(final_video_path) # Sube a Google Drive
182
  return final_video_path
183
 
184
  except Exception as e:
185
  print(f"Error durante el procesamiento: {e}")
186
- return os.path.join(output_folder, "blank.mp4") # Devuelve un video predeterminado en caso de error
187
 
188
  # Interfaz Gradio
189
  with gr.Blocks() as demo:
@@ -193,7 +199,10 @@ with gr.Blocks() as demo:
193
  text_input = gr.Textbox(label="Write your text here", lines=5)
194
  txt_file_input = gr.File(label="Or upload a .txt file", file_types=[".txt"])
195
  mp3_file_input = gr.File(label="Upload background music (.mp3)", file_types=[".mp3"])
196
- keyword_input = gr.Textbox(label="Enter keywords separated by commas (e.g., universe, galaxy, forest, cat)")
 
 
 
197
  voices = asyncio.run(get_voices())
198
  voice_dropdown = gr.Dropdown(choices=list(voices.keys()), label="Select Voice")
199
  rate_slider = gr.Slider(minimum=-50, maximum=50, value=0, label="Speech Rate Adjustment (%)", step=1)
@@ -208,8 +217,8 @@ with gr.Blocks() as demo:
208
  outputs=output_video
209
  )
210
 
211
- # Leer el puerto asignado por Hugging Face
212
- port = int(os.getenv("PORT", 7860))
213
-
214
- # Lanzar la aplicaci贸n
215
- demo.launch(server_name="0.0.0.0", server_port=port, share=True)
 
3
  from pixabay_api import search_pixabay
4
  from moviepy.editor import (
5
  AudioFileClip, VideoFileClip, CompositeAudioClip,
6
+ concatenate_audioclips, concatenate_videoclips, vfx, CompositeVideoClip,
7
+ ColorClip
8
  )
9
  import asyncio
10
  import os
 
13
  import tempfile
14
  import re
15
  import random
16
+ import numpy as np
17
+ from google_drive_upload import upload_to_google_drive
18
 
19
  # Define la carpeta de salida
20
  output_folder = "outputs"
 
22
 
23
  # Crear un video predeterminado si no existe
24
  if not os.path.exists(os.path.join(output_folder, "blank.mp4")):
25
+ # Create a black frame
26
+ color_clip = ColorClip(size=(1920, 1080), color=[0, 0, 0], duration=1)
27
+ color_clip.write_videofile(os.path.join(output_folder, "blank.mp4"), fps=24)
28
 
29
  def clean_text_for_search(text):
30
  """Limpia el texto para hacer b煤squedas v谩lidas en Pixabay"""
 
67
  """Concatena videos de Pixabay basados en palabras clave."""
68
  keyword_list = [keyword.strip() for keyword in keywords.split(",") if keyword.strip()]
69
  if not keyword_list:
70
+ # Si no hay palabras clave, crear un video negro
71
+ color_clip = ColorClip(size=(1920, 1080), color=[0, 0, 0], duration=5)
72
+ return color_clip
73
 
74
  video_clips = []
75
 
 
79
  links = search_pixabay(keyword, num_results=num_videos_per_keyword)
80
  if not links:
81
  print(f"No se encontraron videos para la palabra clave '{keyword}'. Usando palabra clave predeterminada 'nature'.")
82
+ links = search_pixabay("nature", num_results=num_videos_per_keyword)
83
  if not links:
84
  continue
85
 
86
+ link = links[0]
87
  video_response = requests.get(link)
88
  if video_response.status_code != 200:
89
  print(f"Error al descargar video desde {link}: C贸digo de estado {video_response.status_code}")
 
100
  continue
101
 
102
  if not video_clips:
103
+ # Si no se encontraron videos, crear un video negro
104
+ color_clip = ColorClip(size=(1920, 1080), color=[0, 0, 0], duration=5)
105
+ return color_clip
106
 
107
  random.shuffle(video_clips)
108
  return concatenate_videoclips(video_clips, method="compose")
 
150
 
151
  except Exception as e:
152
  print(f"Error combinando audio y video: {e}")
153
+ return os.path.join(output_folder, "blank.mp4")
154
 
155
  def process_input(text, txt_file, mp3_file, selected_voice, rate, pitch, keywords):
156
  """Procesa la entrada del usuario y genera el video final."""
 
160
  elif txt_file is not None:
161
  final_text = txt_file.decode("utf-8")
162
  else:
163
+ return os.path.join(output_folder, "blank.mp4")
164
 
165
  voices = asyncio.run(get_voices())
166
  if selected_voice not in voices:
167
+ return os.path.join(output_folder, "blank.mp4")
168
 
169
  try:
170
  audio_file = asyncio.run(text_to_speech(final_text, selected_voice, rate, pitch))
171
  except Exception as e:
172
  print(f"Error generando audio: {e}")
173
+ return os.path.join(output_folder, "blank.mp4")
174
 
175
  try:
176
  video_clip = concatenate_pixabay_videos(keywords, num_videos_per_keyword=1)
177
  except Exception as e:
178
  print(f"Error concatenando videos: {e}")
179
+ return os.path.join(output_folder, "blank.mp4")
180
 
181
  if mp3_file is not None:
182
  music_clip = adjust_background_music(video_clip.duration, mp3_file.name)
 
184
  music_clip = None
185
 
186
  final_video_path = combine_audio_video(audio_file, video_clip, music_clip)
187
+ upload_to_google_drive(final_video_path)
188
  return final_video_path
189
 
190
  except Exception as e:
191
  print(f"Error durante el procesamiento: {e}")
192
+ return os.path.join(output_folder, "blank.mp4")
193
 
194
  # Interfaz Gradio
195
  with gr.Blocks() as demo:
 
199
  text_input = gr.Textbox(label="Write your text here", lines=5)
200
  txt_file_input = gr.File(label="Or upload a .txt file", file_types=[".txt"])
201
  mp3_file_input = gr.File(label="Upload background music (.mp3)", file_types=[".mp3"])
202
+ keyword_input = gr.Textbox(
203
+ label="Enter keywords separated by commas (e.g., universe, galaxy, forest, cat)",
204
+ value="nature" # Valor predeterminado
205
+ )
206
  voices = asyncio.run(get_voices())
207
  voice_dropdown = gr.Dropdown(choices=list(voices.keys()), label="Select Voice")
208
  rate_slider = gr.Slider(minimum=-50, maximum=50, value=0, label="Speech Rate Adjustment (%)", step=1)
 
217
  outputs=output_video
218
  )
219
 
220
+ if __name__ == "__main__":
221
+ # Leer el puerto asignado por Hugging Face
222
+ port = int(os.getenv("PORT", 7860))
223
+ # Lanzar la aplicaci贸n
224
+ demo.launch(server_name="0.0.0.0", server_port=port, share=True)