Views
No views yet


| Model | Supported Languages | Supported Dialects | Inference Mode | Audio Types |
|---|---|---|---|---|
| Qwen/Qwen3-ASR-1.7B-hf & Qwen/Qwen3-ASR-0.6B-hf | Chinese (zh), English (en), Cantonese (yue), Arabic (ar), German (de), French (fr), Spanish (es), Portuguese (pt), Indonesian (id), Italian (it), Korean (ko), Russian (ru), Thai (th), Vietnamese (vi), Japanese (ja), Turkish (tr), Hindi (hi), Malay (ms), Dutch (nl), Swedish (sv), Danish (da), Finnish (fi), Polish (pl), Czech (cs), Filipino (fil), Persian (fa), Greek (el), Hungarian (hu), Macedonian (mk), Romanian (ro) | Anhui, Dongbei, Fujian, Gansu, Guizhou, Hebei, Henan, Hubei, Hunan, Jiangxi, Ningxia, Shandong, Shaanxi, Shanxi, Sichuan, Tianjin, Yunnan, Zhejiang, Cantonese (HK), Cantonese (Guangdong), Wu, Minnan | Offline / Streaming | Speech, Singing Voice, Songs with BGM |
| Qwen/Qwen3-ForcedAligner-0.6B-hf | Chinese, English, Cantonese, French, German, Italian, Japanese, Korean, Portuguese, Russian, Spanish | — | NAR | Speech |
pip install git+https://github.com/huggingface/transformers1import torch
2from transformers import AutoProcessor, AutoModelForMultimodalLM, AutoModelForTokenClassification
3
4asr_model_id = "Qwen/Qwen3-ASR-0.6B-hf"
5aligner_model_id = "Qwen/Qwen3-ForcedAligner-0.6B-hf"
6
7asr_processor = AutoProcessor.from_pretrained(asr_model_id)
8asr_model = AutoModelForMultimodalLM.from_pretrained(asr_model_id, device_map="auto")
9
10aligner_processor = AutoProcessor.from_pretrained(aligner_model_id)
11aligner_model = AutoModelForTokenClassification.from_pretrained(
12 aligner_model_id, dtype=torch.bfloat16, device_map="auto"
13)
14
15audio_url = "https://huggingface.co/datasets/bezzam/audio_samples/resolve/main/librispeech_mr_quilter.wav"
16
17# Step 1: Transcribe
18inputs = asr_processor.apply_transcription_request(audio=audio_url)
19inputs = inputs.to(asr_model.device, asr_model.dtype)
20output_ids = asr_model.generate(**inputs, max_new_tokens=256)
21generated_ids = output_ids[:, inputs["input_ids"].shape[1]:]
22parsed = asr_processor.decode(generated_ids, return_format="parsed")[0]
23transcript = parsed["transcription"]
24language = parsed["language"] or "English"
25
26# Step 2: Prepare alignment inputs
27aligner_inputs, word_lists = aligner_processor.prepare_forced_aligner_inputs(
28 audio=audio_url, transcript=transcript, language=language,
29)
30aligner_inputs = aligner_inputs.to(aligner_model.device, aligner_model.dtype)
31
32# Step 3: Run forced aligner
33with torch.inference_mode():
34 outputs = aligner_model(**aligner_inputs)
35
36# Step 4: Decode timestamps
37timestamps = aligner_processor.decode_forced_alignment(
38 logits=outputs.logits,
39 input_ids=aligner_inputs["input_ids"],
40 word_lists=word_lists,
41 timestamp_token_id=aligner_model.config.timestamp_token_id,
42)[0]
43
44for item in timestamps:
45 print(f"{item['text']:<20} {item['start_time']:>8.3f}s → {item['end_time']:>8.3f}s")
46
47"""
48Word Start (s) End (s)
49------------------------------------------
50Mr 0.560 0.800
51Quilter 0.800 1.280
52is 1.280 1.440
53the 1.440 1.520
54apostle 1.520 2.080
55...
56"""1import torch
2from datasets import Audio, load_dataset
3from transformers import AutoModelForCTC, AutoProcessor, AutoModelForTokenClassification
4
5parakeet_processor = AutoProcessor.from_pretrained("nvidia/parakeet-ctc-1.1b")
6parakeet_model = AutoModelForCTC.from_pretrained(
7 "nvidia/parakeet-ctc-1.1b", dtype="auto", device_map="cuda",
8)
9
10aligner_model_id = "Qwen/Qwen3-ForcedAligner-0.6B-hf"
11aligner_processor = AutoProcessor.from_pretrained(aligner_model_id)
12aligner_model = AutoModelForTokenClassification.from_pretrained(
13 aligner_model_id, dtype=torch.bfloat16, device_map="cuda",
14)
15
16ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
17ds = ds.cast_column("audio", Audio(sampling_rate=parakeet_processor.feature_extractor.sampling_rate))
18audio_arrays = [ds[i]["audio"]["array"] for i in range(3)]
19sr = ds[0]["audio"]["sampling_rate"]
20
21# Batch transcribe with Parakeet
22inputs = parakeet_processor(audio_arrays, sampling_rate=sr, return_tensors="pt", padding=True).to(
23 parakeet_model.device, dtype=parakeet_model.dtype
24)
25with torch.inference_mode():
26 outputs = parakeet_model.generate(**inputs)
27transcripts = parakeet_processor.decode(outputs)
28
29# Batch align with Qwen3 Forced Aligner
30aligner_inputs, word_lists = aligner_processor.prepare_forced_aligner_inputs(
31 audio=audio_arrays, transcript=transcripts, language="English",
32)
33aligner_inputs = aligner_inputs.to(aligner_model.device, aligner_model.dtype)
34
35with torch.inference_mode():
36 aligner_outputs = aligner_model(**aligner_inputs)
37
38batch_timestamps = aligner_processor.decode_forced_alignment(
39 logits=aligner_outputs.logits,
40 input_ids=aligner_inputs["input_ids"],
41 word_lists=word_lists,
42 timestamp_token_id=aligner_model.config.timestamp_token_id,
43)
44
45for i, (transcript, timestamps) in enumerate(zip(transcripts, batch_timestamps)):
46 print(f"\n[Sample {i}] {transcript}")
47 for item in timestamps[:5]:
48 print(f" {item['text']:<20} {item['start_time']:>8.3f}s → {item['end_time']:>8.3f}s")
49 if len(timestamps) > 5:
50 print(f" ... ({len(timestamps) - 5} more words)")torch.compile because it runs a single forward pass with no autoregressive decoding. This makes it ideal for bulk audio timestamping: transcribe with any ASR model, then batch-align with the compiled forced aligner for maximum throughput.1import torch
2from transformers import AutoProcessor, AutoModelForTokenClassification
3
4model_id = "Qwen/Qwen3-ForcedAligner-0.6B-hf"
5num_warmup = 5
6batch_size = 4
7
8processor = AutoProcessor.from_pretrained(model_id)
9model = AutoModelForTokenClassification.from_pretrained(model_id, dtype=torch.bfloat16).to("cuda")
10
11audio_url = "https://huggingface.co/datasets/bezzam/audio_samples/resolve/main/librispeech_mr_quilter.wav"
12transcript = "Mr. Quilter is the apostle of the middle classes."
13
14aligner_inputs, word_lists = processor.prepare_forced_aligner_inputs(
15 audio=[audio_url] * batch_size,
16 transcript=[transcript] * batch_size,
17 language=["English"] * batch_size,
18)
19aligner_inputs = aligner_inputs.to("cuda", torch.bfloat16)
20
21model.forward = torch.compile(model.forward)
22
23# Warmup
24with torch.no_grad():
25 for _ in range(num_warmup):
26 _ = model(**aligner_inputs)
27
28# Inference
29with torch.no_grad():
30 outputs = model(**aligner_inputs)1@article{Qwen3-ASR,
2 title={Qwen3-ASR Technical Report},
3 author={Xian Shi, Xiong Wang, Zhifang Guo, Yongqi Wang, Pei Zhang, Xinyu Zhang, Zishan Guo,
4 Hongkun Hao, Yu Xi, Baosong Yang, Jin Xu, Jingren Zhou, Junyang Lin},
5 journal={arXiv preprint arXiv:2601.21337},
6 year={2026}
7}