Spaces:
Sleeping
Sleeping
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.")
|