App web modular para subir videos de clases o videollamadas y obtener transcripción segmentada. Esta es la base arquitectónica y la Fase 1; fases posteriores añadirán enriquecimiento con Gemini, análisis visual y guías paso a paso.
- En disco: los archivos de video se guardan en la carpeta
/uploads/videos(ruta relativa al proyecto). No se guardan en la base de datos. - En la base de datos (SQLite): solo se guardan metadata y rutas: tabla
Video(id, nombre original, nombre guardado, ruta en disco, MIME, tamaño, estado) y tablaProcessingJob(id, videoId, stage, status, mensaje, fechas). El contenido binario del video solo existe en disco.
Detalle en docs/UPLOAD-PERSISTENCE.md.
- Presentación:
src/app(páginas) ysrc/components(UI). - Orquestación:
src/services(casos de uso y pipeline). - Dominio:
src/domain(tipos y entidades). - Módulos:
src/modules— media (FFmpeg), transcription (Whisper), persistence (archivos + Prisma/SQLite).
Detalle en docs/ARCHITECTURE.md.
- Node.js 20+
- FFmpeg instalado y en
PATH(para extracción de audio). - Whisper (Python) instalado y en
PATH:En Windows, si el comando no espip install openai-whisper
whisper, configura:set WHISPER_COMMAND=python -m whisper
-
Clonar / abrir el proyecto y instalar dependencias:
cd video-decode npm install -
Variables de entorno (opcional; hay valores por defecto):
cp .env.example .env
Edita
.envsi quieres cambiar rutas o el modelo Whisper:DATABASE_URL="file:./dev.db"— SQLite.UPLOADS_VIDEOS_DIR— carpeta de videos subidos (por defecto./uploads/videos).UPLOAD_DIR,AUDIO_DIR— carpetas para pipeline de audio (por defecto./data/uploadsy./data/audio).WHISPER_COMMAND— comando para ejecutar Whisper (por defectowhisper).WHISPER_MODEL— modelo:tiny,base,small,medium,large(por defectobase).
-
Base de datos (crea
prisma/dev.dby genera el cliente):npx prisma db push npx prisma generate
-
Arrancar la app:
npm run dev
Abre http://localhost:3000.
-
Uso (flujo de upload):
- En la página principal, elige un video (mp4, webm, mov, avi, mkv, m4v, ogv) y pulsa Subir y transcribir.
- El sistema valida tipo/extension, guarda el archivo en
uploads/videosy registraVideo+ProcessingJoben la BD. - La respuesta se muestra en la misma página: ID del video, nombre original, ruta guardada, tamaño, estado y job creado. Desde ahí puedes ir a Ver job para el detalle del job (y en el futuro, el transcript cuando el pipeline esté en marcha).
- Arranca la app (
npm run dev) y abre http://localhost:3000. - Elige un archivo de video (por ejemplo un
.mp4pequeño). - Pulsa Subir y transcribir.
- Comprueba que aparece el panel con: ID del video, nombre original, ruta guardada (algo como
…/uploads/videos/…), tamaño, estado del video (uploaded), job creado (ID, stageupload, statuspending) y el enlace Ver job. - Opcional: revisa que el archivo existe en
./uploads/videos/y que en la BD hay un registro enVideoy otro enProcessingJob(por ejemplo connpx prisma studio).
| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/upload |
Sube video (form field video). Valida, guarda en uploads/videos, crea Video y ProcessingJob. Devuelve { video, job }. |
| GET | /api/jobs |
Lista últimos videos con sus jobs. |
| GET | /api/jobs/[id] |
Detalle de un job y su video ({ job, video }). |
| GET | /api/jobs/[id]/transcript |
Segmentos del transcript del job. |
- Fase 2: Enriquecimiento semántico con Gemini (resúmenes, anotaciones).
- Fase 3: Análisis visual del video (frames, detección de pizarra/demos).
- Fase 4: Generación de guía paso a paso con capturas relevantes.
Los hooks para estas fases están descritos en docs/ARCHITECTURE.md.