फ़ोर्स्ड अलाइनमेंट

Qwen3-ForcedAligner ऑडियो के लिए शब्द-स्तरीय timestamp अलाइनमेंट प्रदान करता है। यह एक non-autoregressive single forward pass करता है ताकि प्रत्येक शब्द को ट्रांसक्रिप्ट में ऑडियो वेवफ़ॉर्म में उसकी सटीक स्थिति से अलाइन कर सके।

यह कैसे काम करता है

अलाइनर LIS (Longest Increasing Subsequence) monotonicity सुधार चरण के साथ CTC (Connectionist Temporal Classification) अलाइनमेंट का उपयोग करता है। यह सुनिश्चित करता है कि timestamps हमेशा क्रम में हों, भले ही raw CTC आउटपुट में मामूली असंगतियाँ हों।

प्रॉपर्टीमान
अलाइनमेंट विधिLIS monotonicity सुधार के साथ CTC
Timestamp resolution80 ms
आउटपुट classes5000
इन्फ़रेंस मोडनॉन-ऑटोरिग्रेसिव (सिंगल फ़ॉरवर्ड पास)

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"

विकल्प

# 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

भाषा समर्थन

ऑडियो की भाषा के अनुसार --language पास करें। मॉडल आधिकारिक रूप से 11 भाषाओं (en, zh, ja, ko, es, fr, de, ru, it, pt, ar) पर प्रशिक्षित है; प्रीप्रोसेसर जापानी मॉर्फीम, कोरियाई शब्द, चीनी वर्ण-दर-वर्ण, और थाई / लाओ / ख़्मेर / बर्मी / तिब्बती को Apple के NLTokenizer के माध्यम से मूल रूप से विभाजित करता है। संयोजी चिह्न (देवनागरी मात्राएँ, थाई स्वर आदि) संरक्षित रहते हैं, ताकि नमस्ते और สวัสดี जैसे शब्द अक्षत बने रहें।

मॉडल वेरिएंट

कई मॉडल वेरिएंट उपलब्ध हैं, जो सटीकता के लिए आकार का व्यापार करते हैं:

वेरिएंटमॉडल IDआकार
MLX 4-bit (डिफ़ॉल्ट)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

--aligner-model के साथ एक वेरिएंट चुनें:

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

आउटपुट फ़ॉर्मैट

अलाइनर प्रति शब्द एक line आउटपुट करता है जिसमें सेकंड में start और end timestamps होते हैं:

[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

प्रत्येक timestamp जोड़ी 80 ms resolution पर ऑडियो में शब्द के start और end समय को इंगित करती है।

लंबे ऑडियो का प्रबंधन

Classify head सिद्धांत रूप में 400 सेकंड तक address कर सकता है (5000 classes × 80 ms), लेकिन shipped Qwen3-ForcedAligner-0.6B मॉडल लगभग 270 सेकंड तक ही reliably trained है। उससे आगे, मॉडल noisy timestamp indices उत्सर्जित करता है और LIS post-processing सभी अंतिम शब्दों को एक ही timestamp पर समेट देती है।

CLI इसे स्वचालित रूप से संभालती है: लंबे ऑडियो को saturation point पर chunked किया जाता है और फिर से align किया जाता है। Chunking सक्रिय होने पर आपको एक-पंक्ति का संदेश दिखाई देगा:

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

Misaligned outputs की जांच करते समय raw और corrected timestamp indices को dump करने के लिए ALIGN_DEBUG=1 set करें।

ज्ञात सीमा: leading non-speech

जब ऑडियो non-speech (music intro, लंबा silence) से शुरू होता है, तो मॉडल अक्सर पहले शब्द को 0 सेकंड के पास stamp करता है क्योंकि classifier के पास "speech अभी शुरू नहीं हुई" की कोई धारणा नहीं है। Workaround: align करने से पहले leading non-speech को trim करें, या वास्तविक speech start खोजने के लिए Silero के साथ VAD pre-pass चलाएं।

महत्वपूर्ण

जब कोई --text प्रदान नहीं किया जाता है, तो अलाइनर पहले एक पूर्ण Qwen3-ASR ट्रांसक्रिप्शन pass चलाता है, फिर परिणामी टेक्स्ट को अलाइन करता है। इसका अर्थ है कि पहला रन ASR मॉडल और अलाइनर मॉडल दोनों को लोड करता है। --text प्रदान करना ASR चरण को छोड़ देता है और केवल अलाइनर लोड करता है।