Qwen · HF · 通义

Qwen3-ForcedAligner-0.6B-hf

Qwen3-ForcedAligner-0.6B-hf

二〇二六年八月二十六日 · 英文原文

Qwen团队发布Qwen3-ASR系列,包含1.7B和0.6B两个版本,支持52种语言和方言的语种识别与ASR。1.7B版本在开源ASR模型中达到SOTA性能。同时推出Qwen3-ForcedAligner-0.6B,支持11种语言、最长5分钟语音的任意单元时间戳预测,在准确率上超越基于E2E的强制对齐模型。该模型可与Qwen3-ASR或其他ASR系统配合使用,并支持torch.compile加速,在A100上batch size为4时获得约2.5倍加速。

Qwen3-ForcedAligner(原生 Transformers)

概述

Qwen3-ASR 系列包含 Qwen3-ASR-1.7BQwen3-ASR-0.6B,支持 52 种语言和方言的语种识别与 ASR。两者均利用大规模语音训练数据及其基础模型 Qwen3-Omni 强大的音频理解能力。1.7B 版本在开源 ASR 模型中达到了 SOTA 性能,并与最强的专有商业 API 具有竞争力。

主要特性:

模型架构

可用检查点

模型 支持语言 支持方言 推理模式 音频类型
Qwen/Qwen3-ASR-1.7B-hfQwen/Qwen3-ASR-0.6B-hf 中文 (zh)、英语 (en)、粤语 (yue)、阿拉伯语 (ar)、德语 (de)、法语 (fr)、西班牙语 (es)、葡萄牙语 (pt)、印尼语 (id)、意大利语 (it)、韩语 (ko)、俄语 (ru)、泰语 (th)、越南语 (vi)、日语 (ja)、土耳其语 (tr)、印地语 (hi)、马来语 (ms)、荷兰语 (nl)、瑞典语 (sv)、丹麦语 (da)、芬兰语 (fi)、波兰语 (pl)、捷克语 (cs)、菲律宾语 (fil)、波斯语 (fa)、希腊语 (el)、匈牙利语 (hu)、马其顿语 (mk)、罗马尼亚语 (ro) 安徽、东北、福建、甘肃、贵州、河北、河南、湖北、湖南、江西、宁夏、山东、陕西、山西、四川、天津、云南、浙江、粤语(香港)、粤语(广东)、吴语、闽南语 离线 / 流式 语音、歌声、带背景音乐歌曲
Qwen/Qwen3-ForcedAligner-0.6B-hf 中文、英语、粤语、法语、德语、意大利语、日语、韩语、葡萄牙语、俄语、西班牙语 NAR 语音

环境配置

在 Qwen3-ForcedAligner 成为官方 Transformers 版本的一部分之前,请从源码安装:

pip install git+https://github.com/huggingface/transformers

使用方法

与 Qwen3-ASR 配合使用

先用 ASR 模型进行转录,然后将转录文本和音频传递给强制对齐器。

import torch
from transformers import AutoProcessor, AutoModelForMultimodalLM, AutoModelForTokenClassification

asr_model_id = "Qwen/Qwen3-ASR-0.6B-hf"
aligner_model_id = "Qwen/Qwen3-ForcedAligner-0.6B-hf"

asr_processor = AutoProcessor.from_pretrained(asr_model_id)
asr_model = AutoModelForMultimodalLM.from_pretrained(asr_model_id, device_map="auto")

aligner_processor = AutoProcessor.from_pretrained(aligner_model_id)
aligner_model = AutoModelForTokenClassification.from_pretrained(
    aligner_model_id, dtype=torch.bfloat16, device_map="auto"
)

audio_url = "https://huggingface.co/datasets/bezzam/audio_samples/resolve/main/librispeech_mr_quilter.wav"

# 第1步:转录
inputs = asr_processor.apply_transcription_request(audio=audio_url)
inputs = inputs.to(asr_model.device, asr_model.dtype)
output_ids = asr_model.generate(**inputs, max_new_tokens=256)
generated_ids = output_ids[:, inputs["input_ids"].shape[1]:]
parsed = asr_processor.decode(generated_ids, return_format="parsed")[0]
transcript = parsed["transcription"]
language = parsed["language"] or "English"

# 第2步:准备对齐输入
aligner_inputs, word_lists = aligner_processor.prepare_forced_aligner_inputs(
    audio=audio_url, transcript=transcript, language=language,
)
aligner_inputs = aligner_inputs.to(aligner_model.device, aligner_model.dtype)

# 第3步:运行强制对齐器
with torch.inference_mode():
    outputs = aligner_model(**aligner_inputs)

# 第4步:解码时间戳
timestamps = aligner_processor.decode_forced_alignment(
    logits=outputs.logits,
    input_ids=aligner_inputs["input_ids"],
    word_lists=word_lists,
    timestamp_token_id=aligner_model.config.timestamp_token_id,
)[0]

for item in timestamps:
    print(f"{item['text']:<20} {item['start_time']:>8.3f}s → {item['end_time']:>8.3f}s")

"""
Word                  Start (s)    End (s)
------------------------------------------
Mr                        0.560      0.800
Quilter                   0.800      1.280
is                        1.280      1.440
the                       1.440      1.520
apostle                   1.520      2.080
...
"""

与其他 ASR 模型配合使用

强制对齐器接受来自任何 ASR 系统的转录文本。以下是使用 NVIDIA Parakeet CTC 进行转录的批量推理示例。

import torch
from datasets import Audio, load_dataset
from transformers import AutoModelForCTC, AutoProcessor, AutoModelForTokenClassification

parakeet_processor = AutoProcessor.from_pretrained("nvidia/parakeet-ctc-1.1b")
parakeet_model = AutoModelForCTC.from_pretrained(
    "nvidia/parakeet-ctc-1.1b", dtype="auto", device_map="cuda",
)

aligner_model_id = "Qwen/Qwen3-ForcedAligner-0.6B-hf"
aligner_processor = AutoProcessor.from_pretrained(aligner_model_id)
aligner_model = AutoModelForTokenClassification.from_pretrained(
    aligner_model_id, dtype=torch.bfloat16, device_map="cuda",
)

ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
ds = ds.cast_column("audio", Audio(sampling_rate=parakeet_processor.feature_extractor.sampling_rate))
audio_arrays = [ds[i]["audio"]["array"] for i in range(3)]
sr = ds[0]["audio"]["sampling_rate"]

# 使用 Parakeet 批量转录
inputs = parakeet_processor(audio_arrays, sampling_rate=sr, return_tensors="pt", padding=True).to(
    parakeet_model.device, dtype=parakeet_model.dtype
)
with torch.inference_mode():
    outputs = parakeet_model.generate(**inputs)
transcripts = parakeet_processor.decode(outputs)

# 使用 Qwen3 Forced Aligner 批量对齐
aligner_inputs, word_lists = aligner_processor.prepare_forced_aligner_inputs(
    audio=audio_arrays, transcript=transcripts, language="English",
)
aligner_inputs = aligner_inputs.to(aligner_model.device, aligner_model.dtype)

with torch.inference_mode():
    aligner_outputs = aligner_model(**aligner_inputs)

batch_timestamps = aligner_processor.decode_forced_alignment(
    logits=aligner_outputs.logits,
    input_ids=aligner_inputs["input_ids"],
    word_lists=word_lists,
    timestamp_token_id=aligner_model.config.timestamp_token_id,
)

for i, (transcript, timestamps) in enumerate(zip(transcripts, batch_timestamps)):
    print(f"\n[Sample {i}] {transcript}")
    for item in timestamps[:5]:
        print(f"  {item['text']:<20} {item['start_time']:>8.3f}s → {item['end_time']:>8.3f}s")
    if len(timestamps) > 5:
        print(f"  ... ({len(timestamps) - 5} more words)")

速度与内存优化

Torch compile

强制对齐器特别适合 torch.compile,因为它只执行一次前向传播,无需自回归解码。这使得它非常适合批量音频时间戳标注:使用任意 ASR 模型转录,然后使用编译后的强制对齐器进行批量对齐,以获得最大吞吐量。

在 A100 上,我们观察到 batch size 为 4 时加速约 2.5 倍(基准测试脚本)。

import torch
from transformers import AutoProcessor, AutoModelForTokenClassification

model_id = "Qwen/Qwen3-ForcedAligner-0.6B-hf"
num_warmup = 5
batch_size = 4

processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForTokenClassification.from_pretrained(model_id, dtype=torch.bfloat16).to("cuda")

audio_url = "https://huggingface.co/datasets/bezzam/audio_samples/resolve/main/librispeech_mr_quilter.wav"
transcript = "Mr. Quilter is the apostle of the middle classes."

aligner_inputs, word_lists = processor.prepare_forced_aligner_inputs(
    audio=[audio_url] * batch_size,
    transcript=[transcript] * batch_size,
    language=["English"] * batch_size,
)
aligner_inputs = aligner_inputs.to("cuda", torch.bfloat16)

model.forward = torch.compile(model.forward)

# 预热
with torch.no_grad():
    for _ in range(num_warmup):
        _ = model(**aligner_inputs)

# 推理
with torch.no_grad():
    outputs = model(**aligner_inputs)

引用

@article{Qwen3-ASR,
  title={Qwen3-ASR Technical Report},
  author={Xian Shi, Xiong Wang, Zhifang Guo, Yongqi Wang, Pei Zhang, Xinyu Zhang, Zishan Guo,
          Hongkun Hao, Yu Xi, Baosong Yang, Jin Xu, Jingren Zhou, Junyang Lin},
  journal={arXiv preprint arXiv:2601.21337},
  year={2026}
}
译自 Qwen · HF · 通义 · 录于 二〇二六年八月二十六日