Pipeline de Transcripción de Audio
Construye pipelines de voz a texto listos para producción con Whisper, Deepgram y AssemblyAI para transcripción por lotes y en tiempo real con diarización de hablantes.
Puntos de Decisión
Árbol de Decisión para Selección de Motor
Si los requisitos incluyen:
├─ ¿Transmisión en tiempo real requerida?
│ ├─ Sí: Usar Deepgram Nova-3 WebSocket (más rápido)
│ └─ No: Continuar a requisitos de precisión
├─ ¿Se necesita la máxima precisión y se tiene GPU?
│ ├─ Sí: Usar Whisper large-v3 con faster-whisper
│ └─ No: Continuar a análisis de costos
├─ ¿Presupuesto < $0.0059/min Y se tiene cómputo?
│ ├─ Sí: Usar Whisper local
│ └─ No: Usar AssemblyAI Universal-2 (mejor diarización por API)
Procesamiento por Lotes vs. Transmisión
Si las características del audio:
├─ ¿Duración > 30 minutos?
│ ├─ Sí: Usar procesamiento por lotes con fragmentación (dividir en silencios)
│ └─ No: Continuar a verificación de latencia
├─ ¿Se necesitan resultados en < 10 segundos?
│ ├─ Sí: Usar transmisión (Deepgram/Whisper.cpp)
│ └─ No: Usar procesamiento por lotes para mayor precisión
Uso de VAD (Detección de Actividad de Voz)
Si el tipo de contenido:
├─ ¿Conversación en vivo/reunión?
│ ├─ Sí: Habilitar VAD (ahorra 40-60% de cómputo en silencios)
│ └─ No: Continuar a verificación de contenido
├─ ¿Conferencia/presentación con pausas?
│ ├─ Sí: Usar VAD conservador (min_silence_duration_ms: 1000)
│ └─ No: Omitir VAD para habla densa (audiolibros, etc.)
Selección de Modelo por Dominio
Si el idioma o acento:
├─ ¿Idioma no inglés o acento fuerte?
│ ├─ Sí: Usar Whisper large-v3 (mejor multilingüe)
│ └─ No: Continuar a verificación de velocidad
├─ ¿Se necesita latencia < 1 segundo?
│ ├─ Sí: Usar transmisión Deepgram Nova-3
│ └─ No: Usar AssemblyAI para terminología empresarial/médica
Modos de Fallo
Alucinación en Silencio
Detección: Las transcripciones muestran frases repetidas durante secciones de silencio o descripciones fantasma de música
Diagnóstico: VAD deshabilitado o umbral demasiado bajo, el modelo genera texto a partir de ruido de fondo
Solución: Habilitar VAD con min_silence_duration_ms: 500, usar --no_speech_threshold 0.6 en Whisper
Colapso de Diarización con >10 Hablantes
Detección: Todos los hablantes se etiquetan como "Speaker 1" después de 10-15 minutos, o cambios aleatorios de hablante a mitad de frase Diagnóstico: El modelo de embeddings de hablante se satura, confusión de superposición en audio concurrido Solución: Pre-segmentar por silencios, usar AssemblyAI dual_channel si es estéreo, limitar a un máximo de 8 hablantes activos
Desviación de Sincronía de Marcas de Tiempo con Video
Detección: Los subtítulos aparecen 2-5 segundos antes/después de los fotogramas de video correspondientes
Diagnóstico: El preprocesamiento de audio cambió la duración, o VAD eliminó segmentos sin ajustar las marcas de tiempo
Solución: Usar --preserve_timing en el preprocesamiento, sincronizar con el timecode de audio original, validar contra eventos de habla conocidos
Fallo de Detección Automática de Idioma
Detección: Palabras en inglés transcritas como galimatías cuando el hablante tiene acento, o cambios de código ignorados
Diagnóstico: El modelo se bloqueó con un idioma incorrecto en los primeros 30 segundos, o el contenido multilingüe confundió al clasificador
Solución: Forzar el idioma con language="en" para inglés con acento, usar task="translate" para convertir de otro idioma a inglés
Desbordamiento de Memoria en Archivos Largos
Detección: Fallos OOM en archivos >45 minutos, o caídas repentinas de calidad después de 30 minutos
Diagnóstico: El modelo mantiene la ventana de contexto completa, la VRAM de la GPU se agota
Solución: Fragmentar en límites de 25 minutos con superposición de 30 segundos, usar --without_timestamps para eficiencia de RAM
Ejemplos Prácticos
Guía Completa de Transcripción de Reuniones
Escenario: Reunión de consejo de 90 minutos, 6 hablantes, se necesita identificación precisa de hablantes y marcas de tiempo para las actas
Análisis de Entrada:
- 90 minutos → requiere fragmentación
- 6 hablantes → dentro de los límites de diarización
- Contexto empresarial → usar AssemblyAI para terminología
Ruta de Decisión:
- Duración > 30 min → se requiere procesamiento por lotes
- Número de hablantes = 6 → diarización factible
- Dominio empresarial → se elige AssemblyAI Universal-2
- Alta precisión necesaria → habilitar etiquetas de hablante + formato inteligente
Implementación:
# Paso 1: Preprocesar (los expertos detectan: normalizar niveles de audio)
ffmpeg -i meeting.mp4 -ar 16000 -ac 1 -filter:a "volume=0.8" meeting_clean.wav
# Paso 2: Fragmentar con superposición (un novato procesaría el archivo completo)
from pydub import AudioSegment
audio = AudioSegment.from_wav("meeting_clean.wav")
chunks = []
for i in range(0, len(audio), 25*60*1000): # Fragmentos de 25 min
chunk = audio[i:i+27*60*1000] # 27 min con 2 min de superposición
chunks.append(chunk)
# Paso 3: Transcribir con diarización
results = []
for chunk in chunks:
response = assemblyai_client.transcribe(
chunk, speaker_labels=True, auto_punctuation=True,
dual_channel=False, speaker_labels_max=8
)
results.append(response.get_paragraphs())
# Paso 4: Fusionar segmentos superpuestos (paso experto que el novato omite)
merged = merge_overlapping_transcripts(results, overlap_seconds=120)
Experto vs Novato:
- Novato: Procesa el archivo de 90 minutos directamente → fallo OOM o baja precisión
- Experto: Fragmenta con superposición, valida la consistencia de hablantes entre fragmentos, normaliza el audio primero
Puertas de Calidad
- WER (Tasa de Error de Palabras) < 5% en muestra de prueba con verdad conocida
- Precisión del hablante > 90% (ID de hablante correcto para cada enunciado cuando hay verdad disponible)
- Latencia en tiempo real < 2 segundos de extremo a extremo en implementaciones de transmisión
- Los archivos SRT/VTT pasan validación (marcas de tiempo correctas, sin segmentos superpuestos)
- Preprocesamiento de audio completado: formato WAV/FLAC mono a 16 kHz confirmado
- Parámetros de VAD ajustados: < 10% de detección falsa positiva de silencio en la muestra
- Uso de memoria < 8 GB para archivos de hasta 2 horas (fragmentación funcionando correctamente)
- Manejo de errores de API probado: maneja timeouts, reintentos y cuota excedida
- Número de hablantes en diarización coincide con lo esperado (±1 hablante de tolerancia)
- Las marcas de tiempo de salida se alinean con el audio original dentro de una precisión de 100 ms
Límites NO-PARA
Esta habilidad NO debe usarse para:
- Síntesis de texto a voz → Usar
voice-audio-engineeren su lugar - Transcripción musical o extracción de letras → Usar
ai-engineerpara modelos de música - Clasificación de audio sin transcripción → Usar
ai-engineerpara clasificación de audio - Traducción en tiempo real (transcribir + traducir) → Combinar con la habilidad
language-translator - Biometría de voz o identificación de hablante → Usar
ai-engineerpara modelos de reconocimiento de hablante - Mejora de calidad de audio o reducción de ruido → Usar
voice-audio-engineerpara procesamiento de audio
Delegar cuando:
- Se necesita detección personalizada de palabras de activación →
voice-audio-engineer - Se requiere huella digital de audio →
data-pipeline-engineer - Se construyen asistentes de voz →
voice-audio-engineer+conversation-designer - Se procesan >10,000 horas →
data-pipeline-engineerpara orquestación