강제 정렬

Qwen3-ForcedAligner는 오디오에 대한 단어 수준 타임스탬프 정렬을 제공합니다. 비자기회귀 단일 순방향 패스로 전사의 각 단어를 오디오 파형의 정확한 위치에 정렬합니다.

동작 방식

정렬기는 LIS (Longest Increasing Subsequence, 최장 증가 부분 수열) 단조성 보정 단계와 함께 CTC (Connectionist Temporal Classification) 정렬을 사용합니다. 이를 통해 raw CTC 출력에 사소한 불일치가 있더라도 타임스탬프가 항상 순서대로 유지됩니다.

속성
정렬 방법LIS 단조성 보정을 적용한 CTC
타임스탬프 해상도80 ms
출력 클래스5000
추론 모드비자기회귀 (단일 순방향 패스)

CLI 사용법

오디오 파일을 정렬합니다. 전사가 제공되지 않으면 먼저 Qwen3-ASR을 사용하여 오디오가 자동 전사됩니다:

.build/release/speech align recording.wav

자동 전사를 건너뛰려면 알려진 전사를 제공하세요:

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

옵션

# 전사 텍스트 직접 지정
.build/release/speech align recording.wav --text "known transcript"

# 자동 전사 단계의 ASR 모델 선택
.build/release/speech align recording.wav --model 1.7b

# 정렬기 모델 변형 지정
.build/release/speech align recording.wav --aligner-model default

# 언어 설정
.build/release/speech align recording.wav --language en

언어 지원

오디오 언어에 맞춰 --language를 전달하세요. 모델은 공식적으로 11개 언어(en、zh、ja、ko、es、fr、de、ru、it、pt、ar)로 학습되었으며, 전처리기는 Apple의 NLTokenizer로 일본어 형태소, 한국어 단어, 중국어 글자 단위, 그리고 태국어 / 라오어 / 크메르어 / 버마어 / 티베트어까지 네이티브로 분할합니다. 결합 부호(데바나가리 마트라, 태국어 모음 등)는 그대로 보존되어 नमस्तेสวัสดี 같은 단어가 손상되지 않습니다.

모델 변형

여러 모델 변형이 제공되며 크기와 정확도를 트레이드오프합니다:

변형모델 ID크기
MLX 4비트 (기본)aufklarer/Qwen3-ForcedAligner-0.6B-4bit약 979 MB
MLX 8비트aufklarer/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

--aligner-model로 변형을 선택합니다:

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

출력 형식

정렬기는 단어당 한 줄씩 시작과 종료 타임스탬프를 초 단위로 출력합니다:

[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

각 타임스탬프 쌍은 80 ms 해상도로 오디오에서 해당 단어의 시작과 종료 시간을 나타냅니다.

장시간 오디오 처리

분류 헤드는 원리적으로 최대 400초(5000개 클래스 × 80 ms)까지 처리할 수 있지만, 실제로 출시된 Qwen3-ForcedAligner-0.6B 모델은 약 270초까지가 안정적으로 학습된 범위입니다. 그 이후에는 모델이 노이즈가 많은 타임스탬프 인덱스를 출력하며, LIS 후처리가 후미의 모든 단어를 동일한 타임스탬프로 수렴시킵니다.

CLI는 이를 자동으로 처리합니다. 긴 오디오는 포화 지점에서 청크로 분할되고 재정렬됩니다. 청킹이 작동하면 다음과 같은 한 줄 메시지가 표시됩니다:

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

타임스탬프 불일치를 조사할 때는 ALIGN_DEBUG=1을 설정하여 원시 인덱스와 보정된 타임스탬프 인덱스를 덤프할 수 있습니다.

알려진 제한사항: 선행 비음성

오디오가 비음성 콘텐츠(음악 인트로, 긴 무음)로 시작하면, 분류기에 "음성이 아직 시작되지 않았다"는 개념이 없기 때문에 모델은 종종 첫 단어의 타임스탬프를 0초 근처에 표시합니다. 해결 방법: 정렬 전에 선행 비음성을 잘라내거나, Silero로 VAD 전처리를 실행하여 실제 음성 시작 위치를 찾으십시오.

중요

--text가 제공되지 않으면 정렬기는 먼저 전체 Qwen3-ASR 전사 패스를 실행한 다음 결과 텍스트를 정렬합니다. 이는 첫 실행 시 ASR 모델과 정렬기 모델을 모두 로드한다는 의미입니다. --text를 제공하면 ASR 단계를 건너뛰고 정렬기만 로드합니다.