technology

Introducing the Malaysian Speech Benchmark Dataset

A human-annotated evaluation dataset for Malaysian Malay speech: 1,899 samples across 12 domains, why it ships as a public and a private split, and what it cannot do.

Revolab Team · 5 August 2026 · 9 min read
The speech benchmark Malaysia never had. Revolab ASR Benchmark: 1,899 audio samples, 12 speech domains, 4.08 hours of labelled speech.

Most global speech recognition benchmarks have no category for a Malaysian call centre, because nobody built one. Vendors publish a word error rate that is technically true for the conditions it was measured on, and those conditions are almost always clean, single-language, well-recorded speech. They are not a Bahasa Malaysia and English conversation running over a compressed 8 kHz phone line with a call centre floor in the background.

We hit that gap directly while building voice AI for Malaysian customers. Models that looked state of the art on paper fell apart on real calls, and no public benchmark would have warned us. So we built one. Today we are releasing the Revolab ASR Benchmark, a human-annotated evaluation dataset for Malaysian Malay speech,

1,899

Audio samples

4.08 h

Labelled speech

12

Speech domains

820 / 1,079

Public / private split

What the dataset is

The benchmark is a human-reviewed evaluation set for Malaysian Malay speech recognition, published as two companion datasets on HuggingFace. The public split is there so anyone can download real Malaysian audio and run their own evaluation. The private split stays with us, and produces the numbers on our leaderboard, which we are launching shortly.

Every row in both datasets has the same shape:

sample.jsonjson
{
  "audio": <waveform>,
  "text": "Yes, my unit number is 2105.",
  "normalized_text": "Yes, my unit number is two one zero five.",
  "category": "telephony",
  "canonical": {"yes": ["ya", "yah", "yeah", "yep"]}
}
ℹ️

About the clips on this page

Every audio sample below is role-played, not a real customer call. The account numbers and unit numbers you hear are invented for the example. No recording of an actual customer appears anywhere in this post or in the public split.

▶  Sample row · telephony · role-played

“Yes, my unit number is 2105.”

Audio, a human-verified transcript, a normalised version of that transcript, the domain it came from, and a map of word variants that should score as correct. Nothing hidden, including on the private side. Anyone with access can see exactly how a score was produced, even without being able to download the audio.

Key Takeaway

The goal is a benchmark that predicts real deployment performance on Malaysian speech, not the hardest benchmark possible and not the easiest. That is why telephony compression and code-switching are in the set instead of more read speech.

How we built it

Two of the twelve domains, FLEURS and Common Voice, come from existing multilingual corpora. Telephony and short inputs were each built differently for reasons specific to them. The remaining eight do not exist anywhere as ready-made Malaysian Malay datasets, so we built them domain by domain:

  1. Pick the target domain first. We decided upfront which conditions needed stress-testing, then went looking for audio that fit, not the other way around.
  2. Collect audio for that domain: publicly available Malaysian-language audio that matched it, with parliamentary proceedings for parliament, broadcast media for news, podcast recordings for podcast.
  3. Sample randomly. Short clips drawn at random rather than hand-picked for clean audio. A benchmark built from cherry-picked recordings measures nothing useful.
  4. Label against a written guideline. Every clip transcribed by a human following a shared style guide covering spelling, code-switched words, abbreviations and punctuation. Anything the annotator flagged was rechecked by a second reviewer.
  5. Split public and private. Each labelled domain was divided into a public portion and a larger held-back portion that scores the leaderboard.
How each domain was built
01
Collect
public Malaysian
audio, by domain
02
Sample
at random, never
hand-picked
03
Label
human, against a
written guideline
820
PUBLIC
1,079
PRIVATE · EVAL-ONLY

The two domains that broke the pipeline

Telephony could not follow that process, and the reason is privacy. The private split's telephony samples are real production call centre recordings, the actual calls our voice AI work is built around, which is exactly why they cannot be released. For the public split we had people role-play the same kind of support conversations, then ran those recordings through the same telephony compression as the real calls. Same acoustic conditions, same domain, not a single real customer conversation in the public release.

TELEPHONY — TWO SOURCES, ONE ACOUSTIC PROFILE PRIVATE SPLIT Real call centre audio 8 kHz codec same conditions Not distributed PUBLIC SPLIT Role-played by people 8 kHz codec same conditions CC-BY-4.0
Both splits pass through the same compression. Only the private split contains real customer conversations, which is why it stays private.

Short inputs is different again. Rather than collecting single words from existing recordings, we generated it with text to speech: the one-breath account confirmations, digits and command-style utterances a real caller produces. Because the audio is generated from the text, the reference is known by construction, with no manual transcription step.

Why these twelve domains

None were picked at random. Each one stresses a different failure mode we have seen in production speech systems.

DomainWhy it is in the set
TelephonyCompressed 8 kHz support and IVR audio. The single most important condition for real deployments.
PodcastLong-form, unscripted conversation with natural disfluencies.
ParliamentFormal register, dense with names and legislative vocabulary.
NewsClear, professionally delivered speech, still locally accented.
AnimationHighly expressive voice acting with unusual prosody.
SingingExtreme pronunciation and rhythm variation. Deliberately adversarial.
Street interviewOutdoor ambient noise with spontaneous speech.
Short inputsSingle words and commands, the utterances that trigger hallucination.
DramaEmotionally inflected, scripted dialogue.
Read speechClean, controlled recordings. The baseline every model should pass.
FLEURSGoogle's multilingual benchmark, for comparability with published literature.
Common VoiceMozilla's crowdsourced corpus, contributing speaker diversity.
Stacked horizontal bar chart of sample counts per domain, split between public and private. Telephony is largest at 229 samples; FLEURS and Common Voice are public only.
Sample distribution across 12 domains. Source: Revolab ASR Benchmark.
DomainPublicPrivateTotal
Telephony66163229
Drama52104156
News52104156
Parliament52103155
Podcast52103155
Short inputs52103155
Read speech51103154
Singing51101152
Animation50100150
Street interview4895143
FLEURS153153
Common Voice141141
Total8201,0791,899
Doughnut chart of how the twelve domains were sourced: eight collected and labelled by Revolab, one built for privacy, one generated with text to speech, two external corpora.
Provenance of the twelve domains.

Languages are Bahasa Malaysia and English, including the code-switching between them that is completely ordinary in everyday Malaysian speech. Audio is 16 kHz in the public split and 24 kHz in the private split.

Two transcripts per row, and why

Each row carries the transcript twice. text is what the annotator wrote verbatim, with numerals and currency in their natural written form. normalized_text renders the same utterance the way it was actually spoken.

One utterance, two references
WRITTEN  text
“I dah bayar lah, RM950 ni.”
SPOKEN  normalized_text
“I dah bayar lah, sembilan ratus lima puluh ringgit ni.”

▶  Written vs spoken · currency · role-played

“I dah bayar lah, RM950 ni.”

This matters most in telephony, where callers read out account numbers, IC numbers and reference codes digit by digit:

Raw (text)

"102105"

Normalized

"One zero two one zero five."

▶  Written vs spoken · digits · role-played

“102105” → “one zero two one zero five”

A model that transcribes "102105" as "one zero two one zero five" scores correctly against the normalised reference instead of being penalised for not guessing the exact numeral formatting an annotator happened to type. Both fields ship in every row, so whoever is scoring picks the comparison that suits their use case.

Canonical variants

Every row also carries a canonical field: a map from each reference word to the other spellings that mean the same thing and should score as correct. A caller who says "okay" might be transcribed "ok", "oke" or "okey", and all of them are the same word.

Same word, different spelling
REFERENCE
“okay”
ok
oke
okey
all scored correct — not a substitution error

▶  Canonical variants · role-played

“okay” — also scores ok / oke / okey

This comes up constantly in Malaysian speech. English loanwords with several accepted spellings ("hello" and "helo"), Malaysian versus Indonesian pairs ("kerana" and "karena"), colloquial contractions ("ni" and "ini"), and filler words transcribed inconsistently ("ah", "aa", "err") all appear in the canonical map. Without it, a model that hears the word correctly but prefers a different accepted spelling is penalised for something that is not an error.

Why the split is deliberately lopsided

1,899 samples, split on purpose
0
0
Public
open for download
Private
eval-only · never distributed

We put more samples in the private split than the public one. Leaderboard integrity matters more to us than public convenience: a larger hidden evaluation set gives a more reliable estimate of real-world performance and makes overfitting to the test set substantially harder. The public split exists so the community is not left guessing. It is real, representative audio, just not the exact set we score against.

ℹ️

The split is rolling

We keep collecting, sampling and labelling new audio into the private set, and periodically retire older private samples out into the public release. The private evaluation set stays fresh rather than going stale, and the public dataset keeps growing instead of freezing at whatever it looked like on release day.

Limitations

We would rather say this plainly than let someone discover it the hard way.

  • Covers Malaysian Malay and English code-switching only. No other regional languages yet.
  • Accent coverage reflects what we could source from public audio, not an exhaustive survey of every Malaysian dialect.
  • 4.08 hours is enough to evaluate against, not to train a model from scratch.
  • Not a training corpus. The private split's licence explicitly forbids it, precisely so it stays trustworthy as an evaluation set.
  • Twelve domains is broad, not exhaustive. It will not cover every deployment scenario.
  • Short inputs is text to speech, not real recorded speech. Useful for testing hallucination on brief utterances, not a substitute for how short utterances actually sound.
  • Public telephony is role-played. We matched the acoustic conditions closely, but the private split’s real call centre recordings remain the more faithful measure.

What we release

The Revolab ASR Benchmark is published as an annotation layer. Every transcript, normalised transcript, canonical variant map and domain label was produced by Revolab annotators working against a written guideline, with flagged samples rechecked by a second reviewer. That layer is released under CC-BY-4.0.

For the collected domains, the underlying recordings remain subject to their original terms, and the CC-BY-4.0 grant covers the annotations. Rights-holder enquiries can be sent to support@revolab.ai and we will action requests promptly.

Provenance varies by domain, so it is worth being specific. FLEURS (Google Research, CC-BY-4.0) and Common Voice (Mozilla Foundation) carry their own upstream terms, and those terms travel with the data. Two domains are Revolab-created rather than collected: the public telephony split is role-played by people we engaged, and short inputs is generated with text to speech.

ℹ️

Scope of the licence

CC-BY-4.0 covers the annotation layer. Recordings in the collected domains stay subject to their original terms. The private split is further restricted to evaluation: viewable and scorable, never training. We are open-sourcing the dataset, not model weights.

ℹ️

Leaderboard coming soon

We are launching the public leaderboard shortly: every model scored on the same 1,899 samples, with the private split producing the official numbers. If you would like a model included, get in touch.

What we hope happens next

We do not think of this as a finished artifact. Our hope is that it becomes something other teams working on speech AI in Southeast Asia can lean on, a shared and honest reference for what Malaysian speech actually sounds like, instead of everyone separately discovering the same gap the hard way.

We would like to see both datasets grow, with more domains, more hours, and more of the messy, code-switched, imperfect audio that global benchmarks leave out. And we would like to see the same public and private approach applied to the other languages of this region, because the underlying problem is not unique to Malaysia.

Good benchmarks shape research. By making Malaysian speech measurable under realistic conditions, we hope future systems get optimised for the conversations people actually have, not the recordings that happen to be easiest to recognise.

Sources and attribution

Eight of the twelve domains were collected, sampled and manually labelled by Revolab for this benchmark. Telephony and short inputs were built as described above. The remaining two are existing corpora we are grateful to build on: FLEURS from Google Research (CC-BY-4.0), included so results stay comparable with the wider literature, and Common Voice from the Mozilla Foundation (CC0), whose volunteer recordings contribute speaker diversity our own collected domains do not capture. Full attribution and licensing detail is on each dataset card.

Frequently Asked Questions

Is the Revolab ASR Benchmark free to use?+

The annotation layer — transcripts, normalised transcripts, canonical maps and domain labels — is released under CC-BY-4.0 across the 820-sample public split, free to use with attribution. For the collected domains, the underlying recordings remain subject to their original terms. The private split of 1,079 samples is further restricted to evaluation: it can be viewed and scored, but not used for training.

Why hold back a private split at all?+

A hidden evaluation set makes the leaderboard resistant to gaming. If every sample were public, models could be tuned against the exact audio used to score them, and the numbers would stop predicting real-world performance. The public split is real, representative audio so the community can still verify our claims independently.

Can I train a model on this dataset?+

No. At 4.08 hours it is sized to evaluate against, not to train from scratch, and the private split’s licence explicitly forbids training so it stays trustworthy as an evaluation set. We are open-sourcing the dataset for evaluation, not releasing model weights.

Why include singing in a speech recognition benchmark?+

Singing is deliberately adversarial. Pronunciation and rhythm vary far more than in speech, so it exposes breaking points that clean read speech never surfaces. It is there to find limits, not to represent a typical deployment.

How is a model scored if it spells a word differently?+

Each row carries a canonical map of accepted variants, so "ok" scores as correct against a reference of "okay". Each row also ships both a verbatim and a normalised transcript, so a model that writes out digits as words is not penalised for formatting.

Building voice AI for Malaysian speech?

See how the models on this benchmark perform on your own audio.

Book a Discovery Call →
#dataset#speech recognition#Malaysian speech#benchmark#open data#ASR