Skip to main content

Official scorer for the Voice of India (VoI) ASR benchmark — Orthographically Informed WER with a fast Rust core

Project description

voi_oiwer

The official scorer for OIWER (Orthographically Informed Word Error Rate) as used in the Voice of India (VoI) ASR benchmark (arXiv:2604.19151) — a large-scale evaluation of ASR across 15 Indian languages. This is the same implementation used to produce the benchmark's official results.

OIWER was introduced in prior work (see below) as an orthography-aware alternative to plain WER; VoI adapts it for the benchmark. Instead of penalizing legitimate spelling and transliteration variants, it scores a hypothesis against a lattice of accepted reference variations per word/phrase, so valid orthographic variants aren't counted as errors.

Normalization runs in Python (indicnlp-based); the edit-distance alignment over the lattice is implemented in Rust for speed.

Install

pip install voi_oiwer

Works on CPython 3.8+ (Linux, macOS, Windows). Prebuilt wheels — no Rust toolchain needed.

Usage

from voi_oiwer import oiwer

score, final_h, final_r, final_ops, (ins, dele, sub), \
    total_ref_words, metadata, std_refs = oiwer(
        hypothesis="नमस्ते दुनिया",
        reference_lists=[["नमस्ते"], ["दुनिया", "विश्व"]],   # lattice: variations per slot
        input_language="hindi",
    )
print(score)   # OIWER, as a percentage

Arguments

arg type description
hypothesis str the ASR output text
reference_lists list[list[str]] the reference lattice — one list of accepted variations per slot (a variation may span multiple words)
input_language str a language name, e.g. "hindi", "tamil", "urdu" (see list below)

Returns

A tuple:

(oiwer_score,                    # float — error percentage
 final_h,                        # list[str] — aligned hypothesis words
 final_r,                        # list[str] — aligned reference words (" " = insertion)
 final_ops,                      # list[str] — per slot: 'c' correct, 's' sub, 'd' del, 'i' ins
 (insertions, deletions, substitutions),
 total_reference_words,          # int
 final_metadata,                 # list — [lat_idx, var_idx, word_idx] per reference word (None for insertions)
 standardized_reference_lists)   # list[list[str]] — the normalized lattice used internally

Supported languages

assamese, bengali, bodo, dogri, gujarati, hindi, kannada, kashmiri, konkani, maithili, malayalam, manipuri, marathi, nepali, odia, punjabi, sanskrit, santali, sindhi, tamil, telugu, urdu, chattisgarhi, bhojpuri.

How it works

Scoring runs in two stages. First, text normalization (indicnlp-based) runs in Python — script-specific character handling, punctuation stripping, and Unicode normalization. Then the edit-distance alignment over the reference lattice runs in a compiled Rust core, which is where the speedup comes from. The normalized lattice used internally is returned as standardized_reference_lists so results are inspectable.

The metric, VoI's adaptation of OIWER, and the lattice-based reference design are described in full in the benchmark paper (arXiv:2604.19151).

Development

The Rust core is built with maturin:

pip install maturin
maturin develop --release   # compile the Rust core into your active venv
pytest -q                   # run the test suite

Citation

If you use this metric or the Voice of India benchmark, please cite:

@misc{bhogale2026voiceindialargescalebenchmark,
      title={Voice of India: A Large-Scale Benchmark for Real-World Speech Recognition in India}, 
      author={Kaushal Bhogale and Manas Dhir and Amritansh Walecha and Manmeet Kaur and Vanshika Chhabra and Aaditya Pareek and Hanuman Sidh and Mahima Manik and Sagar Jain and Bhaskar Singh and Utkarsh Singh and Tahir Javed and Shobhit Banga and Mitesh M. Khapra},
      year={2026},
      eprint={2604.19151},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2604.19151}, 
}

This metric builds on the original OIWER formulation:

@misc{bhogale2026orthographicallyinformedevaluationspeechrecognition,
      title={Towards Orthographically-Informed Evaluation of Speech Recognition Systems for Indian Languages}, 
      author={Kaushal Santosh Bhogale and Tahir Javed and Greeshma Susan John and Dhruv Rathi and Akshayasree Padmanaban and Niharika Parasa and Mitesh M. Khapra},
      year={2026},
      eprint={2603.00941},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2603.00941}, 
}

License

MIT © JoshTalks

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

voi_oiwer-0.1.2.tar.gz (16.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

voi_oiwer-0.1.2-cp38-abi3-win_amd64.whl (113.8 kB view details)

Uploaded CPython 3.8+Windows x86-64

voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (223.9 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (220.7 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

voi_oiwer-0.1.2-cp38-abi3-macosx_11_0_arm64.whl (207.6 kB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

voi_oiwer-0.1.2-cp38-abi3-macosx_10_12_x86_64.whl (214.7 kB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file voi_oiwer-0.1.2.tar.gz.

File metadata

  • Download URL: voi_oiwer-0.1.2.tar.gz
  • Upload date:
  • Size: 16.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for voi_oiwer-0.1.2.tar.gz
Algorithm Hash digest
SHA256 91fcc7f705ac59ba0671a75a6eb89bc10551b54f9875ab06c7eef61001451297
MD5 ad58abd3c19cebffdfa44b8d6646435e
BLAKE2b-256 54ec4ea789eb84fb63dc1f0b7aa3bcb138ecef2345a57d92793ec1c5ebe3d53c

See more details on using hashes here.

Provenance

The following attestation bundles were made for voi_oiwer-0.1.2.tar.gz:

Publisher: release.yml on JoshTalks/voi_oiwer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file voi_oiwer-0.1.2-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: voi_oiwer-0.1.2-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 113.8 kB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for voi_oiwer-0.1.2-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 a48af86bf86c830ea6fc9a8be37d295deca38577d4e64949445b5870912eefb5
MD5 9cdd97446376c61775a4880a5e5a3d66
BLAKE2b-256 2473e5cf77baabbb2a80f5f4dba7ef6f116d46a857e21f6bc01dd7d823d0e7ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for voi_oiwer-0.1.2-cp38-abi3-win_amd64.whl:

Publisher: release.yml on JoshTalks/voi_oiwer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b3d3e299a7a112f258ae9b63ffb84c0d0546b1e70f4b193848f3aaa6db0551f9
MD5 11f7676a4233400b5ea1abbb57d15ee4
BLAKE2b-256 fac59b6358890a9ee0fe64e7350fecebeb1be9880c28aa07bf2f12ee4c78f9e8

See more details on using hashes here.

Provenance

The following attestation bundles were made for voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on JoshTalks/voi_oiwer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 220f7048b07aab2134a5711f44fe145f96caf0f1b8a0e78199345967e411b58e
MD5 7d02a235e03d30e2e55a9a4a125af33d
BLAKE2b-256 a098e7e1fe2b3c724c9ed6e919ca4796a38dd23f86f24511ac7662a848475d1b

See more details on using hashes here.

Provenance

The following attestation bundles were made for voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on JoshTalks/voi_oiwer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file voi_oiwer-0.1.2-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for voi_oiwer-0.1.2-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 676e3a5bf0f889dfbe04675b9fdd8c896c39c44a38b0e3e45cc436bf685446ea
MD5 cb432d3a8c3e25138214b3303dcdb26a
BLAKE2b-256 b74def55e93add1684f35b68405f1daa646425d6bd4cf94688d3c86c1043eef4

See more details on using hashes here.

Provenance

The following attestation bundles were made for voi_oiwer-0.1.2-cp38-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on JoshTalks/voi_oiwer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file voi_oiwer-0.1.2-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for voi_oiwer-0.1.2-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c25bba7ff193f8bb437aa55b42edd1b0e7237b42c85dbdd8b75af1da7ccd466d
MD5 ae16405bdaf22c5d7a1b8a420fcb2107
BLAKE2b-256 99cb45dffeb366ff1c0013bf81de20ab5fd78301b09025538219973f25ddea8b

See more details on using hashes here.

Provenance

The following attestation bundles were made for voi_oiwer-0.1.2-cp38-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on JoshTalks/voi_oiwer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page