Si tienes cientos de horas de vídeo acumuladas, sabes el problema: tutoriales, reuniones, streams. En algún sitio está ese momento en el que explicaban el proxy inverso, o la frase de tu jefe en la reunión de marzo. Rebobinar y anotar manualmente no escala.
En los últimos meses han aparecido herramientas que indexan el contenido completo de un vídeo con modelos de IA que se ejecutan en tu máquina. Sin nube, sin suscripciones, sin límites. Un desarrollador documentó cómo indexó un año entero de grabaciones en un MacBook de 2021 con Gemma — Google 4 de 31B parámetros, y el resultado es decente. Esto es lo que necesitas para montarlo tú.
Hardware y software mínimo
Necesitas al menos 16 GB de RAM y una GPU — NVIDIA con 8 GB de VRAM. Si tienes menos, hay alternativas con modelos más pequeños. El stack es este:
- Whisper (large-v3) para transcribir el audio. Funciona en CPU, pero con GPU va mucho más rápido.
- Un modelo de embeddings como Gemma 4 (31B) o alternativas más ligeras: Nomic Embed Text o BGE Large.
- Una base de datos vectorial local: ChromaDB, Qdrant o SQLite con extensión vectorial valen.
- Ollama o llama.cpp para servir el modelo localmente.
Si tu hardware va justo, puedes hacerlo por lotes y dejar que el proceso corre mientras duermes. El caso que mencionamos usó 50 GB de swap en un MacBook M1 con 16 GB de RAM. Tardó unas 12 horas para un año de grabaciones. Lento, pero funciona.
Paso 1: Extraer el audio y transcribir
Whisper large-v3 aguanta bien grabaciones de baja calidad, acentos variados y ruido de fondo. Se lanza así:
whisper --model large-v3 --language es --output_dir ./transcripciones video.mp4
Esto genera un archivo VTT con marcas de tiempo. Para tandas grandes, un bucle que recorra la carpeta basta. Vigila el espacio: el proceso intermedio necesita varios GB, pero el VTT final de una hora pesa unos 200-300 KB.
Paso 2: Fragmentar y convertir a vectores
Divides las transcripciones en fragmentos de 30-60 segundos y los conviertes a vectores (embeddings). Cada fragmento se transforma en números que representan su significado. Cuando buscas "cómo configurar Nginx", el sistema encuentra fragmentos semánticamente cercanos aunque no contengan las palabras exactas.
Gemma 4 31B produce embeddings de calidad, pero es lento. Una opción práctica: usa Nomic Embed Text (137 MB, corre en CPU) para la indexación inicial y deja Gemma 4 solo para la búsqueda, cuando la latencia importa menos.
# Ejemplo con ChromaDB
import chromadb
from chromadb.utils import embedding_functions
client = chromadb.PersistentClient(path="./video_index")
collection = client.create_collection(
name="videos",
embedding_function=embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="nomic-embed-text-v1.5"
)
)
# Cada fragmento: (id, texto, metadatos con timestamp y nombre de video)
collection.add(
documents=[texto_del_fragmento],
metadatas=[{"video": "reunion-marzo.mp4", "timestamp": "01:23:45"}],
ids=["reunion-marzo-012345"]
)
Paso 3: Buscar con lenguaje natural
Una vez indexado, la búsqueda es directa. Consultas como "qué dijo Juan sobre el plazo" o "muéstrame cuando configuraron el servidor de staging" funcionan. El sistema convierte tu consulta a vector y encuentra los fragmentos más cercanos.
resultados = collection.query(
query_texts=["plazo de entrega servidor staging"],
n_results=5
)
# Devuelve los 5 fragmentos mas relevantes con sus timestamps
for r in resultados:
print(f"{r['video']} en {r['timestamp']}: {r['texto'][:100]}")
Si además usas Gemma 4 vía Ollama, puedes generar respuestas contextuales: en vez de devolver fragmentos, el modelo responde "en la reunión del 12 de marzo, Juan dijo que el plazo era el viernes 18, minuto 23:45 de reunion-marzo.mp4".
Qué funciona y qué cojea
Whisper transcribe bien en español peninsular con grabaciones decentes. El problema llega con ruido de fondo alto, música o varias voces solapadas. Ahí la transcripción pierde precisión y la búsqueda también.
El talón de Aquiles es separar quién habla. Whisper no hace diarización. pyannote-audio puede, pero añade complejidad y no siempre acierta. Si necesitas buscar por persona, toca etiquetar manualmente o vivir con falsos positivos.
Los vídeos de más de 3 horas pueden saturar la RAM durante la transcripción. Córtalos con ffmpeg: ffmpeg -i video.mp4 -ss 00:00 -t 3600 -c copy parte1.mp4.
Alternativas para hardware modesto
- Whisper tiny o base en lugar de large-v3. Pierdes precisión, pero para tutoriales con audio limpio funciona bien.
- Indexa solo fragmentos clave. No proceses el vídeo entero si solo necesitas partes.
- Embeddings ligeros: Nomic Embed Text (137 MB), BGE Small (33 MB) o all-MiniLM-L6-v2 (80 MB). Dan resultados aceptables.
- Procesamiento nocturno: 10 horas de vídeo pueden tardar toda la noche en hardware modesto, pero por la mañana lo tienes.
Veredicto
Indexar una biblioteca grande de vídeos no es proyecto de fin de semana. La primera vez duele. Pero una vez hecho, tener búsqueda semántica sobre tu archivo cambia cómo trabajas. Dejas de rebobinar y encuentras lo que buscas en segundos.
Con un Mac con Apple Silicon o una PC con GPU de 8 GB, el setup es viable hoy. Los modelos son abiertos, el software es gratuito, no dependes de ningún servicio cloud. Para el resto, las alternativas ligeras existen y mejoran cada mes.