Alinhamento forcado

Qwen3-ForcedAligner fornece alinhamento de timestamps por palavra para audio. Ele executa um unico forward pass nao autoregressivo para alinhar cada palavra de uma transcricao a sua posicao precisa na forma de onda do audio.

Como funciona

O aligner usa alinhamento CTC (Connectionist Temporal Classification) com uma etapa de correcao de monotonicidade LIS (Longest Increasing Subsequence). Isso garante que os timestamps estejam sempre em ordem, mesmo quando a saida CTC bruta contem pequenas inconsistencias.

PropriedadeValor
Metodo de alinhamentoCTC com correcao de monotonicidade LIS
Resolucao de timestamp80 ms
Classes de saida5000
Modo de inferenciaNao autoregressivo (unico forward pass)

Uso do CLI

Alinhe um arquivo de audio. Se nao for fornecida uma transcricao, o audio e transcrito automaticamente primeiro usando Qwen3-ASR:

.build/release/speech align recording.wav

Forneca uma transcricao conhecida para pular a transcricao automatica:

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

Opcoes

# Specify transcript text directly
.build/release/speech align recording.wav --text "known transcript"

# Choose ASR model for auto-transcription step
.build/release/speech align recording.wav --model 1.7b

# Specify aligner model variant
.build/release/speech align recording.wav --aligner-model default

# Set language
.build/release/speech align recording.wav --language en

Suporte de idiomas

Passe --language correspondente ao idioma do áudio. O modelo é oficialmente treinado em 11 idiomas (en, zh, ja, ko, es, fr, de, ru, it, pt, ar); o pré-processador também segmenta morfemas japoneses, palavras coreanas, chinês caractere por caractere e tailandês / laosiano / khmer / birmanês / tibetano nativamente via NLTokenizer da Apple. Marcas combinantes (matras devanágari, vogais tailandesas etc.) são preservadas, portanto palavras como नमस्ते e สวัสดी permanecem intactas.

Variantes do modelo

Varias variantes de modelo estao disponiveis, trocando tamanho por precisao:

VarianteID do modeloTamanho
MLX 4-bit (padrao)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

Selecione uma variante com --aligner-model:

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

Formato de saida

O aligner emite uma linha por palavra com timestamps de inicio e fim em 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 timestamp indica o tempo de inicio e fim da palavra no audio, a uma resolucao de 80 ms.

Audio longo

A cabeca de classificacao pode em principio enderecar ate 400 segundos (5000 classes x 80 ms), mas no modelo distribuido Qwen3-ForcedAligner-0.6B a faixa treinada de forma confiavel chega ate cerca de 270 segundos. Alem desse ponto, o modelo emite indices de timestamp ruidosos e o pos-processamento LIS colapsa todas as palavras finais sobre o mesmo timestamp.

A CLI trata isso automaticamente: o audio longo e dividido no ponto de saturacao e realinhado. Voce vera uma mensagem de uma linha quando a divisao for acionada:

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

Defina ALIGN_DEBUG=1 para imprimir os indices de timestamp brutos e corrigidos ao investigar saidas desalinhadas.

Limitacao conhecida: nao-fala no inicio

Quando o audio comeca com conteudo nao-fala (intro musical, silencio prolongado), o modelo frequentemente marca a primeira palavra perto de 0 segundos porque o classificador nao tem nocao de "a fala ainda nao comecou". Solucao alternativa: corte o conteudo nao-fala inicial antes do alinhamento, ou execute uma pre-passagem de VAD com Silero para encontrar o inicio real da fala.

Importante

Quando nao e fornecido --text, o aligner primeiro executa um pass completo de transcricao Qwen3-ASR, depois alinha o texto resultante. Isso significa que a primeira execucao carrega tanto o modelo ASR quanto o modelo aligner. Fornecer --text pula a etapa de ASR e carrega apenas o aligner.