Alineación forzada

Qwen3-ForcedAligner proporciona alineación de marcas temporales a nivel de palabra para audio. Realiza un único forward pass no autoregresivo para alinear cada palabra de una transcripción con su posición precisa en la forma de onda del audio.

Cómo funciona

El aligner usa alineación CTC (Connectionist Temporal Classification) con un paso de corrección de monotonía LIS (Longest Increasing Subsequence). Esto garantiza que las marcas temporales siempre estén en orden, incluso cuando la salida CTC bruta contiene inconsistencias menores.

PropiedadValor
Método de alineaciónCTC con corrección de monotonía LIS
Resolución de marcas temporales80 ms
Clases de salida5000
Modo de inferenciaNo autoregresivo (un solo forward pass)

Uso de la CLI

Alinea un archivo de audio. Si no se proporciona transcripción, el audio se transcribe automáticamente primero usando Qwen3-ASR:

.build/release/speech align recording.wav

Proporciona una transcripción conocida para omitir la transcripción automática:

.build/release/speech align recording.wav --text "The quick brown fox jumps over the lazy dog"

Opciones

# Especifica el texto de la transcripción directamente
.build/release/speech align recording.wav --text "known transcript"

# Elige el modelo ASR para el paso de transcripción automática
.build/release/speech align recording.wav --model 1.7b

# Especifica la variante del modelo aligner
.build/release/speech align recording.wav --aligner-model default

# Establece el idioma
.build/release/speech align recording.wav --language en

Soporte de idiomas

Pase --language según el idioma del audio. El modelo está entrenado oficialmente en 11 idiomas (en, zh, ja, ko, es, fr, de, ru, it, pt, ar); el preprocesador también segmenta morfemas en japonés, palabras en coreano, carácter por carácter en chino, y tailandés / lao / jemer / birmano / tibetano de forma nativa con el NLTokenizer de Apple. Las marcas combinantes (matras devanagari, vocales tailandesas, etc.) se preservan, de modo que palabras como नमस्ते y สวัสดी permanecen intactas.

Variantes del modelo

Hay varias variantes del modelo disponibles, intercambiando tamaño por precisión:

VarianteID del modeloTamaño
MLX 4-bit (por defecto)aufklarer/Qwen3-ForcedAligner-0.6B-4bit~979 MB
MLX 8-bitaufklarer/Qwen3-ForcedAligner-0.6B-8bit~1.3 GB
MLX bf16aufklarer/Qwen3-ForcedAligner-0.6B-bf16~1.8 GB
CoreML INT4aufklarer/Qwen3-ForcedAligner-0.6B-CoreML-INT4~662 MB
CoreML INT8aufklarer/Qwen3-ForcedAligner-0.6B-CoreML-INT8~1.1 GB

Selecciona una variante con --aligner-model:

.build/release/speech align recording.wav --aligner-model aufklarer/Qwen3-ForcedAligner-0.6B-8bit

Formato de salida

El aligner genera una línea por palabra con las marcas temporales de inicio y fin en segundos:

[0.24 - 0.48] The
[0.48 - 0.72] quick
[0.72 - 1.04] brown
[1.04 - 1.36] fox
[1.36 - 1.68] jumps
[1.68 - 1.92] over
[1.92 - 2.08] the
[2.08 - 2.40] lazy
[2.40 - 2.80] dog

Cada par de marcas temporales indica la hora de inicio y de fin de la palabra en el audio, con una resolución de 80 ms.

Audio largo

La cabeza de clasificación admite hasta 400 segundos en principio (5000 clases × 80 ms), pero en el modelo publicado Qwen3-ForcedAligner-0.6B el rango entrenado de manera fiable llega hasta unos 270 segundos. Más allá de ese punto, el modelo emite índices de marca temporal ruidosos y el postprocesamiento LIS colapsa todas las palabras finales sobre la misma marca temporal.

La CLI gestiona esto automáticamente: el audio largo se divide en el punto de saturación y se vuelve a alinear. Verás un mensaje de una línea cuando se active la división:

Audio 306.2s saturated after word 690 (272.6s); chunking remaining 33.6s (pass 2)

Define ALIGN_DEBUG=1 para volcar los índices de marca temporal sin procesar y corregidos al investigar resultados desalineados.

Limitación conocida: contenido inicial sin habla

Cuando el audio empieza con contenido sin habla (intro musical, silencio prolongado), el modelo suele asignar la primera palabra cerca de los 0 segundos porque el clasificador no tiene un concepto de "el habla aún no ha empezado". Solución alternativa: recorta el contenido inicial sin habla antes de alinear, o ejecuta una pasada previa de VAD con Silero para encontrar el inicio real del habla.

Importante

Cuando no se proporciona --text, el aligner ejecuta primero un pase completo de transcripción con Qwen3-ASR y luego alinea el texto resultante. Esto significa que la primera ejecución carga tanto el modelo ASR como el modelo aligner. Proporcionar --text omite el paso del ASR y carga solo el aligner.