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.

Recall and CER vs bias-list size across systems

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
Safetensors
Model size
2B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for typhoon-ai/typhoon-asr-qwen-1.7b-ctx

Finetuned
(14)
this model

Space using typhoon-ai/typhoon-asr-qwen-1.7b-ctx 1

Collection including typhoon-ai/typhoon-asr-qwen-1.7b-ctx

Paper for typhoon-ai/typhoon-asr-qwen-1.7b-ctx