BA-Lang - Spoken Language Identification checkpoints
Checkpoints for spoken language identification (LID): a self-supervised speech backbone, pooled with MHFA (Multi-Head Factorized Attention) and scored with either a standard cosine-softmax classifier or BA-LR (Binary Attribute Likelihood Ratio), a Bernoulli classifier over a learned binary attribute embedding.
- Training code / recipe: [https://github.com/AMIAD-Research/BA-Lang]
- BA-LR / BA-Lang model: Y. Jelassi et al., "Reconnaissance de la langue parlΓ©e explicable avec BA-LR", JEP 2026 β isca-archive.org/jep_2026/jelassi26_jep.html
Architecture
raw audio (16 kHz)
β
βΌ
SSL backbone (MMS-1B or wav2vec2-XLS-R)
β
βΌ
Multi-Head Factorized Attentive pooling (MHFA)
β
βΌ
classification head
ββ Linear, or
ββ BA-Lang: binary encoder β per-class Bernoulli log-likelihood
β
βΌ
language logits
Checkpoints
| File | Backbone | Corpus | Languages | Head | Step | Val. accuracy | Size |
|---|---|---|---|---|---|---|---|
MMS-Fleurs-step-010360-val_classif_acc-0.9168118238449097.ckpt |
MMS-1B | FLEURS | 102 | Linear | 10360 | 91.68% | 3.86 GB |
MMS-Fleurs-e2e-balang-stepstep-008856-val_classif_acc-0.9167537689208984.ckpt |
MMS-1B | FLEURS | 102 | BA-Lang (e2e) | 8856 | 91.68% | 3.87 GB |
MMS-Fleurs-e2e-balang-MIR-rho-0.95-step-032472-val_classif_acc-0.90935212373733...ckpt |
MMS-1B | FLEURS | 102 | BA-Lang (e2e) + Matryoshka-inspired regularization, Ο=0.95 | 32472 | 90.94% | 3.87 GB |
MMS-Fleurs-e2e-balang-ND-rho-0.857-step-047232-val_classif_acc-0.89306861162185...ckpt |
MMS-1B | FLEURS | 102 | BA-Lang (e2e) + Nested Dropout, Ο=0.857 | 47232 | 89.31% | 3.87 GB |
MMS-Tidylang-step-008533-val_classif_acc-0.9778640866279602.ckpt |
MMS-1B | Tidylang | 35 | Linear | 8533 | 97.79% | 3.86 GB |
MMS-Tidylang-e2e-balang-step-005565-val_classif_acc-0.9929152131080627.ckpt |
MMS-1B | Tidylang | 35 | BA-Lang (e2e) | 5565 | 99.29% | 3.87 GB |
XLSR-Fleurs-step-005904-val_classif_acc-0.8094159960746765.ckpt |
wav2vec2-XLS-R | FLEURS | 102 | Linear | 5904 | 80.94% | 1.27 GB |
XLSR-Fleurs-e2e-balang-step-047232-val_classif_acc-0.8120864033699036.ckpt |
wav2vec2-XLS-R | FLEURS | 102 | BA-Lang (e2e) | 47232 | 81.21% | 1.27 GB |
XLSR-Tidylang-step-008904-val_classif_acc-0.9662737846374512.ckpt |
wav2vec2-XLS-R | Tidylang | 35 | Linear | 8904 | 96.63% | 1.27 GB |
XLSR-Tidylang-e2e-balang-step-032648-val_classif_acc-0.9860262870788574...ckpt |
wav2vec2-XLS-R | Tidylang | 35 | BA-Lang (e2e) | 32648 | 98.60% | 1.27 GB |
Datasets
Training is done separately on two corpora β pick the checkpoint matching the languages you need.
- FLEURS (102
languages, ISO 639-3):
afr, amh, ara, asm, ast, aze, bel, ben, bos, bul, cat, ceb, ces, ckb, cmn, cym, dan, deu, ell, eng, est, fas, fil, fin, fra, ful, gle, glg, guj, hau, heb, hin, hrv, hun, hye, ibo, ind, isl, ita, jav, jpn, kam, kan, kat, kaz, kea, khm, kir, kor, lao, lav, lin, lit, ltz, lug, luo, mal, mar, mkd, mlt, mon, mri, msa, mya, nep, nld, nob, nso, nya, oci, ori, orm, pan, pol, por, pus, ron, rus, slk, slv, sna, snd, som, spa, srp, swa, swe, tam, tel, tgk, tha, tur, ukr, umb, urd, uzb, vie, wol, xho, yor, yue, zul. - Tidylang (35 languages):
TidyVoiceX_ASV(train/dev) andTidyVoiceX2_ASV(eval), from Mozilla Data Collective (train/dev, eval):ara, bak, bel, ben, bul, cat, chv, cym, deu, div, ell, eng, fas, fra, hin, hye, jpn, kat, lit, lug, mal, mar, nld, ori, pol, por, rus, tam, tha, tuk, tur, uig, uzb, yue, zho.
import yaml
lang_list = yaml.safe_load(open("configs/data/fleurs.yaml"))["language_list"]
# or configs/data/tidylang.yaml for the Tidylang checkpoints
Quickstart β inference on your own audio
git clone https://github.com/AMIAD-Research/BA-Lang
cd BA-Lang
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pip install huggingface_hub
python -c "
from huggingface_hub import hf_hub_download
hf_hub_download(
repo_id='yjelassi/BA-Lang',
filename='MMS-Fleurs-e2e-balang-stepstep-008856-val_classif_acc-0.9167537689208984.ckpt',
local_dir='.',
)
"
Then, on a single audio file (no manifest needed β this loads the checkpoint directly and runs one forward pass):
import torch
import torchaudio
import yaml
from balr_lid.models.lid_model import LanguageIdentificationModel
CHECKPOINT = "MMS-Fleurs-e2e-balang-stepstep-008856-val_classif_acc-0.9167537689208984.ckpt"
LANGUAGES = yaml.safe_load(open("configs/data/fleurs.yaml"))["language_list"]
model = LanguageIdentificationModel.load_from_checkpoint(
CHECKPOINT, map_location="cpu", weights_only=False
)
model.eval()
waveform, sr = torchaudio.load("my_audio.wav")
if waveform.shape[0] > 1:
waveform = waveform.mean(dim=0, keepdim=True)
if sr != 16000:
waveform = torchaudio.functional.resample(waveform, sr, 16000)
with torch.no_grad():
out = model(waveform)
probs = out["logits"].softmax(dim=-1)[0]
top5 = probs.topk(5)
for score, idx in zip(top5.values, top5.indices):
print(f"{LANGUAGES[idx]}: {score.item():.3f}")
Batch inference over a dataset
To evaluate on many files at once (accuracy, confusion matrix, embedding dump), build a manifest CSV (see docs/data_manifest.md) and use the repo's batch script instead:
python -m balr_lid.inference \
--checkpoint MMS-Fleurs-e2e-balang-stepstep-008856-val_classif_acc-0.9167537689208984.ckpt \
--manifest data/manifests/fleurs-test.csv \
--audio-root /path/to/fleurs/audio \
--language-list afr amh ara ... \
--output predictions.csv
--language-list must match the checkpoint's training corpus, in order
(see Datasets above).