Downloads · 30 days
0
kyle/vietnamese-lalm-asr-lora
vietnamese-lalm-asr-lora is a automatic speech recognition model from kyle. Use it when you need speech turned into text. It is set up for nemo. The card lists the license as apache-2.0.
A Large Audio Language Model (LALM) for Vietnamese speech-to-text, built the cheapest way possible: bolt a frozen audio encoder onto a small frozen LLM through a thin trainable projector, then unlock the LLM a little…
Downloads · 30 days
0
Access
Public
Updated Jul 13, 2026
Repo size
32.5 MB
Likes
0
Public
Click a slice to open those files.
.pt32.5 MB · 100%
From the Hugging Face model README
A Large Audio Language Model (LALM) for Vietnamese speech-to-text, built the cheapest way possible: bolt a frozen audio encoder onto a small frozen LLM through a thin trainable projector, then unlock the LLM a little at a time with LoRA.
This repository releases the LoRA + projector adapter (~31 MB) plus a detailed write-up of the training journey, the problems hit, and the measured results. It is primarily a documentation / archival release — see Intended use & limitations below.
Tóm tắt (VI): Model ghép audio encoder (FastConformer, đóng băng) + LLM nhỏ (Sailor 0.5B, đóng băng) qua một projector tuyến tính, rồi mở khóa LLM bằng LoRA. Repo này chia sẻ **adapter
- kinh nghiệm + kết quả** của quá trình fine-tune ba nấc. Chi tiết số liệu ở phần Results.
| Task | Vietnamese automatic speech recognition (with English code-switch and spoken-digit robustness) |
| Architecture | 3-block SALM: audio encoder → projector → decoder LLM |
| Audio encoder | FastConformer, 108.8M params, frozen (in-house Vietnamese fine-tune) |
| Decoder LLM | Sailor-0.5B-Chat (Qwen2, 24 layers, hidden 1024, vocab 151936), frozen |
| Projector | Linear 512 → 1024, 0.53M params, trained from scratch |
| Trained params | LoRA (r=16) on 7 projections × 24 layers + projector = 8.1M / 736.5M ≈ 1.1% |
| Framework | NVIDIA NeMo speechlm2 (SALM) |
The only trainable weights are the projector and the LoRA matrices. The encoder and the LLM
(including its embedding and lm_head) stay frozen — the LLM's 151936-token vocabulary already
covers both Vietnamese and English, which is exactly what a closed-vocabulary CTC/transducer
decoder cannot do.
adapter.pt) + a full engineering write-up. It is
meant for people studying how to stand up an X-LM (audio/vision/video encoder + LLM) on a
small compute budget, and for archiving the exact weights behind the numbers below.speechlm2. The frozen encoder checkpoint is
not released here, so this release does not reproduce end-to-end inference on its own.Audio 16 kHz mono
→ Preprocessor (mel-80, 25 ms window / 10 ms hop)
→ FastConformer encoder (frozen) — subsampling ×8, 1 frame ≈ 80 ms, 512-dim
→ Projector 512 → 1024 (trainable)
→ Sailor LLM (frozen + LoRA) — audio vectors spliced into a fixed text prompt
→ Transcript tokens
Input is audio plus a fixed text prompt containing an audio-locator tag; the projected audio vectors replace that tag inside the prompt, so the task can be changed by editing the prompt rather than the architecture. A 10-second utterance becomes ~126 audio frames fed to the LLM.
The guiding principle: unlock parameters in order of return on compute. Align the projector before letting gradients touch the LLM; open the LLM with ~1% LoRA before considering anything deeper.
q/k/v/o_proj, gate/up/down_proj). WER drops 2–4× on every set;
English code-switch recall jumps thanks to the LLM's open vocab. Two weaknesses surface:
spoken-digit recall regresses, and the model ignores context-biasing prompts.Optimizer: AdamW, LoRA lr 1e-4, projector lr 2e-4, weight decay 1e-3, cosine schedule with
warmup, batch 16, warm-started between rounds. Because the streaming (lhotse iterable) data has no
declared length, all control is by step, not epoch — stop by max_steps, validate by
integer val_check_interval, and checkpoint the adapter every N steps.
This adapter is the v3 round checkpoint (a full run of the stage-3 curriculum with the enlarged data mix).
Word Error Rate (%, lower is better) on public Vietnamese benchmarks. LALM and external baselines are measured on the first 300 utterances per set; the in-house transducer (s7) is measured on the full suite, so gaps under ~1 point should not be read as real differences.
| model | vivos | bud500 | cv | fleurs | fosd | lsvsc | vlsp | vietmed | vss | digit_eval |
|---|---|---|---|---|---|---|---|---|---|---|
| Stage 1 (projector only) | 27.56 | 26.12 | 44.36 | 54.07 | 41.74 | 52.23 | 71.25 | — | — | — |
| Stage 2 (LoRA) | 9.89 | 10.36 | 21.64 | 18.42 | 20.41 | 14.51 | 30.52 | 26.10 | 16.52 | 22.51 |
| Stage 3 (patched) | 7.90 | 8.01 | 18.70 | 15.35 | 17.59 | 12.04 | 26.54 | 23.89 | 13.31 | 12.23 |
| This adapter (v3) | 6.78 | 5.51 | 17.18 | 14.58 | 15.73 | 10.89 | 24.79 | 20.91 | 11.97 | 9.00 |
| s7 transducer 114M (ref) | 9.23 | 6.92 | 18.03 | 15.81 | 17.95 | 12.25 | 24.83 | — | — | — |
| Qwen3-ASR-0.6B | 8.48 | 6.83 | 16.55 | 9.14 | 13.27 | 11.35 | 18.60 | 22.24 | 33.07 | 12.85 |
| parakeet-ctc-0.6b-vi | 6.59 | 7.95 | 10.73 | 12.15 | 8.91 | 10.24 | 16.06 | 23.28 | 26.72 | 7.66 |
| chunkformer-large-vie | 2.78 | 4.82 | 8.39 | 10.42 | 5.21 | 5.98 | 9.98 | 15.73 | 12.42 | 8.23 |
Specialized recall (%, higher is better) — English code-switch terms and spoken digits:
| model | CS-recall (seen terms) | CS-recall (unseen terms) | digit-recall |
|---|---|---|---|
| This adapter (v3) | 52.10 | 15.38 | 90.68 |
| — with oracle term hint | — | 38.46 | — |
| s7 transducer (closed vocab) | 26.74 | 12.53 | — |
| Qwen3-ASR-0.6B | 30.17 | 31.66 | 86.74 |
| chunkformer-large-vie (closed vocab) | 11.38 | 6.59 | 93.99 |
Reading the numbers:
step, not epoch, for any length-less streaming data pipeline.adapter.pt — the trained adapter (~31 MB): projector weights + LoRA matrices for the frozen
Sailor-0.5B-Chat LLM. Load into a NeMo speechlm2 SALM whose encoder is the frozen FastConformer
and whose LLM is sail/Sailor-0.5B-Chat.README.md — this card.speechlm2.Released under Apache-2.0 (matching the Sailor base and NeMo framework). The adapter weights are the authors' own contribution.