No description
- Python 52.3%
- JavaScript 24.5%
- HTML 19.1%
- Shell 1.5%
- Batchfile 0.9%
- Other 1.7%
| compose | ||
| data | ||
| files | ||
| plan | ||
| prueba_push | ||
| .gitignore | ||
| fundete.sh | ||
| README.md | ||
| start.bat | ||
| start.ps1 | ||
| start.sh | ||
PJ-Scribe - Sistema de Transcripción Judicial
Sistema de transcripción de audio para audiencias judiciales con corrección automática usando IA.
Arquitectura
- Backend: FastAPI + Celery + Redis
- Transcripción: faster-whisper (small/medium/large-v3)
- Corrección: Ollama + Qwen2.5:1.5b
- Frontend: HTML/JS puro con Fetch API
- Base de datos: PostgreSQL
- Infraestructura: Docker Compose + Supervisor
Estructura de Datos
Expediente (numero, caratula, tribunal)
└── Audiencias (fecha, testigos)
└── Archivos (audio + transcripción)
Relaciones y Modelos
expedientes: número único, título, tribunal (JSONB)audiencias: fecha, testigos (JSONB), notas, FK→expedientefiles: nombre archivo, ruta audio/texto, estado, progreso, FK→audiencia- Todos los campos son obligatorios (No NULL)
testigosytribunalse almacenan como JSONB para flexibilidad
Características del Frontend
- Selects con búsqueda incremental: Filtrado en tiempo real al escribir
- Drag & Drop: Zona de arrastre para subir archivos de audio
- Badges de estado: Indicadores visuales de color (pending/processing/done/failed)
- Barra de progreso: Visualización animada del estado de transcripción
- Toasts: Notificaciones flotantes con auto-dismiss
- Contexto visible: Barras informativas muestran expediente/audiencia seleccionados
- Tabs con indicador activo: Resaltado visual del tab actual
- Polling automático: Actualización cada 5 segundos sin recargar
Instalación
./start.sh
El script levanta todos los servicios y muestra las URLs de acceso.
Uso
- Crear Expediente: Número único, título, tribunal
- Crear Audiencia: Seleccionar expediente padre, fecha, testigos
- Subir Audio: Seleccionar expediente/audiencia, elegir modelo de transcripción
- Ver Progreso: Actualización automática cada 5 segundos
- Descargar Transcripción: Archivo .txt con transcripción y resumen IA
Servicios
- API + Frontend: http://localhost:8000 (FastAPI sirve ambos)
- Documentación API: http://localhost:8000/docs (Swagger UI)
- PostgreSQL: puerto 5432
- Ollama: puerto 11434
- Redis: puerto 6379
Endpoints API
Expedientes
GET /expedientes- Listar expedientesPOST /expedientes- Crear expedienteGET /expedientes/{id}- Obtener expediente con audienciasPUT /expedientes/{id}- Actualizar expedienteDELETE /expedientes/{id}- Eliminar expediente (cascada)
Audiencias
GET /expedientes/{id}/audiencias- Listar audiencias de un expedientePOST /audiencias- Crear audienciaPUT /audiencias/{id}- Actualizar audienciaDELETE /audiencias/{id}- Eliminar audiencia
Archivos
POST /upload- Subir audio (FormData: file, audiencia_id, whisper_model)GET /files- Listar archivosGET /progress/{id}- Obtener progreso de transcripciónGET /download/{id}?type=audio|text- Descargar archivoDELETE /files/{id}- Eliminar archivo
Health
GET /health- Estado del servicio
Configuración
Variables de entorno en compose/docker-compose.yaml:
OLLAMA_KEEP_ALIVE=5m: Tiempo que mantiene el modelo en memoriaDATABASE_URL: Conexión a PostgreSQLAPI_URL: URL de la API FastAPIOLLAMA_URL: URL de Ollama
Docker Compose
- Servicios: Redis, PostgreSQL, Ollama, aplicación (API + Worker)
- Volúmenes: postgres_data, ollama_data, archivos de audio/texto
- Redes internas: Comunicación entre contenedores
Modelos Whisper
- small (~244MB RAM): Rápido (~5 min), calidad básica
- medium (~769MB RAM): Balance calidad/velocidad (~15 min)
- large-v3 (~1.55GB RAM): Máxima calidad, más lento (~30 min)
Wake-up de Ollama
El sistema implementa un mecanismo de wake-up para evitar que Ollama se "duerma":
- Verifica si el modelo está cargado antes de cada uso
- Envía request de calentamiento si es necesario
- Retry con backoff exponencial (3 intentos)
Migración de Datos Legacy
Para migrar archivos antiguos al sistema de expedientes:
cd data/app
python3 migrations.py
Esto crea un expediente "LEGACY" y asocia archivos sin audiencia.
Estructura del Proyecto
pjaudiotext/
├── compose/
│ ├── docker-compose.yaml # Configuración de servicios
│ ├── Dockerfile # Imagen de la aplicación
│ └── supervisord.conf # Supervisor (API + Worker)
├── data/
│ └── app/
│ ├── app.py # API FastAPI
│ ├── tasks.py # Worker Celery (Whisper + Ollama)
│ ├── index.html # Frontend HTML
│ ├── static/
│ │ └── script.js # JavaScript del frontend
│ └── migrations.py # Migración legacy
├── files/
│ ├── audio/ # Audios subidos
│ └── text/ # Transcripciones generadas
├── start.sh # Script de inicio
└── README.md
Notas Técnicas
- Wake-up de Ollama: El modelo se descarga de memoria después de 5 minutos de inactividad para ahorrar RAM
- Contexto dinámico: Tribunal y testigos se pasan a Whisper y Qwen para mejorar transcripción
- Progreso en tiempo real: Polling JavaScript cada 5 segundos sin recargar la página
- Modelo dinámico: El usuario puede elegir calidad de transcripción por archivo
- Frontend puro: Sin frameworks, HTML/JS nativo servido por FastAPI