typhoon-asr-qwen-1.7b-ctx
Thai ASR with prompt-based contextual biasing: a LoRA fine-tune (merged,
2.07B params) of Qwen/Qwen3-ASR-1.7B-hf
that accepts a list of names/terms in the system prompt, boosts the ones that
are actually spoken, writes them with the listed spelling, and ignores the
rest (distractor false alarm rate ≤.0004; non-speech probe 5/5). The strongest CER under biasing of every system measured below.
Results
Plain transcription (CER%, same protocol: gigaspeech2 bench in-domain / TVSpeech out-of-domain 30-s talk-show):
| model | params | gigaspeech2 CER ↓ | TVSpeech CER ↓ |
|---|---|---|---|
| typhoon-asr-qwen-1.7b-ctx | 2.07B | 4.86 | 6.87 |
| typhoon-asr-qwen-0.6b-ctx | 0.80B | 5.06† | 7.28 |
| Qwen3-ASR-1.7B (original) | 2.07B | 6.09 | 10.63 |
| Qwen3-ASR-0.6B (original) | 0.80B | 8.20 | 11.45 |
| typhoon-whisper-large-v3 | 1.55B | 4.69 | 6.32 |
| typhoon-whisper-medium | 769M | 4.81 | 7.66 |
| typhoon-asr-realtime-nemo-ctc | 135M | 8.54 | 13.46 |
| typhoon-asr-realtime (RNN-T) | 109M | 6.89 | 9.92 |
| nectec/Pathumma-whisper-th-large-v3 | 1.55B | 5.84 | 10.36 |
| biodatlab/whisper-th-large-v3-combined | 1.55B | 15.78† | 14.91 |
† single-digit repetition-loop utterances dominate (0.6b: one utt; Thonburian: three, excluding them 8.39).
Contextual biasing — vs every route we measured
Same benchmark (wayu-ai/thai-contextasr-bench), same frozen scorer. Cells = CER% ↓ / entity recall ↑. Whisper models take the list as a decoder prompt (zero-shot); the two typhoon-qwen models are LoRA fine-tunes; typhoon-asr-realtime-nemo-ctc spots-and-splices at decode time.
| typhoon-asr-qwen-1.7b-ctx | typhoon-asr-qwen-0.6b-ctx | typhoon-asr-realtime-nemo-ctc | typhoon-whisper-medium (ctx) | typhoon-whisper-large-v3 | nectec/Pathumma-whisper-th-large-v3 | biodatlab/whisper-th-large-v3-combined | Qwen3-ASR-1.7B (original) | |
|---|---|---|---|---|---|---|---|---|
| params | 2.07B | 0.80B | 135M | 769M | 1.55B | 1.55B | 1.55B | 2.07B |
| none (baseline) | 5.11 / .441 | 5.71 / .397 | 9.56 / .158 | 7.05 / .383 | 4.83 / .459 | 5.23 / .416 | 5.68 / .482 | 5.25 / .396 |
| bias@0 (gold) | 3.39 / .754 | 4.01 / .668 | 5.97 / .852 | 4.92 / .658 | N/A | 3.40 / .823 | 6.37 / .842 | 4.48 / .644 |
| bias@10 | 4.02 / .717 | 4.91 / .607 | 7.07 / .849 | 8.09 / .597 | N/A | 6.01 / .772 | 8.72 / .783 | 5.97 / .603 |
| bias@50 | 4.30 / .640 | 5.25 / .530 | 7.51 / .839 | N/A | N/A | N/A | N/A | 6.71 / .522 |
| bias@500 | 4.98 / .483 | 5.96 / .411 | 11.12 / .757 | N/A | N/A | N/A | N/A | 5.87 / .413 |
| distractor false alarms ↓ | ≤.0004 | ≤.0004 | .003–.006 | .003 | — | .0003 | .0033 | .0125 |
N/A: typhoon-whisper-large-v3's prompt pathway collapses on any list (echo loops, CER 200+); the whisper fine-tunes cannot take lists beyond ~10–15 entries because Whisper's 448-token decoder window is shared between the prompt and the transcript. Only the typhoon-qwen pair and the typhoon-asr-realtime-nemo-ctc spotter survive large lists.
Usage
import torch, soundfile as sf
from transformers import AutoModelForMultimodalLM, AutoProcessor # transformers>=5.13
mid = "typhoon-ai/typhoon-asr-qwen-1.7b-ctx"
processor = AutoProcessor.from_pretrained(mid)
model = AutoModelForMultimodalLM.from_pretrained(mid, dtype=torch.bfloat16,
device_map="cuda").eval()
audio, sr = sf.read("clip.wav", dtype="float32") # 16 kHz mono
def transcribe(system_text):
msgs = [{"role": "system", "content": [{"type": "text", "text": system_text}]},
{"role": "user", "content": [{"type": "audio", "audio": audio}]}]
inputs = processor.apply_chat_template([msgs], tokenize=True,
add_generation_prompt=True, return_dict=True, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=440)
out = out[:, inputs["input_ids"].shape[1]:]
return processor.decode(out, return_format="transcription_only")[0].strip()
print(transcribe("Thai")) # plain ASR
print(transcribe("วโรรส Facebook ก้าวไกล\nThai")) # with a bias list
Prompt format is strict: the system message is the space-joined bias list,
then Thai on its own line — or just Thai with no list. Recall decays
gracefully with list length; ≤50 entries is the sweet spot.
License & attribution
Apache-2.0 — LoRA-merged weights of
Qwen/Qwen3-ASR-1.7B-hf
(Apache-2.0). Trained on ~10,800 hours of Thai speech (GigaSpeech2-th); see
the Typhoon ASR Real-time technical report.
Acknowledgements
We thank Kunat Pipatanakul and Potsawee Manakul (wayu-ai) for their valuable feedback.
- Downloads last month
- 1,205
Model tree for typhoon-ai/typhoon-asr-qwen-1.7b-ctx
Base model
Qwen/Qwen3-ASR-1.7B-hf