malaysia-ai/Low-Language-TTS
Low-Language-TTS A held-out TTS/ASR test set for the long tail of malaysia-ai/Multilingual-TTS: 50 of the lowest-resource languages in that corpus, 25 utterances each (1250 rows, 2.56 hours). Every row carries the three things needed to score a NeuCodec speech-token model without touching the parent corpus: column what audio the original clip, exactly as stored upstream (mostly mp3) tokens NeuCodec speech tokens at 50 tokens/s — the <|s_N|> ids the Multilingual-TTS… See the full description on the dataset page: https://huggingface.co/datasets/malaysia-ai/Low-Language-TTS.
Low-Language-TTS
A held-out TTS/ASR test set for the long tail of malaysia-ai/Multilingual-TTS: 50 of the lowest-resource languages in that corpus, 25 utterances each (1250 rows, 2.56 hours).
Every row carries the three things needed to score a NeuCodec speech-token model without touching the parent corpus:
How the languages were picked
Ranking the corpus' GlotLID histogram and taking the rarest labels does not work, and this was measured: of the 500 rarest labels, exactly 3 survived row-level verification. Short transcripts are misclassified constantly (a three-word Hausa line lands on wnc_Latn) and und_<script> labels are punctuation false positives, so that tail is detector noise, not languages.
A language is instead taken seriously when some subset of the corpus was collected for it — at least 50 rows and at least 40% of that subset. 177 of the 2,100 labels clear that bar, and they rank into a genuine low-resource tail. The 50 with the fewest rows in the parent corpus that can still fill 25 verified utterances are what you see here.
Individual rows are then verified too, because a subset's minority rows are not its language. A row is kept only when
- the normalized transcript is >= 40 characters and >= 5 words (characters instead of words for scripts written without spaces), long enough for GlotLID to be reliable,
- re-running GlotLID v3 reproduces the stored label with probability
= 0.9 and top1-top2 margin >= 0.5,
- NeuCodec tokens exist for the clip and decode to 50-1500 tokens (1-30s),
- the transcript has no more words than speech tokens,
- the decoded audio length and
len(tokens) / 50agree to within 20% — audio and tokens live in different zips upstream, and this is what catches a mispairing.
Rows are deduplicated by text and spread over speakers (4 per speaker, relaxed only when a language would otherwise not reach 25 — much of the tail is single-speaker corpora). On long, confident rows the stored and re-predicted labels agree 97-99% of the time, so the language tag here is considerably more trustworthy than the parent corpus' raw language column.
Languages
corpus rows is how many rows that language has in the whole 121.8M-row parent corpus.
Usage
from datasets import load_dataset
ds = load_dataset('malaysia-ai/Low-Language-TTS', split='test')
row = ds[0]
row['audio']['array'], row['tokens'], row['post-normalized'], row['language']Built by low-language-testset/build_testset.py in the Multilingual-Speech-Model repo, from malaysia-ai/Multilingual-TTS (audio + NeuCodec tokens) and malaysia-ai/Multilingual-TTS-language (language + normalized transcription).
