WhisperX: marcas de tiempo palabra por palabra y locuteurs
WhisperX es una capa de software libre (licencia BSD-2-Clause, más de 24.000 estrellas en GitHub) sobre Whisper que añade dos cosas: una alineación forzada mediante un modelo fonético para obtener marcas de tiempo realmente exactas palabra por palabra, y una separación de hablantes mediante pyannote-audio. Todo funciona en local, con una inferencia por lotes que, según anuncia el proyecto, es hasta 70 veces más rápida que el tiempo real con Whisper large-v2, a costa de cargar tres modelos en lugar de uno solo.
Whisper transcribe muy bien y asigna marcas de tiempo aproximadas. WhisperX añade dos cosas que lo cambian todo en cuanto necesitas algo más que un simple documento: una alineación forzada que proporciona marcas de tiempo realmente exactas para cada palabra y una separación de hablantes que indica quién habló y cuándo. Esto es lo que convierte una transcripción en subtítulos utilizables y en un informe de reunión legible.
#Lo que Whisper por sí solo no resuelve
WhisperX es una capa de software libre, bajo licencia BSD-2-Clause, que añade a Whisper dos cosas que el modelo por sí solo no proporciona: marcas de tiempo palabra por palabra obtenidas mediante alineación forzada con un modelo wav2vec2 y una etiqueta de hablante generada por un modelo pyannote. Necesitas WhisperX si creas subtítulos que deben aparecer en el momento adecuado o un informe de reunión en el que se vea quién habló. Si solo quieres texto, basta con Whisper o faster-whisper. Esto implica cargar tres modelos en lugar de uno, disponer de un token de acceso de Hugging Face para la separación de hablantes y aceptar unas limitaciones documentadas: los números y los importes no se alinean, el habla simultánea se gestiona mal y la separación de hablantes sigue siendo imperfecta. Todo se ejecuta en local, tanto en GPU como en CPU o en Mac.
Whisper produce un texto excelente. Sus debilidades aparecen en cuanto se quiere algo más que texto. Según el repositorio de WhisperX, las marcas de tiempo de Whisper se dan por enunciado y no por palabra, y pueden presentar un desfase de varios segundos: algo imperceptible en un documento, pero inaceptable en la subtitulación, donde un subtítulo que aparece un instante demasiado tarde es peor que no tener ningún subtítulo. Y Whisper no distingue entre hablantes: dos horas de reunión se convierten en un monólogo sin diferenciación de voces.
WhisperX responde a ambos añadiendo etapas en lugar de reemplazar el modelo. Es esta elección de diseño la que conserva la calidad de transcripción que conoces. El proyecto, publicado bajo licencia BSD-2-Clause, supera actualmente las 24 000 estrellas en GitHub: una señal de que la necesidad que cubre, añadir marcas de tiempo y atribuir una transcripción, va mucho más allá del subtitulado.
#Las tres etapas
Tu ChatGPT privado y gratuito en tu máquina en 1 hora — LM Studio, Ollama, Open WebUI, tus documentos, sin nube.
- Espacio en línea de por vida
- PDF + archivos
- Reembolsado 30 j
| Paso | Rol | Lo que necesita |
|---|---|---|
| Detección de voz (VAD) | La señal se divide en zonas de habla antes de la transcripción | Un detector de voz (pyannote por defecto, silero como opción) |
| Transcripción | El audio se convierte en texto, a través de faster-whisper, una implementación rápida de Whisper | Un modelo Whisper: su tamaño determina la calidad y el uso de memoria (el modelo predeterminado en la línea de comandos es small) |
| Alineación forzada | Cada palabra se sitúa con precisión en el audio mediante wav2vec2 | Un modelo fonético específico del idioma |
| Separación de hablantes | El audio se divide por voz y los turnos se etiquetan mediante pyannote-audio | El modelo pyannote speaker-diarization-community-1 por defecto, cuyo acceso requiere aceptar condiciones |
La detección de voz tiene una doble función: el repositorio indica que reduce las alucinaciones y permite agrupar los segmentos sin empeorar la tasa de error por palabra. La etapa de alineación suele subestimarse. Es la que hace fiables las marcas de tiempo de cada palabra, apoyándose en un modelo wav2vec2 para situar cada palabra en su posición real en la señal de audio. Depende del idioma: el repositorio especifica que se necesita un modelo wav2vec2 propio de cada idioma y que existen modelos predeterminados para el inglés, el francés, el alemán, el español y el italiano, además de muchos otros idiomas a través de Hugging Face. Para un idioma que no figure en la lista, hay que buscar por cuenta propia un modelo fonético y probarlo. La propia transcripción se beneficia de la inferencia por lotes: el proyecto anuncia hasta 70 veces la velocidad del tiempo real con el modelo large-v2, sin especificar el hardware en su README. Toma esa cifra como un máximo que debes comprobar en tu máquina.
#La separación de hablantes, sin falsas expectativas
El etiquetado funciona agrupando las características vocales de toda la grabación mediante pyannote-audio. El modelo predeterminado de WhisperX es actualmente speaker-diarization-community-1, publicado bajo la licencia CC-BY-4.0, que recibe una señal de audio mono a 16 kHz (el audio estéreo se convierte en mono y las señales con otras frecuencias de muestreo se remuestrean). La ficha del modelo afirma que funciona mucho mejor que el antiguo pipeline 3.1. El repositorio de WhisperX es franco sobre sus limitaciones: el habla superpuesta se gestiona de forma mediocre y la separación sigue estando «lejos de ser perfecta». Las tasas de error de diarización publicadas por pyannote lo demuestran: 11,7 % en AISHELL-4, 17,0 % en AMI (micrófonos individuales), 19,9 % en AMI (micrófono distante), 26,7 % en CALLHOME (parte 2) y 46,8 % en Ego4D, según el corpus. Son corpus académicos, no tus grabaciones, pero el orden de magnitud indica que sigue siendo necesaria una revisión. La situación empeora precisamente cuando las reuniones se complican: personas que se interrumpen, alguien lejos del micrófono, voces similares.
Dos observaciones prácticas. Se puede indicar un número mínimo y máximo de hablantes (opciones --min_speakers y --max_speakers), y el repositorio lo recomienda cuando conoces ese número: el modelo ya no tiene que adivinarlo. Además, las etiquetas son anónimas por diseño: el sistema indica que había tres voces y qué turnos corresponden a cada una, pero no identifica a las personas. Asociar una etiqueta a un nombre es un paso manual, y es también el momento en que la transcripción se convierte en un dato personal.
#Precisión real, no la del benchmark
La transcripción en sí merece una cifra, porque el benchmark habitual da una imagen demasiado favorable. Según VexaScribe, un servicio comercial de transcripción, Whisper large-v3 alcanza una tasa de error por palabra de aproximadamente el 2,7 % en LibriSpeech test-clean, un conjunto de audio limpio de un solo hablante. En audio real en inglés —reuniones, podcasts, llamadas—, el mismo sitio sitúa esta tasa en torno al 8-12 %. Son órdenes de magnitud publicados por un actor del sector, válidos para el inglés: no dicen nada sobre tus grabaciones en francés. WhisperX no mejora la transcripción en sí, que sigue siendo la de Whisper: lo que añade es saber exactamente dónde se encuentra cada palabra y quién la pronunció, dos datos que esta tasa de error no refleja.
| Necesidad | Herramienta |
|---|---|
| Texto plano, rápido | Whisper solo o una implementación rápida como faster-whisper |
| Subtítulos que aparecen en el momento adecuado | WhisperX: el alineamiento es toda su razón de ser |
| Resumen con quién dijo qué | WhisperX con separación de hablantes activada |
| Transcripción en directo, baja latencia | Un motor orientado al procesamiento en streaming; esta cadena está diseñada para archivos |
#Lo que requiere
- El tamaño del modelo Whisper lo determina todo
- Un modelo grande produce el mejor texto y requiere la mayor cantidad de memoria; el repositorio indica que un modelo más grande mejora la precisión de las marcas de tiempo a costa de más memoria de GPU, mientras que un modelo de alineación más grande apenas ayuda.
- Se cargan tres modelos, no uno
- El uso de memoria alcanza su máximo cuando los modelos de transcripción, alineación y separación están todos cargados en memoria. El ejemplo de Python del repositorio libera cada modelo después de su etapa (recolección de basura y, después, torch.cuda.empty_cache()), una solución habitual en una tarjeta pequeña.
- Sin GPU, también en Mac
- El repositorio da el comando para el procesador y para macOS: --compute_type int8 --device cpu. No publica ningún tiempo de procesamiento en procesador: mide en un fragmento antes de planificar un lote. Con un GPU NVIDIA, pide el kit CUDA 12.8, y el proyecto indica menos de 8 GB de memoria para large-v2 con beam_size=5.
- El procesamiento en lote ayuda
- El procesamiento por lotes explica la velocidad anunciada: el valor predeterminado en la línea de comandos es --batch_size 8. Reducirlo (el repositorio menciona 4) libera memoria GPU.
#Instalar y comenzar una transcripción
La instalación se realiza mediante pip; el paquete requiere Python de la versión 3.10 a la 3.13. La línea de comandos escribe por defecto todos los formatos disponibles (srt, vtt, txt, tsv, json, aud), y la opción --highlight_words True subraya cada palabra en el momento en que se pronuncia en los subtítulos SRT y VTT. El JSON incluye las etiquetas de los hablantes cuando la separación está activada.
- 01Instalar WhisperXpip install whisperx installe le paquet ; avec un GPU NVIDIA, installer d'abord le kit CUDA 12.8, selon le dépôt. Le dépôt ajoute qu'il peut falloir installer aussi ffmpeg, en renvoyant aux instructions d'installation de Whisper.
- 02Transcribir y alinearRealizar una primera pasada con un modelo Whisper de tamaño medio (el predeterminado es small), especificando el idioma si se conoce de antemano: si no se especifica, el idioma se detecta automáticamente, y el modelo de alineación depende de ese idioma.
- 03Activar la separación si es necesarioAñadir --diarize y el token de acceso de Hugging Face obtenido tras aceptar las condiciones del modelo pyannote, y indicar el número de hablantes si lo conoces.
- 04Leer de nuevo el archivo de salidaAbrir el archivo SRT o JSON generado y revisar algunos fragmentos al azar, especialmente los turnos de habla en los momentos en que varias personas hablan casi al mismo tiempo.
- Whisper en local: transcripción básica
- Producir un acta de reunión en local
- Asistente de voz local: la cadena completa
- Transcripción de consultas con Whisper
#Lo que la alineación no podrá marcar temporalmente
El repositorio enumera limitaciones que conviene conocer antes de prometer subtítulos perfectos. La primera tiene que ver con los números: las palabras cuyos caracteres no figuran en el diccionario del modelo de alineación, por ejemplo «2014.» o «£13.60», no pueden alinearse y, por tanto, no tienen ninguna marca de tiempo. En una reunión llena de importes y fechas, estas palabras aparecen sin una marca de tiempo propia en el SRT. La segunda es el habla simultánea, que tanto Whisper como WhisperX gestionan mal. La tercera es el idioma: hace falta un modelo wav2vec2 específico.
Dos diferencias con el Whisper original también explican las diferencias en el texto. Para procesar cada lote en una sola pasada, la inferencia se realiza sin marcas de tiempo de Whisper, lo que, según advierte el repositorio, puede generar divergencias respecto a la salida predeterminada. Además, la opción condition_on_prev_text está desactivada por defecto para reducir las alucinaciones. Desde 2026, la opción --interleaved_context restablece un contexto continuo entre segmentos, útil para la puntuación y el vocabulario técnico según el proyecto, pero es reciente: pruébala en un fragmento antes de adoptarla.
#Casos de uso concretos
- Subtitulación de videos de formación
- Las marcas de tiempo palabra por palabra evitan que los subtítulos se retrasen una frase entera respecto a la voz, un defecto que se nota de inmediato y resulta molesto en un contenido educativo.
- Informe de una reunión con varios interlocutores
- La separación de hablantes permite reconstruir quién propuso qué, una información que un resumen sin atribución no puede restituir fielmente.
- Podcasts y entrevistas largas
- La inferencia por lotes está pensada para grabaciones largas: eso es lo que anuncia el título del artículo de los autores, «Time-Accurate Speech Transcription of Long-Form Audio».
- Archivos de audio para indexar
- Un texto con marcas de tiempo para cada palabra permite que una búsqueda apunte directamente al instante exacto de la grabación, no solo al documento completo.
- Extractos para redes sociales
- Localizar el pasaje exacto en el que se pronuncia una frase destacada, con precisión palabra por palabra, facilita el recorte de un fragmento breve sin tener que volver a escuchar todo el vídeo.
Estos casos tienen un punto en común: ninguno requiere transcripción en tiempo real. Se trata de un archivo ya grabado que se procesa posteriormente, lo que deja tiempo para que la inferencia por lotes haga su trabajo sin restricciones de latencia. Cuando lo que se necesita es subtitular en directo —una conferencia retransmitida, una llamada en curso—, WhisperX deja de ser la herramienta adecuada, independientemente de la potencia de la máquina disponible.
#La transcripción es una entrada, no un entregable
En casi todos los casos reales, la transcripción no es el objetivo: sirve de entrada a un modelo local que elabora a partir de ella un informe, un registro de decisiones o un resumen. Esto tiene una consecuencia para la calidad esperada: un error de transcripción en una palabra poco frecuente importa menos que la estructura de los turnos de habla, porque es esta estructura la que permite al modelo atribuir correctamente lo dicho.
En la práctica, un flujo de producción razonable separa las dos tareas: WhisperX produce un texto con marcas de tiempo y etiquetas de hablante, y después un modelo de lenguaje distinto revisa ese texto para obtener un resumen estructurado. Mezclar ambas tareas en una sola llamada —pedir a un modelo que resuma directamente el audio— priva al flujo de procesamiento de la precisión de las marcas de tiempo que WhisperX está precisamente diseñado para aportar y dificulta la verificación posterior de un pasaje concreto.
Otro beneficio: la transcripción se realiza una sola vez y luego se reutiliza para varios entregables —resumen corto, registro de decisiones, subtítulos— sin volver al audio. El texto con marcas de tiempo y etiquetas se convierte en la fuente de verdad.
- Fuente: repositorio oficial de WhisperX en GitHub
- Fuente: modelo de separación de hablantes pyannote community-1
- Fuente: VexaScribe, tasa de error por palabra de Whisper large-v3 (servicio comercial)
- Fuente: whisperx en PyPI
#FAQ
¿Es WhisperX gratuito?+
¿Cuál es la fiabilidad de la separación de hablantes?+
¿Se necesita una GPU?+
¿WhisperX o Whisper solo?+
¿Funciona en francés?+
¿Puede transcribir en directo?+
¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.