El sistema transcribe automáticamente todos los videos subidos usando Groq Whisper Large V3, proporcionando transcripciones con timestamps precisos que permiten análisis contextuales profundos.
Profesor sube video → R2 → Base de datos → Transcripción automática inicia
- Video se guarda en R2 con estado
transcript_status: 'pending' - Sistema descarga el video
- Groq Whisper procesa el audio (
transcript_status: 'processing') - Transcripción se guarda con timestamps (
transcript_status: 'completed') - Si falla:
transcript_status: 'failed'
Cuando se genera un reporte de métricas:
Métricas del estudiante + Transcripción con timestamps → LLM → Análisis contextual
"El estudiante pausó el video 12 veces, sugiere dificultad de comprensión"
"El estudiante pausó 8 veces entre los minutos 3:20-4:45 donde se explicaba el concepto de recursividad en funciones. Recomendación: reforzar este tema con ejercicios prácticos y ejemplos visuales."
{
"transcript": [
{
"start": 0.0,
"end": 5.2,
"text": "Hola estudiantes, hoy vamos a aprender sobre algoritmos"
},
{
"start": 5.2,
"end": 10.8,
"text": "Un algoritmo es una secuencia de pasos para resolver un problema"
}
],
"transcript_status": "completed",
"transcribed_at": "2026-02-20T10:30:00Z"
}GROQ_API_KEY=gsk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxLa misma API key usada para análisis de métricas funciona para transcripción.
| Característica | Valor |
|---|---|
| Modelo | Whisper Large V3 |
| Idioma | Español (auto-detectado) |
| Velocidad | ~5 min de video en 10 segundos |
| Precisión | Alta (modelo más avanzado) |
| Timestamps | Automáticos por segmento |
| Costo | GRATIS (con límites) |
- Audio: 100,000 segundos/mes (~1,666 minutos)
- Rate limit: 20 requests/minuto
- Tamaño máximo: 25 MB por archivo
Suficiente para: ~55 videos de 30 minutos cada uno al mes.
| Estado | Descripción |
|---|---|
pending |
Video subido, transcripción no iniciada |
processing |
Whisper procesando el audio |
completed |
Transcripción completada exitosamente |
failed |
Hubo un error en la transcripción |
Transcribe un video usando Groq Whisper.
const result = await transcribeVideo(videoId, videoUrl);
// result: { success: true, transcript: [...], fullText: "..." }Obtiene la transcripción guardada de un video.
const { transcript, status } = await getVideoTranscript(videoId);Reintenta la transcripción de un video que falló.
const result = await retryTranscription(videoId);Funciones helper para trabajar con transcripciones (client/server side):
Encuentra qué se estaba diciendo en un timestamp específico.
import { findTranscriptAtTime } from '@/lib/utils/transcript';
const segment = findTranscriptAtTime(transcript, 125); // 2:05
// { start: 120, end: 130, text: "explicación del concepto..." }Obtiene el contexto de transcripción alrededor de un timestamp.
import { getTranscriptContext } from '@/lib/utils/transcript';
const context = getTranscriptContext(transcript, 125, 10);
// Retorna segmentos 10 segundos antes y despuésFormatea segundos a formato MM:SS o HH:MM:SS.
import { formatTranscriptTime } from '@/lib/utils/transcript';
formatTranscriptTime(125); // "2:05"
formatTranscriptTime(3665); // "1:01:05"Convierte transcripción a texto plano sin timestamps.
import { transcriptToPlainText } from '@/lib/utils/transcript';
const text = transcriptToPlainText(transcript);
// "Hola estudiantes Un algoritmo es una secuencia..."Convierte transcripción a texto con timestamps formateados.
import { transcriptToTimestampedText } from '@/lib/utils/transcript';
const text = transcriptToTimestampedText(transcript);
// "[0:00-0:05] Hola estudiantes
// [0:05-0:10] Un algoritmo es..."El sistema automáticamente incluye transcripciones en el análisis:
// En buildAnalysisPrompt()
if (hasTranscript) {
// Incluye transcripción con timestamps en el prompt
// LLM puede correlacionar métricas con contenido exacto
}### Video 1: Introducción a Python
Métricas:
- Pausas: 15
- Retrocesos: 8
- Adelantos: 2
Contenido del Video (Transcripción):
[00:00-00:05] Hola estudiantes, hoy aprenderemos Python
[00:05-00:15] Python es un lenguaje de programación interpretado
[03:20-03:45] Las funciones se definen con la palabra def
[03:45-04:15] Veamos un ejemplo de recursividad...
[04:15-04:30] La recursividad puede ser confusa al principio
ANÁLISIS CONTEXTUAL: Con esta transcripción, identifica qué
temas causaron más pausas/retrocesos y proporciona recomendaciones
específicas de minutos a reforzar.
Causa: El video en R2 no es accesible públicamente o la URL expiró.
Solución: Verifica que la URL de R2 permita acceso temporal o usa signed URLs.
Causa: El video excede los límites de Groq (25 MB o límites de cuenta).
Solución:
- Comprime el video antes de subir
- Divide videos largos en partes
Causa: Error en el procesamiento, formato no soportado, o problema de red.
Solución:
- Verifica logs del servidor
- Intenta
retryTranscription(videoId) - Revisa que el formato sea compatible (MP4, MKV, MOV, etc.)
Causa: Audio de baja calidad, ruido de fondo, o idioma no detectado correctamente.
Solución:
- Mejora calidad de audio en grabación
- Reduce ruido de fondo
- Especifica idioma manualmente en
transcribeVideo()
- ✅ Habla claro: Mejor calidad de audio = mejor transcripción
- ✅ Minimiza ruido: Graba en ambiente silencioso
- ✅ Estructura bien: Introduce temas claramente para mejor análisis
- ✅ Revisa estado: Verifica que la transcripción se completó
- ✅ Transcripción en background: No bloquea la carga del video
- ✅ Reintentos automáticos: Si falla, permite reintentar manualmente
- ✅ Manejo de errores: Estados claros para debugging
- ✅ Timestamps precisos: Permite análisis granular
- UI para ver transcripciones: Panel para profesores con texto completo
- Edición manual: Permitir corregir errores en transcripción
- Búsqueda por contenido: Buscar videos por lo que se dice en ellos
- Subtítulos automáticos: Generar SRT/VTT desde transcript
- Detección de capítulos: Identificar secciones automáticamente
- Análisis de sentimiento: Detectar tono/énfasis en explicaciones
- Resúmenes automáticos: Generar TL;DR del video con LLM
¿Problemas? Revisa los logs del servidor o contacta al equipo de desarrollo.