

A generic framework for benchmarking Automatic Speech Recognition (ASR) models on speech
datasets. Models implement one interface (src/models/base.py::AsrModel), datasets
implement another (src/datasets/base.py::DatasetSource), and the generic engine
(src/benchmark/runner.py) scores any model × any dataset. After every run a color-coded
leaderboard (HuggingFace Open ASR style) is printed.
| Component | Location | Role |
|---|---|---|
| Model interface | src/models/base.py (AsrModel) | transcribe_batch(paths) -> texts; lazy backend load |
| Model registry | src/models/registry.py (get_model) | name → model instance |
| Dataset interface | src/datasets/base.py (DatasetSource / Sample) | yields samples with named references (ort, dialect, kan, …) |
| Dataset registry | src/datasets/registry.py (get_dataset) | name → dataset instance |
| Engine | src/benchmark/runner.py (run_benchmark) | batched inference, per-reference WER/CER, RTFx |
| Result schema | src/benchmark/result.py (BenchmarkResult) | v2 JSON; from_dict migrates legacy v1 results |
| Leaderboard | src/leaderboard/ | color-coded terminal table + HTML + Markdown |
| SLURM (kiz0) | slurm/, scripts/submit_matrix.py, configs/matrix.yaml | submit model × dataset matrix |
# Benchmark one model on one dataset (prints the color-coded leaderboard after)
python scripts/benchmark.py --model openai/whisper-large-v3 --dataset bas_rvg1 \
--data-dir $BAS_RVG1_DATA_DIR
# Re-render the color-coded leaderboard from all results/ JSONs (no GPU needed)
python scripts/leaderboard.py --export html,md # writes results/leaderboard.{html,md}
# Run the whole matrix on the kiz0 SLURM cluster (one job per model × dataset,
# then an aggregation job that renders the leaderboard once all finish)
python scripts/submit_matrix.py --config configs/matrix.yaml
python scripts/submit_matrix.py --config configs/matrix.yaml --dry-run # preview sbatch scripts
python scripts/submit_matrix.py --config configs/matrix.yaml --local # run sequentially, no SLURM
SLURM parameters live in slurm/kiz0.env (partition p1,p2,p6, --gres=gpu:1,
--qos=gpuultimate, --time=04:00:00, venv activation). The benchmark matrix
(which models × which datasets) lives in configs/matrix.yaml.
AsrModel, implement transcribe_batch, drop it in src/models/,
and add a routing branch to src/models/registry.py.DatasetSource, yield Samples with a references dict, and
register it in src/datasets/registry.py.omniASR_LLM_Unlimited_7B_v2, omniASR_LLM_300M)omniASR_CTC_300M_v2, omniASR_CTC_1B_v2, omniASR_CTC_3B_v2, omniASR_CTC_7B_v2, 1600+ languages)openai/whisper-large-v3)nyrahealth/CrisperWhisper)nvidia/parakeet-ctc-1.1b)nvidia/canary-qwen-2.5b, English-only)nvidia/canary-1b-v2, 25 European languages)Qwen/Qwen3-ASR-1.7B, Qwen/Qwen3-ASR-0.6B, 30+ languages)mistralai/Voxtral-Mini-3B-2507, mistralai/Voxtral-Small-24B-2507)mistralai/Voxtral-Mini-4B-Realtime-2602, 4B params, 13 languages)microsoft/Phi-4-multimodal-instruct)ibm-granite/granite-4.0-1b-speech, 6 languages)CohereLabs/cohere-transcribe-03-2026, 2B params, 14 languages)nvidia/stt_de_conformer_ctc_large, 120M params, German)# Clone the repository
git clone https://github.com/ChipCracker/omni-asr-benchmark.git
cd omni-asr-benchmark
# Create virtual environment
python -m venv .venv
source .venv/bin/activate
# Install core dependencies
pip install -r requirements.txt
# Install OmniASR (for OmniASR models)
pip install git+https://github.com/facebookresearch/omnilingual-asr.git
# Install Whisper dependencies (optional)
pip install transformers torch accelerate
# Install CrisperWhisper dependencies (optional, for CrisperWhisper)
pip install git+https://github.com/nyrahealth/transformers.git@crisper_whisper
# Install NeMo dependencies (optional, for Parakeet)
pip install nemo-toolkit[asr]
# Install NeMo trunk (optional, for Canary-Qwen - requires PyTorch 2.6+)
pip install 'nemo_toolkit[asr,tts] @ git+https://github.com/NVIDIA/NeMo.git'
# Install NeMo dependencies (optional, for Canary-1b-v2)
pip install nemo-toolkit[asr]
# Install Qwen3-ASR dependencies (optional, for Qwen3-ASR)
pip install qwen-asr
# Install Voxtral / Voxtral Realtime dependencies (optional)
pip install --upgrade "transformers>=5.2.0"
# Install Phi-4 dependencies (optional, for Phi-4 Multimodal)
pip install transformers>=4.48.2 soundfile flash-attn
# Install Cohere Transcribe dependencies (optional)
pip install --upgrade "transformers>=5.4.0" sentencepiece protobuf
# Install VibeVoice dependencies (optional, for VibeVoice-ASR)
git clone https://github.com/microsoft/VibeVoice.git
cd VibeVoice
pip install -e .[asr]
Note: The repository was renamed from omni-asr-test to omni-asr-benchmark.
Copy the environment template and configure:
cp .env.template .env
Set the BAS_RVG1_DATA_DIR environment variable to point to your BAS RVG1 dataset directory.
# OmniASR-LLM 7B v2 (default)
python scripts/evaluate_rvg1.py
# OmniASR-LLM 300M - smallest LLM variant
python scripts/evaluate_rvg1.py --model-card omniASR_LLM_300M
# OmniASR-CTC 300M v2 - smallest and fastest variant
python scripts/evaluate_rvg1.py --model-card omniASR_CTC_300M_v2
# OmniASR-CTC 1B v2
python scripts/evaluate_rvg1.py --model-card omniASR_CTC_1B_v2
# OmniASR-CTC 3B v2
python scripts/evaluate_rvg1.py --model-card omniASR_CTC_3B_v2
# OmniASR-CTC 7B v2 - largest CTC variant
python scripts/evaluate_rvg1.py --model-card omniASR_CTC_7B_v2
Note: CTC models have a 40s audio limit; files longer than 35s are automatically split into ~30s chunks. The v2 models (December 2025 update) offer improved accuracy over v1.
python scripts/evaluate_rvg1.py --model-card openai/whisper-large-v3
python scripts/evaluate_rvg1.py --model-card nyrahealth/CrisperWhisper
Note: CrisperWhisper is a fine-tuned Whisper Large V3 that provides verbatim transcription (including filler words like "um", "uh") and improved word-level timestamps.
python scripts/evaluate_rvg1.py --model-card nvidia/parakeet-ctc-1.1b
python scripts/evaluate_rvg1.py --model-card nvidia/canary-qwen-2.5b
Note: Canary-Qwen is English-only (5.63% mean WER on HuggingFace OpenASR Leaderboard). German evaluation will show degraded results.
python scripts/evaluate_rvg1.py --model-card nvidia/canary-1b-v2
Note: Canary-1b-v2 supports 25 European languages including German (de), English (en), French (fr), Spanish (es), Italian (it), and more.
# Qwen3-ASR 1.7B
python scripts/evaluate_rvg1.py --model-card Qwen/Qwen3-ASR-1.7B
# Qwen3-ASR 0.6B (smaller, faster)
python scripts/evaluate_rvg1.py --model-card Qwen/Qwen3-ASR-0.6B
Note: Qwen3-ASR supports 30+ languages with automatic language detection. Recommended for German transcription.
# Voxtral Mini (3B) - ~9.5 GB GPU RAM
python scripts/evaluate_rvg1.py --model-card mistralai/Voxtral-Mini-3B-2507
# Voxtral Small (24B) - larger model, better accuracy
python scripts/evaluate_rvg1.py --model-card mistralai/Voxtral-Small-24B-2507
Note: Voxtral supports German (de), English (en), French (fr), Spanish (es), Portuguese (pt), Italian (it), Dutch (nl), and Hindi (hi).
Offline mode (full audio at once, supports batching):
python scripts/evaluate_rvg1.py --model-card mistralai/Voxtral-Mini-4B-Realtime-2602 --batch-size 4
Online mode (simulated streaming, chunked audio via generator):
python scripts/evaluate_rvg1.py --model-card mistralai/Voxtral-Mini-4B-Realtime-2602-online --batch-size 1
Note: Voxtral Realtime is a 4B parameter real-time ASR model supporting 13 languages. Native Transformers support starts with transformers>=5.2.0. The offline mode processes full audio files and supports batch sizes > 1. The online mode simulates real-time streaming by splitting audio into ~105 ms chunks (with a ~560 ms first chunk) and feeding them incrementally to the model; batch size is fixed to 1. Append -online to the model card name to select online mode. Expect roughly 16 GB VRAM for BF16 inference.
python scripts/evaluate_rvg1.py --model-card microsoft/Phi-4-multimodal-instruct
Note: Phi-4 Multimodal supports German, English, Chinese, French, Italian, Japanese, Spanish, and Portuguese. Recommended max 40 seconds per audio. Uses flash_attention_2 on Ampere+ GPUs.
python scripts/evaluate_rvg1.py --model-card microsoft/VibeVoice-ASR --batch-size 1
Note: VibeVoice-ASR is a 9B parameter model requiring ~18-20 GB VRAM. It supports up to 60 minutes of continuous audio and includes speaker diarization (stripped for WER evaluation).
python scripts/evaluate_rvg1.py --model-card ibm-granite/granite-4.0-1b-speech --batch-size 1
Note: Granite 4.0 1B Speech supports English, German, French, Spanish, Portuguese, and Japanese. Uses a Conformer speech encoder with Granite-4.0-1b-base.
python scripts/evaluate_rvg1.py --model-card CohereLabs/cohere-transcribe-03-2026 --batch-size 4
Note: Cohere Transcribe is a 2B parameter Conformer-based model supporting 14 languages including German (de), English (en), French (fr), and more. Requires transformers>=5.4.0. Supports native batching and automatic long-form audio handling.
python scripts/evaluate_rvg1.py --model-card nvidia/stt_de_conformer_ctc_large --batch-size 16
Note: NeMo STT Conformer CTC Large is a 120M parameter German-only model. Requires nemo_toolkit[asr].
Results are saved as JSON files in the results/ directory with the model name as prefix:
results/omniASR_LLM_Unlimited_7B_v2_evaluation.jsonresults/omniASR_LLM_300M_evaluation.jsonresults/omniASR_CTC_300M_v2_evaluation.jsonresults/omniASR_CTC_1B_v2_evaluation.jsonresults/omniASR_CTC_3B_v2_evaluation.jsonresults/omniASR_CTC_7B_v2_evaluation.jsonresults/openai_whisper-large-v3_evaluation.jsonresults/nyrahealth_CrisperWhisper_evaluation.jsonresults/nvidia_parakeet-ctc-1.1b_evaluation.jsonresults/nvidia_canary-qwen-2.5b_evaluation.jsonresults/nvidia_canary-1b-v2_evaluation.jsonresults/Qwen_Qwen3-ASR-1.7B_evaluation.jsonresults/Qwen_Qwen3-ASR-0.6B_evaluation.jsonresults/mistralai_Voxtral-Mini-3B-2507_evaluation.jsonresults/mistralai_Voxtral-Mini-4B-Realtime-2602_evaluation.json (offline)results/mistralai_Voxtral-Mini-4B-Realtime-2602-online_evaluation.json (online)results/microsoft_Phi-4-multimodal-instruct_evaluation.jsonresults/microsoft_VibeVoice-ASR_evaluation.jsonresults/ibm-granite_granite-4.0-1b-speech_evaluation.jsonresults/CohereLabs_cohere-transcribe-03-2026_evaluation.jsonresults/nvidia_stt_de_conformer_ctc_large_evaluation.jsonEach result file contains:
Use the analysis script to print a minimal summary:
python scripts/analyze_results.py results/openai_whisper-large-v3_evaluation.json
The summary includes:
Generate a comparison bar chart of all evaluation results:
python scripts/plot_results.py
This creates results/comparison_chart.png with:
98 commits
Python
99.9%


A generic framework for benchmarking Automatic Speech Recognition (ASR) models on speech
datasets. Models implement one interface (src/models/base.py::AsrModel), datasets
implement another (src/datasets/base.py::DatasetSource), and the generic engine
(src/benchmark/runner.py) scores any model × any dataset. After every run a color-coded
leaderboard (HuggingFace Open ASR style) is printed.
| Component | Location | Role |
|---|---|---|
| Model interface | src/models/base.py (AsrModel) | transcribe_batch(paths) -> texts; lazy backend load |
| Model registry | src/models/registry.py (get_model) | name → model instance |
| Dataset interface | src/datasets/base.py (DatasetSource / Sample) | yields samples with named references (ort, dialect, kan, …) |
| Dataset registry | src/datasets/registry.py (get_dataset) | name → dataset instance |
| Engine | src/benchmark/runner.py (run_benchmark) | batched inference, per-reference WER/CER, RTFx |
| Result schema | src/benchmark/result.py (BenchmarkResult) | v2 JSON; from_dict migrates legacy v1 results |
| Leaderboard | src/leaderboard/ | color-coded terminal table + HTML + Markdown |
| SLURM (kiz0) | slurm/, scripts/submit_matrix.py, configs/matrix.yaml | submit model × dataset matrix |
# Benchmark one model on one dataset (prints the color-coded leaderboard after)
python scripts/benchmark.py --model openai/whisper-large-v3 --dataset bas_rvg1 \
--data-dir $BAS_RVG1_DATA_DIR
# Re-render the color-coded leaderboard from all results/ JSONs (no GPU needed)
python scripts/leaderboard.py --export html,md # writes results/leaderboard.{html,md}
# Run the whole matrix on the kiz0 SLURM cluster (one job per model × dataset,
# then an aggregation job that renders the leaderboard once all finish)
python scripts/submit_matrix.py --config configs/matrix.yaml
python scripts/submit_matrix.py --config configs/matrix.yaml --dry-run # preview sbatch scripts
python scripts/submit_matrix.py --config configs/matrix.yaml --local # run sequentially, no SLURM
SLURM parameters live in slurm/kiz0.env (partition p1,p2,p6, --gres=gpu:1,
--qos=gpuultimate, --time=04:00:00, venv activation). The benchmark matrix
(which models × which datasets) lives in configs/matrix.yaml.
AsrModel, implement transcribe_batch, drop it in src/models/,
and add a routing branch to src/models/registry.py.DatasetSource, yield Samples with a references dict, and
register it in src/datasets/registry.py.omniASR_LLM_Unlimited_7B_v2, omniASR_LLM_300M)omniASR_CTC_300M_v2, omniASR_CTC_1B_v2, omniASR_CTC_3B_v2, omniASR_CTC_7B_v2, 1600+ languages)openai/whisper-large-v3)nyrahealth/CrisperWhisper)nvidia/parakeet-ctc-1.1b)nvidia/canary-qwen-2.5b, English-only)nvidia/canary-1b-v2, 25 European languages)Qwen/Qwen3-ASR-1.7B, Qwen/Qwen3-ASR-0.6B, 30+ languages)mistralai/Voxtral-Mini-3B-2507, mistralai/Voxtral-Small-24B-2507)mistralai/Voxtral-Mini-4B-Realtime-2602, 4B params, 13 languages)microsoft/Phi-4-multimodal-instruct)ibm-granite/granite-4.0-1b-speech, 6 languages)CohereLabs/cohere-transcribe-03-2026, 2B params, 14 languages)nvidia/stt_de_conformer_ctc_large, 120M params, German)# Clone the repository
git clone https://github.com/ChipCracker/omni-asr-benchmark.git
cd omni-asr-benchmark
# Create virtual environment
python -m venv .venv
source .venv/bin/activate
# Install core dependencies
pip install -r requirements.txt
# Install OmniASR (for OmniASR models)
pip install git+https://github.com/facebookresearch/omnilingual-asr.git
# Install Whisper dependencies (optional)
pip install transformers torch accelerate
# Install CrisperWhisper dependencies (optional, for CrisperWhisper)
pip install git+https://github.com/nyrahealth/transformers.git@crisper_whisper
# Install NeMo dependencies (optional, for Parakeet)
pip install nemo-toolkit[asr]
# Install NeMo trunk (optional, for Canary-Qwen - requires PyTorch 2.6+)
pip install 'nemo_toolkit[asr,tts] @ git+https://github.com/NVIDIA/NeMo.git'
# Install NeMo dependencies (optional, for Canary-1b-v2)
pip install nemo-toolkit[asr]
# Install Qwen3-ASR dependencies (optional, for Qwen3-ASR)
pip install qwen-asr
# Install Voxtral / Voxtral Realtime dependencies (optional)
pip install --upgrade "transformers>=5.2.0"
# Install Phi-4 dependencies (optional, for Phi-4 Multimodal)
pip install transformers>=4.48.2 soundfile flash-attn
# Install Cohere Transcribe dependencies (optional)
pip install --upgrade "transformers>=5.4.0" sentencepiece protobuf
# Install VibeVoice dependencies (optional, for VibeVoice-ASR)
git clone https://github.com/microsoft/VibeVoice.git
cd VibeVoice
pip install -e .[asr]
Note: The repository was renamed from omni-asr-test to omni-asr-benchmark.
Copy the environment template and configure:
cp .env.template .env
Set the BAS_RVG1_DATA_DIR environment variable to point to your BAS RVG1 dataset directory.
# OmniASR-LLM 7B v2 (default)
python scripts/evaluate_rvg1.py
# OmniASR-LLM 300M - smallest LLM variant
python scripts/evaluate_rvg1.py --model-card omniASR_LLM_300M
# OmniASR-CTC 300M v2 - smallest and fastest variant
python scripts/evaluate_rvg1.py --model-card omniASR_CTC_300M_v2
# OmniASR-CTC 1B v2
python scripts/evaluate_rvg1.py --model-card omniASR_CTC_1B_v2
# OmniASR-CTC 3B v2
python scripts/evaluate_rvg1.py --model-card omniASR_CTC_3B_v2
# OmniASR-CTC 7B v2 - largest CTC variant
python scripts/evaluate_rvg1.py --model-card omniASR_CTC_7B_v2
Note: CTC models have a 40s audio limit; files longer than 35s are automatically split into ~30s chunks. The v2 models (December 2025 update) offer improved accuracy over v1.
python scripts/evaluate_rvg1.py --model-card openai/whisper-large-v3
python scripts/evaluate_rvg1.py --model-card nyrahealth/CrisperWhisper
Note: CrisperWhisper is a fine-tuned Whisper Large V3 that provides verbatim transcription (including filler words like "um", "uh") and improved word-level timestamps.
python scripts/evaluate_rvg1.py --model-card nvidia/parakeet-ctc-1.1b
python scripts/evaluate_rvg1.py --model-card nvidia/canary-qwen-2.5b
Note: Canary-Qwen is English-only (5.63% mean WER on HuggingFace OpenASR Leaderboard). German evaluation will show degraded results.
python scripts/evaluate_rvg1.py --model-card nvidia/canary-1b-v2
Note: Canary-1b-v2 supports 25 European languages including German (de), English (en), French (fr), Spanish (es), Italian (it), and more.
# Qwen3-ASR 1.7B
python scripts/evaluate_rvg1.py --model-card Qwen/Qwen3-ASR-1.7B
# Qwen3-ASR 0.6B (smaller, faster)
python scripts/evaluate_rvg1.py --model-card Qwen/Qwen3-ASR-0.6B
Note: Qwen3-ASR supports 30+ languages with automatic language detection. Recommended for German transcription.
# Voxtral Mini (3B) - ~9.5 GB GPU RAM
python scripts/evaluate_rvg1.py --model-card mistralai/Voxtral-Mini-3B-2507
# Voxtral Small (24B) - larger model, better accuracy
python scripts/evaluate_rvg1.py --model-card mistralai/Voxtral-Small-24B-2507
Note: Voxtral supports German (de), English (en), French (fr), Spanish (es), Portuguese (pt), Italian (it), Dutch (nl), and Hindi (hi).
Offline mode (full audio at once, supports batching):
python scripts/evaluate_rvg1.py --model-card mistralai/Voxtral-Mini-4B-Realtime-2602 --batch-size 4
Online mode (simulated streaming, chunked audio via generator):
python scripts/evaluate_rvg1.py --model-card mistralai/Voxtral-Mini-4B-Realtime-2602-online --batch-size 1
Note: Voxtral Realtime is a 4B parameter real-time ASR model supporting 13 languages. Native Transformers support starts with transformers>=5.2.0. The offline mode processes full audio files and supports batch sizes > 1. The online mode simulates real-time streaming by splitting audio into ~105 ms chunks (with a ~560 ms first chunk) and feeding them incrementally to the model; batch size is fixed to 1. Append -online to the model card name to select online mode. Expect roughly 16 GB VRAM for BF16 inference.
python scripts/evaluate_rvg1.py --model-card microsoft/Phi-4-multimodal-instruct
Note: Phi-4 Multimodal supports German, English, Chinese, French, Italian, Japanese, Spanish, and Portuguese. Recommended max 40 seconds per audio. Uses flash_attention_2 on Ampere+ GPUs.
python scripts/evaluate_rvg1.py --model-card microsoft/VibeVoice-ASR --batch-size 1
Note: VibeVoice-ASR is a 9B parameter model requiring ~18-20 GB VRAM. It supports up to 60 minutes of continuous audio and includes speaker diarization (stripped for WER evaluation).
python scripts/evaluate_rvg1.py --model-card ibm-granite/granite-4.0-1b-speech --batch-size 1
Note: Granite 4.0 1B Speech supports English, German, French, Spanish, Portuguese, and Japanese. Uses a Conformer speech encoder with Granite-4.0-1b-base.
python scripts/evaluate_rvg1.py --model-card CohereLabs/cohere-transcribe-03-2026 --batch-size 4
Note: Cohere Transcribe is a 2B parameter Conformer-based model supporting 14 languages including German (de), English (en), French (fr), and more. Requires transformers>=5.4.0. Supports native batching and automatic long-form audio handling.
python scripts/evaluate_rvg1.py --model-card nvidia/stt_de_conformer_ctc_large --batch-size 16
Note: NeMo STT Conformer CTC Large is a 120M parameter German-only model. Requires nemo_toolkit[asr].
Results are saved as JSON files in the results/ directory with the model name as prefix:
results/omniASR_LLM_Unlimited_7B_v2_evaluation.jsonresults/omniASR_LLM_300M_evaluation.jsonresults/omniASR_CTC_300M_v2_evaluation.jsonresults/omniASR_CTC_1B_v2_evaluation.jsonresults/omniASR_CTC_3B_v2_evaluation.jsonresults/omniASR_CTC_7B_v2_evaluation.jsonresults/openai_whisper-large-v3_evaluation.jsonresults/nyrahealth_CrisperWhisper_evaluation.jsonresults/nvidia_parakeet-ctc-1.1b_evaluation.jsonresults/nvidia_canary-qwen-2.5b_evaluation.jsonresults/nvidia_canary-1b-v2_evaluation.jsonresults/Qwen_Qwen3-ASR-1.7B_evaluation.jsonresults/Qwen_Qwen3-ASR-0.6B_evaluation.jsonresults/mistralai_Voxtral-Mini-3B-2507_evaluation.jsonresults/mistralai_Voxtral-Mini-4B-Realtime-2602_evaluation.json (offline)results/mistralai_Voxtral-Mini-4B-Realtime-2602-online_evaluation.json (online)results/microsoft_Phi-4-multimodal-instruct_evaluation.jsonresults/microsoft_VibeVoice-ASR_evaluation.jsonresults/ibm-granite_granite-4.0-1b-speech_evaluation.jsonresults/CohereLabs_cohere-transcribe-03-2026_evaluation.jsonresults/nvidia_stt_de_conformer_ctc_large_evaluation.jsonEach result file contains:
Use the analysis script to print a minimal summary:
python scripts/analyze_results.py results/openai_whisper-large-v3_evaluation.json
The summary includes:
Generate a comparison bar chart of all evaluation results:
python scripts/plot_results.py
This creates results/comparison_chart.png with:
98 commits
Python
99.9%