ProxyMOS
ProxyMOS is a lightweight Mean Opinion Score (MOS) prediction model built on top of the OmniASR W2V 300M encoder (Wav2Vec2 architecture via fairseq2).
Given any audio file, the model returns a single scalar speech quality score on the MOS scale. It is the distilled model from the paper "ProxyMOS: Training Speech Quality Models via Ensemble-Derived MOS Targets" (Borodin & Trokunov, MTUCI, 2026).
Architecture
OmniASR-W2V-300M (encoder, fine-tuned with reduced lr)
↓
AttentiveStatsPooling -> [mean || std] (dim: 2 x 1024 = 2048)
↓
Linear(2048 -> 1024) -> GELU -> Linear(1024 -> 1)
↓
MOS score (scalar)
- Encoder:
omniASR_W2V_300M— a 300M-parameter Wav2Vec2-style encoder instantiated viafairseq2. - Weights:
best_model_full.ptcontains the trained ProxyMOS state dict, including the encoder and MOS head weights. No separateomniASR-W2V-300M.ptcheckpoint is required. - Pooling: Attentive Statistics Pooling — computes attention-weighted mean and standard deviation over the time dimension.
- Head: Two-layer MLP with GELU activation and a scalar output.
Repository files
| File | Description |
|---|---|
config.json |
Model metadata used by Hugging Face Hub tooling |
best_model_full.pt |
Trained ProxyMOS state dict, including encoder and MOS head weights (~1.28 GB) |
inference_model.py |
Model architecture + inference script |
Note: inference uses
fairseq2to instantiate theomniASR_W2V_300Marchitecture, then loads all trained weights frombest_model_full.pt. You do not need a separateomniASR-W2V-300M.ptfile.
Quick start
1. Clone the repository
git lfs install
git clone https://huggingface.co/lab260/ProxyMos
cd ProxyMos
2. Install dependencies
Requires Python 3.10+.
pip install torch torchaudio
pip install fairseq2
pip install accelerate scipy scikit-learn tqdm
GPU: if CUDA is available, the model will use it automatically.
3. Run inference
python inference_model.py /path/to/your/audio.wav
Example:
python inference_model.py /home/ae_samples_ae_finetuned_vocoder_segment_28.wav
Output:
MOS: 3.8721
Python API
import torch
from inference_model import load_model, predict_mos
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = load_model("best_model_full.pt", device)
score = predict_mos(model, "/path/to/audio.wav", device)
print(f"MOS: {score:.4f}")
Batch processing
from pathlib import Path
audio_dir = Path("/path/to/audio_folder")
for wav_file in sorted(audio_dir.glob("*.wav")):
score = predict_mos(model, str(wav_file), device)
print(f"{wav_file.name}: {score:.4f}")
Model Performance
URGENT Dataset
| Model | Pearson | Spearman | Kendall | RMSE | MAE |
|---|---|---|---|---|---|
| Proxymos | 0.802 | 0.799 | 0.617 | 0.474 | 0.370 |
| Proxymosonnx | 0.779 | 0.778 | 0.591 | 0.502 | 0.393 |
| Proxymosonnx16 | 0.779 | 0.778 | 0.591 | 0.502 | 0.393 |
| Whisqa | 0.780 | 0.773 | 0.588 | 0.502 | 0.397 |
| Distillmos | 0.759 | 0.748 | 0.568 | 0.525 | 0.411 |
| UTMOS | 0.721 | 0.748 | 0.560 | 0.565 | 0.450 |
| XLS | 0.743 | 0.745 | 0.561 | 0.542 | 0.426 |
| MosNet | 0.279 | 0.110 | 0.073 | 0.908 | 0.702 |
| HuBERT | -0.005 | -0.002 | -0.001 | 1.073 | 0.855 |
| NISQA | 0.028 | -0.027 | -0.021 | 1.055 | 0.863 |
| Dnsmos | -0.010 | -0.041 | -0.028 | 1.075 | 0.876 |
MOS260 Dataset
| Model | Pearson | Spearman | Kendall | RMSE | MAE |
|---|---|---|---|---|---|
| Proxymosonnx | 0.700 | 0.647 | 0.481 | 0.883 | 0.687 |
| Proxymosonnx16 | 0.700 | 0.647 | 0.481 | 0.883 | 0.687 |
| Proxymos | 0.691 | 0.636 | 0.474 | 0.897 | 0.692 |
| Distillmos | 0.670 | 0.613 | 0.456 | 0.927 | 0.712 |
| UTMOS | 0.622 | 0.555 | 0.403 | 0.991 | 0.781 |
| XLS | 0.583 | 0.473 | 0.337 | 1.041 | 0.834 |
| Whisqa | 0.576 | 0.466 | 0.332 | 1.050 | 0.841 |
| NISQA | 0.261 | 0.226 | 0.158 | 1.386 | 1.105 |
| Dnsmos | 0.075 | 0.056 | 0.039 | 1.551 | 1.254 |
| HuBERT | -0.003 | -0.009 | -0.006 | 1.614 | 1.294 |
| MosNet | -0.210 | -0.209 | -0.146 | 1.773 | 1.384 |
Requirements
| Package | Version |
|---|---|
| Python | ≥ 3.10 |
| PyTorch | ≥ 2.0 |
| torchaudio | compatible with torch |
| fairseq2 | ≥ 0.3 |
| accelerate | ≥ 0.20 |
| scipy | ≥ 1.10 |
| scikit-learn | ≥ 1.2 |
Technical details
- Audio is automatically resampled to 16,000 Hz.
- Stereo input is averaged to mono before processing.
- Input is normalized to shape
[B, T]internally. - Inference runs correctly on CPU when no GPU is available.
Results
| Benchmark | Spearman ρ | Pearson r | RMSE |
|---|---|---|---|
| URGENT | 0.802 | 0.806 | 0.471 |
| mos260 (Russian TTS) | 0.647 | 0.700 | 0.883 |
ProxyMOS outperforms all individual teacher models (WhiSQA, DistillMOS, UTMOS, XLS-R) on both benchmarks.
Citation
@article{borodin2026proxymos,
title = {ProxyMOS: Training Speech Quality Models via Ensemble-Derived MOS Targets},
author = {Borodin, Kirill and Trokunov, Maksim},
year = {2026},
institution = {MTUCI, Moscow}
}
License
Please refer to the fairseq2 and omnilingual-asr repositories for encoder licensing terms.
Contact
- Email: kborodin.research@gmail.com
- Telegram: @korallll_ai
- Downloads last month
- 4