Views
No views yet
TL;DR ARK-ASR-3B is a multilingual automatic speech recognition model. It achieves current state-of-the-art results on the Hugging Face Open ASR Leaderboard English short-form benchmark, with an average WER of 5.04% and RTFx of 490.98 across AMI, Earnings22, GigaSpeech, LibriSpeech, SPGISpeech, and VoxPopuli. The accompanying training, inference, and evaluation code is available at AutoArk/open-audio-opd.
arkasr remote code.
arkasr remote codesafetensorsscripts/infer/ark_asr_transformers.pyscripts/vllm/ark_asr_vllmtrust_remote_code=True. The official inference script handles the processor, tokenizer, audio prompt format, generation cleanup, and ASR token filtering.| Model | AMI | Earnings22 | GigaSpeech | LS Clean | LS Other | SPGISpeech | VoxPopuli | Avg |
|---|---|---|---|---|---|---|---|---|
| ARK-ASR-3B | 8.79% | 8.23% | 6.98% | 1.03% | 2.35% | 2.46% | 5.47% | 5.04% |
| ARK-ASR-0.6B | 10.02% | 9.77% | 8.00% | 1.53% | 3.51% | 2.63% | 6.31% | 5.97% |
| Model | AISHELL-1 | WenetSpeech test meeting | WenetSpeech test-net |
|---|---|---|---|
| ARK-ASR-3B | 1.80% | 4.97% | 4.58% |
| ARK-ASR-0.6B | 2.02% | 5.92% | 4.96% |
1import torch
2from transformers import AutoModelForCausalLM, AutoProcessor, AutoTokenizer
3
4model_path = "AutoArk-AI/ARK-ASR-3B"
5audio_path = "assets/libai.wav"
6
7device = "cuda" if torch.cuda.is_available() else "cpu"
8torch_dtype = torch.bfloat16 if device == "cuda" else torch.float32
9
10processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)
11tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
12model = AutoModelForCausalLM.from_pretrained(
13 model_path,
14 trust_remote_code=True,
15 torch_dtype=torch_dtype,
16 attn_implementation="sdpa",
17).to(device)
18model.eval()
19
20
21def build_bad_words_ids(tokenizer):
22 eos_ids = tokenizer.eos_token_id
23 keep_ids = {eos_ids} if isinstance(eos_ids, int) else set(eos_ids or [])
24 bad_ids = set(tokenizer.all_special_ids) - keep_ids
25 bad_ids.update(
26 token_id
27 for token, token_id in tokenizer.get_added_vocab().items()
28 if token.startswith("<") and token.endswith(">") and token_id not in keep_ids
29 )
30 return [[token_id] for token_id in sorted(bad_ids)]
31
32conversation = [
33 {
34 "role": "user",
35 "content": [
36 {"type": "audio", "path": audio_path},
37 {"type": "text", "text": "Please transcribe this audio."},
38 ],
39 }
40]
41
42inputs = processor.apply_chat_template(
43 conversation,
44 add_generation_prompt=True,
45 return_tensors="pt",
46 sampling_rate=16000,
47 audio_padding="longest",
48 text_kwargs={"padding": "longest"},
49 audio_max_length=30 * 16000,
50)
51inputs = inputs.to(device)
52if "audios" in inputs:
53 inputs["audios"] = inputs["audios"].to(dtype=torch_dtype)
54
55bad_words_ids = build_bad_words_ids(tokenizer)
56with torch.inference_mode():
57 outputs = model.generate(
58 **inputs,
59 do_sample=False,
60 max_new_tokens=256,
61 pad_token_id=tokenizer.pad_token_id,
62 eos_token_id=tokenizer.eos_token_id,
63 bad_words_ids=bad_words_ids,
64 )
65decoded_outputs = tokenizer.batch_decode(
66 outputs[:, inputs.input_ids.shape[1] :],
67 skip_special_tokens=True,
68)
69print(decoded_outputs)1git clone https://github.com/AutoArk/open-audio-opd
2cd open-audio-opd
3pip install -e .{"audio":"/path/to/audio.wav","text":"","task":"asr","begin_time":-1,"end_time":-1}1python scripts/infer/ark_asr_transformers.py \
2 --input /path/to/input.jsonl \
3 --output runs/infer/predictions.jsonl \
4 --model_path AutoArk-AI/ARK-ASR-3B \
5 --processor_path AutoArk-AI/ARK-ASR-3B \
6 --batch_size 40 \
7 --dtype bfloat16 \
8 --attn_impl sdpapred_text: cleaned prediction text for downstream evaluationpred_text_raw: raw decoded generation before cleanupscripts/vllm/ark_asr_vllm.
The service exposes both a compact /asr endpoint and an OpenAI-style
/v1/audio/transcriptions endpoint.1git clone https://github.com/AutoArk/open-audio-opd
2cd open-audio-opd
3pip install -e ".[vllm]"1MODEL=AutoArk-AI/ARK-ASR-3B \
2GPU=0 \
3PORT=8025 \
4scripts/vllm/deploy_ark_asr_vllm_service.sh start1scripts/vllm/deploy_ark_asr_vllm_service.sh status
2curl -sS http://127.0.0.1:8025/health
3curl -sS http://127.0.0.1:8025/token-mask1curl -sS -X POST http://127.0.0.1:8025/asr \
2 -F file=@/path/to/audio.wav \
3 -F max_new_tokens=2561curl -sS -X POST http://127.0.0.1:8025/v1/audio/transcriptions \
2 -F file=@/path/to/audio.wav \
3 -F model=ark-asrscripts/vllm/deploy_ark_asr_vllm_service.sh stoparkasr model, loads the local
processor/tokenizer with trust_remote_code=True, applies generation-time
token masking for non-ASR control tokens, and keeps <|im_end|> as the stop
token. Service logs and PID files are written under runs/vllm/.open_asr_leaderboard
evaluation code.1python scripts/eval/eval_jwer_ark_asr_transformers.py \
2 --input /path/to/test.jsonl \
3 --output runs/eval/result.jsonl \
4 --model_path AutoArk-AI/ARK-ASR-3B \
5 --processor_path AutoArk-AI/ARK-ASR-3B \
6 --batch_size 40 \
7 --dtype bfloat16 \
8 --attn_impl sdpa1@misc{lin2026dataefficientopd,
2 title={Data-Efficient On-Policy Distillation for Automatic Speech Recognition},
3 author={Lin, Yu and Wang, Yiming and Cai, Runyuan and Zeng, Xiaodong},
4 year={2026},
5 eprint={2605.28139},
6 archivePrefix={arXiv},
7 primaryClass={cs.AI},
8 url={https://arxiv.org/abs/2605.28139}
9}