Dataset
No recorded Telugu corpus exists locally, so the evaluation set is synthesized: 129 template questions with exact reference answers, spoken by an open Telugu TTS model, in a clean and a noisy version.
Overview
| Size | 129 questions per condition (29 capitals + 100 additions). The requirement is at least 100. |
|---|---|
| Language | Telugu, Telugu script for text. |
| TTS model | facebook/mms-tts-tel (MMS, VITS-based), run through transformers' VitsModel. |
| Conditions | clean: synthesized audio as is. noisy: additive white Gaussian noise at 0 dB SNR. |
| Generator | synthesize_corpus.py |
| Why templates | Every reference answer states exactly one checkable fact, which makes correctness and hallucination testable without a human judge. See the hallucination metric. |
Question templates
29 state and country capitals
Pattern: question "<place> రాజధాని ఏది?" (What is the capital of <place>?), answer "<place> రాజధాని <capital>." This follows the example pattern given in the requirements. IDs are cap-001 to cap-029.
| # | Place | Telugu | Capital | Telugu |
|---|---|---|---|---|
| 1 | Telangana | తెలంగాణ | Hyderabad | హైదరాబాద్ |
| 2 | Andhra Pradesh | ఆంధ్రప్రదేశ్ | Amaravati | అమరావతి |
| 3 | Tamil Nadu | తమిళనాడు | Chennai | చెన్నై |
| 4 | Karnataka | కర్ణాటక | Bengaluru | బెంగళూరు |
| 5 | Kerala | కేరళ | Thiruvananthapuram | తిరువనంతపురం |
| 6 | Maharashtra | మహారాష్ట్ర | Mumbai | ముంబై |
| 7 | Gujarat | గుజరాత్ | Gandhinagar | గాంధీనగర్ |
| 8 | Rajasthan | రాజస్థాన్ | Jaipur | జైపూర్ |
| 9 | Punjab | పంజాబ్ | Chandigarh | చండీగఢ్ |
| 10 | West Bengal | పశ్చిమ బెంగాల్ | Kolkata | కోల్కతా |
| 11 | Bihar | బీహార్ | Patna | పాట్నా |
| 12 | Odisha | ఒడిశా | Bhubaneswar | భువనేశ్వర్ |
| 13 | Madhya Pradesh | మధ్యప్రదేశ్ | Bhopal | భోపాల్ |
| 14 | Uttar Pradesh | ఉత్తరప్రదేశ్ | Lucknow | లక్నో |
| 15 | Haryana | హర్యానా | Chandigarh | చండీగఢ్ |
| 16 | Assam | అస్సాం | Dispur | దిస్పూర్ |
| 17 | Chhattisgarh | ఛత్తీస్గఢ్ | Raipur | రాయ్పూర్ |
| 18 | Jharkhand | జార్ఖండ్ | Ranchi | రాంచీ |
| 19 | Goa | గోవా | Panaji | పనాజీ |
| 20 | Sikkim | సిక్కిం | Gangtok | గ్యాంగ్టక్ |
| 21 | Manipur | మణిపూర్ | Imphal | ఇంఫాల్ |
| 22 | Meghalaya | మేఘాలయ | Shillong | షిల్లాంగ్ |
| 23 | Nagaland | నాగాలాండ్ | Kohima | కోహిమా |
| 24 | Tripura | త్రిపుర | Agartala | అగర్తలా |
| 25 | Mizoram | మిజోరం | Aizawl | ఐజ్వాల్ |
| 26 | Arunachal Pradesh | అరుణాచల్ ప్రదేశ్ | Itanagar | ఇటానగర్ |
| 27 | Uttarakhand | ఉత్తరాఖండ్ | Dehradun | డెహ్రాడూన్ |
| 28 | Himachal Pradesh | హిమాచల్ ప్రదేశ్ | Shimla | షిమ్లా |
| 29 | India | భారతదేశ | New Delhi | న్యూఢిల్లీ |
100 addition problems
Every ordered pair (a, b) with a and b from 1 to 10, spoken with Telugu number words, so sums run from 2 to 20. IDs are sum-001 to sum-100. Pattern: question "<a> మరియు <b> కలిపితే ఎంత వస్తుంది?" (what do a and b make together?), answer "<a> మరియు <b> కలిపితే <sum> వస్తుంది."
Number words are spelled out (not digits) so the TTS pronounces them naturally. Both orders of each pair appear, which adds variety without new vocabulary.
| n | Telugu | n | Telugu | n | Telugu | n | Telugu |
|---|---|---|---|---|---|---|---|
| 1 | ఒకటి | 6 | ఆరు | 11 | పదకొండు | 16 | పదహారు |
| 2 | రెండు | 7 | ఏడు | 12 | పన్నెండు | 17 | పదిహేడు |
| 3 | మూడు | 8 | ఎనిమిది | 13 | పదమూడు | 18 | పద్దెనిమిది |
| 4 | నాలుగు | 9 | తొమ్మిది | 14 | పదనాలుగు | 19 | పందొమ్మిది |
| 5 | ఐదు | 10 | పది | 15 | పదిహేను | 20 | ఇరవై |
synthesize_corpus.py, and the sums are computed, so a reference answer cannot be wrong by construction. They are template-generated, not reviewed by a Telugu linguist; a grammatical wrinkle in a phrase would be in the template, not random.The noisy condition
Zero-mean Gaussian noise is added to the clean waveform at a fixed signal-to-noise ratio:
noise_power = signal_power / 10^(snr_db / 10)
noisy = clean + Normal(0, sqrt(noise_power))
if max(|noisy|) > 1: noisy = noisy / max(|noisy|) # avoid clipping
At 0 dB, noise power equals signal power. The noise generator is seeded (numpy seed 42), so the same noisy waveform is produced for the same clean waveform.
TARGET_SNR_DB = 8.0); the reported results pass --snr-db 0.File formats
Synthesized corpus folder
corpus_clean/ and corpus_noisy/ use prepare_data.py's sidecar format, one triple per question:
corpus_clean/
question_cap-001.wav audio (sample rate = the TTS model's rate)
question_cap-001.txt reference transcript = the spoken question
question_cap-001.response.txt reference answer
...
question_sum-100.{wav,txt,response.txt}
Evaluator manifest
prepare_data.py --limit 0 turns a folder into data/test_clean.json / data/test_noisy.json plus a .metadata.json. Each row:
{
"id": "te-000001",
"audio_path": "../corpus_clean/question_cap-001.wav",
"ground_truth_transcript": "...",
"ground_truth_response": "...",
"response_source": "provided"
}
idiste-NNNNNNby position in the sorted source listing (the folder format carries no ID of its own). The originalcap-/sum-label survives in the audio file name, whichhallucination.pyrelies on.audio_pathis relative to the manifest's directory.response_sourceisprovidedfor every row here. Aplaceholdermode exists for plumbing tests only; it fills missing answers with a fixed string and marks the dataset as not valid for response-quality scoring. None is used here (0 placeholders).- Selection is reproducible (seeded) and validation stops on missing audio, duplicate audio or IDs, or empty labels instead of silently dropping samples.
Clean and noisy are not matched recordings
The noisy corpus is not the clean audio plus noise. The TTS model's duration prediction is not seeded, and the noisy set was regenerated once at the harsher SNR, so each condition is an independent rendering of the same text. Consequences:
- The clean-vs-noisy WER gap includes natural TTS rendering variance, not noise alone. The paired bootstrap over questions still shows the gap is real.
- The baseline-vs-denoised comparison is exactly matched: both runs read the identical
corpus_noisy/files and differ only in theasr.denoiseflag. The extension's conclusion rests on that comparison.