knoveleng/asr-evalkit

A Modular Toolkit for Evaluating Automatic Speech Recognition Models

2

stars

21

commits

Python

primary language

Jul 23, 2026

updated

asr
evaluation
speech-recognition
Browse cluster: Automatic Speech Recognition (ASR)

README

ASR EvalKit

A modular, extensible toolkit for evaluating Automatic Speech Recognition (ASR) models. It provides a unified Python API and a Command-Line Interface (CLI) to evaluate HuggingFace, NeMo, and vLLM-backed models across various datasets.

Key Features

  • Unified Provider System: Evaluate transformers, NVIDIA NeMo, or vLLM models seamlessly.
  • Dataset Support: Native support for HuggingFace datasets (with streaming) and local NeMo manifests.
  • Extensible: Effortlessly add new models, metrics, or normalisers via clean abstract base classes.

Installation

uv is a fast Python package manager. Install it with:

curl -LsSf https://astral.sh/uv/install.sh | sh

2. Clone and create a virtual environment

git clone https://github.com/knoveleng/asr-evalkit.git
cd asr-evalkit

# Create a virtual environment named 'asr'
uv venv asr --python 3.12

# Activate it
source asr/bin/activate

3. Install dependencies

# Install the package in editable mode (reads from requirements.txt via setup.py)
uv pip install -e .

# Optional — install NeMo and dev tools
uv pip install -e ".[nemo,dev]"

Note: For vLLM-backed models (seallm_audio, qwen3_asr), install vLLM separately:

uv pip install vllm

Quick Start: Command-Line Interface (CLI)

The easiest way to run evaluations is via the asr-evalkit command.

1. Evaluate a HuggingFace Model on a HuggingFace Dataset

asr-evalkit \
  --evaluator whisper \
  --model openai/whisper-large-v3-turbo \
  --dataset openslr/librispeech_asr \
  --dataset-config clean \
  --dataset-split test \
  --streaming \
  --audio-column audio \
  --text-column text \
  --output-file results.json

2. Evaluate a NeMo Model on a HuggingFace Dataset

asr-evalkit \
  --evaluator canary \
  --model nvidia/canary-1b \
  --dataset openslr/librispeech_asr \
  --dataset-config clean \
  --dataset-split test \
  --streaming \
  --audio-column audio \
  --text-column text \
  --output-file canary_results.json

3. Evaluate a NeMo Model on a Local Manifest

asr-evalkit \
  --evaluator nemotron_asr \
  --model nvidia/nemotron-3.5-asr-streaming-0.6b \
  --dataset path/to/manifest.jsonl \
  --dataset-source nemo \
  --language en \
  --max-samples 100 \
  --output-file nemotron_results.json

Example Scripts

The scripts/ directory contains ready-to-use examples you can copy and adapt:

ScriptDescription
scripts/evaluate_benchmarks.shBatch benchmark runner — evaluates one or more models across a configurable list of HuggingFace datasets in a single run. Edit the MODELS and BENCHMARKS arrays at the top to select which models and datasets to run.
scripts/run_cli.shCLI examples — commented-out one-off asr-evalkit invocations for Whisper, MERaLiON, Qwen3-ASR (vLLM), Parakeet (NeMo), and more.
scripts/run.pyPython API example — shows all three provider types (HuggingFace, vLLM, NeMo) and both dataset loaders side-by-side with comments.

Running the batch benchmark script:

# Run with defaults (10 samples per dataset, results → results/benchmarks/)
bash scripts/evaluate_benchmarks.sh

# Override sample count and output directory
MAX_SAMPLES=100 OUTPUT_DIR=results/full bash scripts/evaluate_benchmarks.sh

Tip: evaluate_benchmarks.sh is designed to be your personal run script — it is listed in .gitignore so you can freely customise it (add models, change datasets, tweak flags) without affecting the repo.


Quick Start: Python API

The Python API offers the exact same capabilities as the CLI but allows integration into your own scripts.

1. HuggingFace Model & Dataset

from asr_evalkit.evaluators.providers import HuggingFaceProvider
from asr_evalkit.config import ModelConfig, NormalizerConfig
from asr_evalkit.datasets import HuggingFaceDataset
from asr_evalkit.runner import Runner

# Configure Provider (Handles weights + precision)
provider = HuggingFaceProvider(
    model_id="openai/whisper-large-v3-turbo",
    device="cuda",
    use_fp16=True
)

# Set up Runner
model_cfg = ModelConfig(evaluator="whisper", provider=provider)
runner = Runner(model=model_cfg)

# Configure Dataset
hf_dataset = HuggingFaceDataset(
    "openslr/librispeech_asr",
    config="clean",
    split="test",
    audio_column="audio",
    text_column="text",
    streaming=True,
    max_samples=10
)

# Run Evaluation
# Note: Default behaviour (lowercase + Unicode NFC + remove punctuation + remove extra whitespace)
results = runner.run(dataset=hf_dataset, normalizer=NormalizerConfig())

print(f"WER: {results['wer']*100:.2f}%")

2. NeMo Model on a Local Manifest

from asr_evalkit.evaluators.providers import NeMoProvider
from asr_evalkit.config import ModelConfig
from asr_evalkit.datasets import NeMoDataset
from asr_evalkit.runner import Runner

# Use NeMo provider instead
provider = NeMoProvider(model_id="nvidia/parakeet-tdt-0.6b-v3", device="cuda")
runner = Runner(model=ModelConfig(evaluator="parakeet", provider=provider))

# Load a local NeMo dataset manifest
nemo_dataset = NeMoDataset(
    "path/to/test_manifest.jsonl",
    audio_column="audio_filepath",
    text_column="text",
    max_samples=10
)

results = runner.run(dataset=nemo_dataset)

Supported Evaluators & Providers

To see a list of all currently supported models natively built into the package, run:

asr-evalkit --list-evaluators
Evaluator NameSupported ProviderTarget Models
whisperHuggingFaceProvideropenai/whisper-*
canaryNeMoProvidernvidia/canary-*
parakeetNeMoProvidernvidia/parakeet-*
nemotron_asrNeMoProvidernvidia/nemotron--asr-streaming-
qwen_omniHuggingFaceProviderQwen/Qwen2.5-Omni-*
qwen3_asrVLLMProviderQwen/Qwen3-ASR-*
meralionHuggingFaceProviderMERaLiON/MERaLiON-*
phi4HuggingFaceProvidermicrosoft/Phi-4-multimodal-instruct
seallm_audioVLLMProviderSeaLLMs/SeaLLMs-Audio-*

Benchmark Results

Modelaishell1_mandarin (CER)aishell3_mandarin (CER)cv_mandarin (CER)cv_tamil (WER)fleurs_malay (WER)fleurs_mandarin (CER)fleurs_tamil (WER)librispeech_english (WER)mesolitica_malaysian (WER)nsc_singlish (WER)slr127_tamil (WER)slr65_tamil (WER)AVG
whisper-large-v3-turbo9.6416.8117.9174.508.8810.6366.903.0428.4732.0269.5658.1333.04
SeaLLMs-Audio-7B9.659.768.68126.7026.2537.09105.3194.7471.349.53138.65127.2463.75
Qwen2.5-Omni-3B28.2544.5546.36318.3674.6954.74311.6729.21211.4034.79448.82465.58172.37
Qwen2.5-Omni-7B7.3322.5814.49252.0643.9216.68326.4313.80158.0622.96303.96239.15118.45
Qwen3-ASR-0.6B2.082.5910.06121.1018.719.75130.092.7447.297.64129.12127.0050.68
Qwen3-ASR-1.7B1.522.087.50139.9610.879.33147.232.3139.006.22144.49134.6353.76
MERaLiON-2-10B-ASR3.094.078.8331.788.5511.9928.682.5425.904.6222.4219.2914.31
polyglot-lion-0.6b1.932.326.1642.1614.459.1937.682.6724.336.0928.1423.0716.52
polyglot-lion-1.7b1.451.864.9139.199.988.0037.282.1021.515.2826.8319.7514.85

Architecture & Customisation

ASR EvalKit is structured around a strict provider/evaluator separation to maintain clean code and easy API mapping.

If you need to customise the toolkit, please refer to the detailed guides in the docs/ folder:


⚠️ Known Issues

AssertionError: duplicate template name when running outside a virtual environment

If you see this error when using vLLM-backed models (e.g. seallm_audio, qwen3_asr) with the system Python, your torch installation has stale kernel files from a previous upgrade. See Troubleshooting → duplicate template name for the one-line fix.


Citation

If you use ASR EvalKit in your research, please cite:

@software{dang2026asrevalkit,
  author       = {Quy-Anh Dang},
  title        = {ASR EvalKit: A Modular Toolkit for Evaluating Automatic Speech Recognition Models},
  year         = {2026},
  url          = {https://github.com/knoveleng/asr-evalkit},
}

Contributors

QuyAnh2005

21 commits

knoveleng/asr-evalkit

A Modular Toolkit for Evaluating Automatic Speech Recognition Models

2

stars

21

commits

Python

primary language

Jul 23, 2026

updated

asr
evaluation
speech-recognition
Browse cluster: Automatic Speech Recognition (ASR)

README

ASR EvalKit

A modular, extensible toolkit for evaluating Automatic Speech Recognition (ASR) models. It provides a unified Python API and a Command-Line Interface (CLI) to evaluate HuggingFace, NeMo, and vLLM-backed models across various datasets.

Key Features

  • Unified Provider System: Evaluate transformers, NVIDIA NeMo, or vLLM models seamlessly.
  • Dataset Support: Native support for HuggingFace datasets (with streaming) and local NeMo manifests.
  • Extensible: Effortlessly add new models, metrics, or normalisers via clean abstract base classes.

Installation

uv is a fast Python package manager. Install it with:

curl -LsSf https://astral.sh/uv/install.sh | sh

2. Clone and create a virtual environment

git clone https://github.com/knoveleng/asr-evalkit.git
cd asr-evalkit

# Create a virtual environment named 'asr'
uv venv asr --python 3.12

# Activate it
source asr/bin/activate

3. Install dependencies

# Install the package in editable mode (reads from requirements.txt via setup.py)
uv pip install -e .

# Optional — install NeMo and dev tools
uv pip install -e ".[nemo,dev]"

Note: For vLLM-backed models (seallm_audio, qwen3_asr), install vLLM separately:

uv pip install vllm

Quick Start: Command-Line Interface (CLI)

The easiest way to run evaluations is via the asr-evalkit command.

1. Evaluate a HuggingFace Model on a HuggingFace Dataset

asr-evalkit \
  --evaluator whisper \
  --model openai/whisper-large-v3-turbo \
  --dataset openslr/librispeech_asr \
  --dataset-config clean \
  --dataset-split test \
  --streaming \
  --audio-column audio \
  --text-column text \
  --output-file results.json

2. Evaluate a NeMo Model on a HuggingFace Dataset

asr-evalkit \
  --evaluator canary \
  --model nvidia/canary-1b \
  --dataset openslr/librispeech_asr \
  --dataset-config clean \
  --dataset-split test \
  --streaming \
  --audio-column audio \
  --text-column text \
  --output-file canary_results.json

3. Evaluate a NeMo Model on a Local Manifest

asr-evalkit \
  --evaluator nemotron_asr \
  --model nvidia/nemotron-3.5-asr-streaming-0.6b \
  --dataset path/to/manifest.jsonl \
  --dataset-source nemo \
  --language en \
  --max-samples 100 \
  --output-file nemotron_results.json

Example Scripts

The scripts/ directory contains ready-to-use examples you can copy and adapt:

ScriptDescription
scripts/evaluate_benchmarks.shBatch benchmark runner — evaluates one or more models across a configurable list of HuggingFace datasets in a single run. Edit the MODELS and BENCHMARKS arrays at the top to select which models and datasets to run.
scripts/run_cli.shCLI examples — commented-out one-off asr-evalkit invocations for Whisper, MERaLiON, Qwen3-ASR (vLLM), Parakeet (NeMo), and more.
scripts/run.pyPython API example — shows all three provider types (HuggingFace, vLLM, NeMo) and both dataset loaders side-by-side with comments.

Running the batch benchmark script:

# Run with defaults (10 samples per dataset, results → results/benchmarks/)
bash scripts/evaluate_benchmarks.sh

# Override sample count and output directory
MAX_SAMPLES=100 OUTPUT_DIR=results/full bash scripts/evaluate_benchmarks.sh

Tip: evaluate_benchmarks.sh is designed to be your personal run script — it is listed in .gitignore so you can freely customise it (add models, change datasets, tweak flags) without affecting the repo.


Quick Start: Python API

The Python API offers the exact same capabilities as the CLI but allows integration into your own scripts.

1. HuggingFace Model & Dataset

from asr_evalkit.evaluators.providers import HuggingFaceProvider
from asr_evalkit.config import ModelConfig, NormalizerConfig
from asr_evalkit.datasets import HuggingFaceDataset
from asr_evalkit.runner import Runner

# Configure Provider (Handles weights + precision)
provider = HuggingFaceProvider(
    model_id="openai/whisper-large-v3-turbo",
    device="cuda",
    use_fp16=True
)

# Set up Runner
model_cfg = ModelConfig(evaluator="whisper", provider=provider)
runner = Runner(model=model_cfg)

# Configure Dataset
hf_dataset = HuggingFaceDataset(
    "openslr/librispeech_asr",
    config="clean",
    split="test",
    audio_column="audio",
    text_column="text",
    streaming=True,
    max_samples=10
)

# Run Evaluation
# Note: Default behaviour (lowercase + Unicode NFC + remove punctuation + remove extra whitespace)
results = runner.run(dataset=hf_dataset, normalizer=NormalizerConfig())

print(f"WER: {results['wer']*100:.2f}%")

2. NeMo Model on a Local Manifest

from asr_evalkit.evaluators.providers import NeMoProvider
from asr_evalkit.config import ModelConfig
from asr_evalkit.datasets import NeMoDataset
from asr_evalkit.runner import Runner

# Use NeMo provider instead
provider = NeMoProvider(model_id="nvidia/parakeet-tdt-0.6b-v3", device="cuda")
runner = Runner(model=ModelConfig(evaluator="parakeet", provider=provider))

# Load a local NeMo dataset manifest
nemo_dataset = NeMoDataset(
    "path/to/test_manifest.jsonl",
    audio_column="audio_filepath",
    text_column="text",
    max_samples=10
)

results = runner.run(dataset=nemo_dataset)

Supported Evaluators & Providers

To see a list of all currently supported models natively built into the package, run:

asr-evalkit --list-evaluators
Evaluator NameSupported ProviderTarget Models
whisperHuggingFaceProvideropenai/whisper-*
canaryNeMoProvidernvidia/canary-*
parakeetNeMoProvidernvidia/parakeet-*
nemotron_asrNeMoProvidernvidia/nemotron--asr-streaming-
qwen_omniHuggingFaceProviderQwen/Qwen2.5-Omni-*
qwen3_asrVLLMProviderQwen/Qwen3-ASR-*
meralionHuggingFaceProviderMERaLiON/MERaLiON-*
phi4HuggingFaceProvidermicrosoft/Phi-4-multimodal-instruct
seallm_audioVLLMProviderSeaLLMs/SeaLLMs-Audio-*

Benchmark Results

Modelaishell1_mandarin (CER)aishell3_mandarin (CER)cv_mandarin (CER)cv_tamil (WER)fleurs_malay (WER)fleurs_mandarin (CER)fleurs_tamil (WER)librispeech_english (WER)mesolitica_malaysian (WER)nsc_singlish (WER)slr127_tamil (WER)slr65_tamil (WER)AVG
whisper-large-v3-turbo9.6416.8117.9174.508.8810.6366.903.0428.4732.0269.5658.1333.04
SeaLLMs-Audio-7B9.659.768.68126.7026.2537.09105.3194.7471.349.53138.65127.2463.75
Qwen2.5-Omni-3B28.2544.5546.36318.3674.6954.74311.6729.21211.4034.79448.82465.58172.37
Qwen2.5-Omni-7B7.3322.5814.49252.0643.9216.68326.4313.80158.0622.96303.96239.15118.45
Qwen3-ASR-0.6B2.082.5910.06121.1018.719.75130.092.7447.297.64129.12127.0050.68
Qwen3-ASR-1.7B1.522.087.50139.9610.879.33147.232.3139.006.22144.49134.6353.76
MERaLiON-2-10B-ASR3.094.078.8331.788.5511.9928.682.5425.904.6222.4219.2914.31
polyglot-lion-0.6b1.932.326.1642.1614.459.1937.682.6724.336.0928.1423.0716.52
polyglot-lion-1.7b1.451.864.9139.199.988.0037.282.1021.515.2826.8319.7514.85

Architecture & Customisation

ASR EvalKit is structured around a strict provider/evaluator separation to maintain clean code and easy API mapping.

If you need to customise the toolkit, please refer to the detailed guides in the docs/ folder:


⚠️ Known Issues

AssertionError: duplicate template name when running outside a virtual environment

If you see this error when using vLLM-backed models (e.g. seallm_audio, qwen3_asr) with the system Python, your torch installation has stale kernel files from a previous upgrade. See Troubleshooting → duplicate template name for the one-line fix.


Citation

If you use ASR EvalKit in your research, please cite:

@software{dang2026asrevalkit,
  author       = {Quy-Anh Dang},
  title        = {ASR EvalKit: A Modular Toolkit for Evaluating Automatic Speech Recognition Models},
  year         = {2026},
  url          = {https://github.com/knoveleng/asr-evalkit},
}

Contributors

QuyAnh2005

21 commits

Languages

Python

91.2%

Shell

8.8%