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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91fcc7f705ac59ba0671a75a6eb89bc10551b54f9875ab06c7eef61001451297
|
|
| MD5 |
ad58abd3c19cebffdfa44b8d6646435e
|
|
| BLAKE2b-256 |
54ec4ea789eb84fb63dc1f0b7aa3bcb138ecef2345a57d92793ec1c5ebe3d53c
|
Provenance
The following attestation bundles were made for voi_oiwer-0.1.2.tar.gz:
Publisher:
release.yml on JoshTalks/voi_oiwer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
voi_oiwer-0.1.2.tar.gz -
Subject digest:
91fcc7f705ac59ba0671a75a6eb89bc10551b54f9875ab06c7eef61001451297 - Sigstore transparency entry: 2130626599
- Sigstore integration time:
-
Permalink:
JoshTalks/voi_oiwer@f588604487fcc2206757b2ff3e9819b85b6e24db -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/JoshTalks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f588604487fcc2206757b2ff3e9819b85b6e24db -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a48af86bf86c830ea6fc9a8be37d295deca38577d4e64949445b5870912eefb5
|
|
| MD5 |
9cdd97446376c61775a4880a5e5a3d66
|
|
| BLAKE2b-256 |
2473e5cf77baabbb2a80f5f4dba7ef6f116d46a857e21f6bc01dd7d823d0e7ed
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
voi_oiwer-0.1.2-cp38-abi3-win_amd64.whl -
Subject digest:
a48af86bf86c830ea6fc9a8be37d295deca38577d4e64949445b5870912eefb5 - Sigstore transparency entry: 2130626834
- Sigstore integration time:
-
Permalink:
JoshTalks/voi_oiwer@f588604487fcc2206757b2ff3e9819b85b6e24db -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/JoshTalks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f588604487fcc2206757b2ff3e9819b85b6e24db -
Trigger Event:
push
-
Statement type:
File details
Details for the file voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 223.9 kB
- Tags: CPython 3.8+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3d3e299a7a112f258ae9b63ffb84c0d0546b1e70f4b193848f3aaa6db0551f9
|
|
| MD5 |
11f7676a4233400b5ea1abbb57d15ee4
|
|
| BLAKE2b-256 |
fac59b6358890a9ee0fe64e7350fecebeb1be9880c28aa07bf2f12ee4c78f9e8
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
b3d3e299a7a112f258ae9b63ffb84c0d0546b1e70f4b193848f3aaa6db0551f9 - Sigstore transparency entry: 2130626667
- Sigstore integration time:
-
Permalink:
JoshTalks/voi_oiwer@f588604487fcc2206757b2ff3e9819b85b6e24db -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/JoshTalks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f588604487fcc2206757b2ff3e9819b85b6e24db -
Trigger Event:
push
-
Statement type:
File details
Details for the file voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 220.7 kB
- Tags: CPython 3.8+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
220f7048b07aab2134a5711f44fe145f96caf0f1b8a0e78199345967e411b58e
|
|
| MD5 |
7d02a235e03d30e2e55a9a4a125af33d
|
|
| BLAKE2b-256 |
a098e7e1fe2b3c724c9ed6e919ca4796a38dd23f86f24511ac7662a848475d1b
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
voi_oiwer-0.1.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
220f7048b07aab2134a5711f44fe145f96caf0f1b8a0e78199345967e411b58e - Sigstore transparency entry: 2130626896
- Sigstore integration time:
-
Permalink:
JoshTalks/voi_oiwer@f588604487fcc2206757b2ff3e9819b85b6e24db -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/JoshTalks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f588604487fcc2206757b2ff3e9819b85b6e24db -
Trigger Event:
push
-
Statement type:
File details
Details for the file voi_oiwer-0.1.2-cp38-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: voi_oiwer-0.1.2-cp38-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 207.6 kB
- Tags: CPython 3.8+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
676e3a5bf0f889dfbe04675b9fdd8c896c39c44a38b0e3e45cc436bf685446ea
|
|
| MD5 |
cb432d3a8c3e25138214b3303dcdb26a
|
|
| BLAKE2b-256 |
b74def55e93add1684f35b68405f1daa646425d6bd4cf94688d3c86c1043eef4
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
voi_oiwer-0.1.2-cp38-abi3-macosx_11_0_arm64.whl -
Subject digest:
676e3a5bf0f889dfbe04675b9fdd8c896c39c44a38b0e3e45cc436bf685446ea - Sigstore transparency entry: 2130626958
- Sigstore integration time:
-
Permalink:
JoshTalks/voi_oiwer@f588604487fcc2206757b2ff3e9819b85b6e24db -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/JoshTalks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f588604487fcc2206757b2ff3e9819b85b6e24db -
Trigger Event:
push
-
Statement type:
File details
Details for the file voi_oiwer-0.1.2-cp38-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: voi_oiwer-0.1.2-cp38-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 214.7 kB
- Tags: CPython 3.8+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c25bba7ff193f8bb437aa55b42edd1b0e7237b42c85dbdd8b75af1da7ccd466d
|
|
| MD5 |
ae16405bdaf22c5d7a1b8a420fcb2107
|
|
| BLAKE2b-256 |
99cb45dffeb366ff1c0013bf81de20ab5fd78301b09025538219973f25ddea8b
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
voi_oiwer-0.1.2-cp38-abi3-macosx_10_12_x86_64.whl -
Subject digest:
c25bba7ff193f8bb437aa55b42edd1b0e7237b42c85dbdd8b75af1da7ccd466d - Sigstore transparency entry: 2130626758
- Sigstore integration time:
-
Permalink:
JoshTalks/voi_oiwer@f588604487fcc2206757b2ff3e9819b85b6e24db -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/JoshTalks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f588604487fcc2206757b2ff3e9819b85b6e24db -
Trigger Event:
push
-
Statement type: