Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -10,15 +10,22 @@ import gradio as gr
|
|
10 |
from transformers import GPT2Tokenizer, GPT2LMHeadModel
|
11 |
import torch
|
12 |
|
13 |
-
from pexels_api import API
|
|
|
|
|
|
|
|
|
14 |
from keybert import KeyBERT
|
15 |
|
|
|
16 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
17 |
logger = logging.getLogger(__name__)
|
18 |
|
|
|
19 |
PEXELS_API_KEY = os.environ.get("PEXELS_API_KEY")
|
20 |
-
pexels_api = API(PEXELS_API_KEY)
|
21 |
|
|
|
22 |
MODEL_NAME = "gpt2-small"
|
23 |
try:
|
24 |
tokenizer = GPT2Tokenizer.from_pretrained(MODEL_NAME)
|
@@ -31,6 +38,7 @@ except Exception as e:
|
|
31 |
tokenizer = None
|
32 |
model = None
|
33 |
|
|
|
34 |
try:
|
35 |
kw_model = KeyBERT('multi-qa-MiniLM-L6-cos-v1')
|
36 |
logger.info("Modelo KeyBERT cargado exitosamente.")
|
@@ -38,6 +46,8 @@ except Exception as e:
|
|
38 |
logger.error(f"Error al cargar el modelo KeyBERT: {e}. La b煤squeda de videos ser谩 menos precisa.", exc_info=True)
|
39 |
kw_model = None
|
40 |
|
|
|
|
|
41 |
def generate_script(prompt, max_length=250):
|
42 |
if not tokenizer or not model:
|
43 |
logger.error("Modelo GPT-2 no disponible para generar guion.")
|
@@ -151,6 +161,7 @@ def extract_visual_keywords_from_script(script_text, max_keywords_per_segment=2)
|
|
151 |
logger.info(f"Palabras clave visuales extra铆das del guion: {list(all_keywords)}")
|
152 |
return list(all_keywords)
|
153 |
|
|
|
154 |
def search_pexels_videos(query_list, num_videos_per_query=5, min_duration_sec=7):
|
155 |
if not PEXELS_API_KEY:
|
156 |
logger.error("ERROR: PEXELS_API_KEY no est谩 configurada. No se pueden buscar videos en Pexels.")
|
@@ -165,32 +176,46 @@ def search_pexels_videos(query_list, num_videos_per_query=5, min_duration_sec=7)
|
|
165 |
for query in query_list:
|
166 |
logger.info(f"Buscando {num_videos_per_query} videos en Pexels para la query: '{query}'")
|
167 |
try:
|
168 |
-
|
169 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
|
171 |
if not videos:
|
172 |
logger.info(f"No se encontraron videos en Pexels para la query: '{query}'")
|
173 |
continue
|
174 |
|
175 |
for video in videos:
|
176 |
-
if video.get('duration') and video['duration'] < min_duration_sec:
|
177 |
-
continue
|
178 |
-
|
179 |
best_quality_url = None
|
180 |
-
|
181 |
-
|
|
|
|
|
|
|
182 |
best_quality_url = file['link']
|
183 |
break
|
184 |
-
elif file.get('link'):
|
185 |
-
best_quality_url = file['link']
|
186 |
|
187 |
if best_quality_url:
|
188 |
all_video_urls.add(best_quality_url)
|
189 |
else:
|
190 |
logger.warning(f"No se encontr贸 URL de descarga v谩lida para el video Pexels ID: {video.get('id')}")
|
191 |
|
|
|
|
|
192 |
except Exception as e:
|
193 |
-
logger.error(f"Error al buscar videos en Pexels para '{query}': {e}", exc_info=True)
|
194 |
|
195 |
final_urls = list(all_video_urls)
|
196 |
logger.info(f"Total de {len(final_urls)} URLs de video 煤nicas obtenidas de Pexels.")
|
|
|
10 |
from transformers import GPT2Tokenizer, GPT2LMHeadModel
|
11 |
import torch
|
12 |
|
13 |
+
# --- NO M脕S 'from pexels_api import API' ---
|
14 |
+
# Ahora Pexels se gestiona directamente con requests
|
15 |
+
# from pexels_api import API
|
16 |
+
|
17 |
+
# --- Importar KeyBERT para extracci贸n de palabras clave ---
|
18 |
from keybert import KeyBERT
|
19 |
|
20 |
+
# --- Configuraci贸n de Logging ---
|
21 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
22 |
logger = logging.getLogger(__name__)
|
23 |
|
24 |
+
# --- Clave API de Pexels ---
|
25 |
PEXELS_API_KEY = os.environ.get("PEXELS_API_KEY")
|
26 |
+
# Ya no se inicializa pexels_api = API(PEXELS_API_KEY)
|
27 |
|
28 |
+
# --- Inicializaci贸n de Tokenizer y Modelo GPT-2 ---
|
29 |
MODEL_NAME = "gpt2-small"
|
30 |
try:
|
31 |
tokenizer = GPT2Tokenizer.from_pretrained(MODEL_NAME)
|
|
|
38 |
tokenizer = None
|
39 |
model = None
|
40 |
|
41 |
+
# --- Inicializaci贸n del modelo KeyBERT ---
|
42 |
try:
|
43 |
kw_model = KeyBERT('multi-qa-MiniLM-L6-cos-v1')
|
44 |
logger.info("Modelo KeyBERT cargado exitosamente.")
|
|
|
46 |
logger.error(f"Error al cargar el modelo KeyBERT: {e}. La b煤squeda de videos ser谩 menos precisa.", exc_info=True)
|
47 |
kw_model = None
|
48 |
|
49 |
+
# --- Funciones de Utilidad ---
|
50 |
+
|
51 |
def generate_script(prompt, max_length=250):
|
52 |
if not tokenizer or not model:
|
53 |
logger.error("Modelo GPT-2 no disponible para generar guion.")
|
|
|
161 |
logger.info(f"Palabras clave visuales extra铆das del guion: {list(all_keywords)}")
|
162 |
return list(all_keywords)
|
163 |
|
164 |
+
# --- B煤squeda de videos en Pexels (AHORA CON REQUESTS DIRECTOS) ---
|
165 |
def search_pexels_videos(query_list, num_videos_per_query=5, min_duration_sec=7):
|
166 |
if not PEXELS_API_KEY:
|
167 |
logger.error("ERROR: PEXELS_API_KEY no est谩 configurada. No se pueden buscar videos en Pexels.")
|
|
|
176 |
for query in query_list:
|
177 |
logger.info(f"Buscando {num_videos_per_query} videos en Pexels para la query: '{query}'")
|
178 |
try:
|
179 |
+
# URL de la API de b煤squeda de Pexels
|
180 |
+
# https://www.pexels.com/api/documentation/#videos-search
|
181 |
+
api_url = "https://api.pexels.com/videos/search"
|
182 |
+
headers = {"Authorization": PEXELS_API_KEY}
|
183 |
+
params = {
|
184 |
+
"query": query,
|
185 |
+
"per_page": num_videos_per_query * 2, # Pedimos el doble por si algunos no cumplen duraci贸n
|
186 |
+
"orientation": "landscape", # Opcional: landscape, portrait, square
|
187 |
+
"min_duration": min_duration_sec
|
188 |
+
}
|
189 |
+
|
190 |
+
response = requests.get(api_url, headers=headers, params=params, timeout=15)
|
191 |
+
response.raise_for_status() # Lanza un error si la solicitud HTTP no fue exitosa (c贸digo 4xx o 5xx)
|
192 |
+
|
193 |
+
data = response.json()
|
194 |
+
videos = data.get('videos', [])
|
195 |
|
196 |
if not videos:
|
197 |
logger.info(f"No se encontraron videos en Pexels para la query: '{query}'")
|
198 |
continue
|
199 |
|
200 |
for video in videos:
|
|
|
|
|
|
|
201 |
best_quality_url = None
|
202 |
+
# Ordenar por calidad para obtener la mejor disponible
|
203 |
+
video_files = sorted(video.get('video_files', []), key=lambda x: x.get('width', 0) * x.get('height', 0), reverse=True)
|
204 |
+
|
205 |
+
for file in video_files:
|
206 |
+
if file.get('link'):
|
207 |
best_quality_url = file['link']
|
208 |
break
|
|
|
|
|
209 |
|
210 |
if best_quality_url:
|
211 |
all_video_urls.add(best_quality_url)
|
212 |
else:
|
213 |
logger.warning(f"No se encontr贸 URL de descarga v谩lida para el video Pexels ID: {video.get('id')}")
|
214 |
|
215 |
+
except requests.exceptions.RequestException as e:
|
216 |
+
logger.error(f"Error de HTTP/red al buscar videos en Pexels para '{query}': {e}", exc_info=True)
|
217 |
except Exception as e:
|
218 |
+
logger.error(f"Error inesperado al buscar videos en Pexels para '{query}': {e}", exc_info=True)
|
219 |
|
220 |
final_urls = list(all_video_urls)
|
221 |
logger.info(f"Total de {len(final_urls)} URLs de video 煤nicas obtenidas de Pexels.")
|