lab260/ProxyMos
07
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
Note: inference usesfairseq2to 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 ProxyMos2. Install dependencies
Requires Python 3.10+.
pip install torch torchaudio
pip install fairseq2
pip install accelerate scipy scikit-learn tqdmGPU: if CUDA is available, the model will use it automatically.
3. Run inference
python inference_model.py /path/to/your/audio.wavExample:
python inference_model.py /home/ae_samples_ae_finetuned_vocoder_segment_28.wavOutput:
MOS: 3.8721Python 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
MOS260 Dataset
Requirements
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
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
