Reference

Decision log

The problems met along the way, in order, with what was found and what was decided. Several of them changed the results, so they are part of the scientific record, not just engineering trivia.

  1. 1. Models had to shrink to fit the GPU

    Problem. The configured defaults (Whisper-large-v3 plus Qwen2.5-7B-Instruct) need roughly 3 GB + 15 GB in fp16 and both stay resident. The GPU is an 8 GB RTX 4060 Laptop with about 6.5 GB free.

    Decision. Use a small ASR and Qwen2.5-1.5B-Instruct (about 3 GB). The README and config.yaml now say why.

    Effect. Absolute quality is lower than a larger pair would give. The LLM's factual weakness is a direct consequence.

  2. 2. General whisper-small wrote the wrong script

    Problem. The first full clean run (with openai/whisper-small, Telugu forced) finished 129/129 but with corpus WER 2.56 and CER 2.69. Sample inspection showed Telugu audio transcribed into Devanagari/Hindi-looking script (for example the question "What is Telangana's capital?" came back as phonetically similar Hindi script), and some clips looped on a repeated token.

    Finding. A capability gap in the smallest general multilingual Whisper on a low-resource language, not a bug in the code.

    Decision. Switch to vasista22/whisper-telugu-small, a Telugu-only fine-tune of the same size. Discard the first run's numbers.

    Effect. Corpus WER fell from 2.56 to 0.293. A WER above 1 should always be inspected, not reported.

  3. 3. The Telugu fine-tune rejects language and task

    Problem. Loading the fine-tune and calling the pipeline raised ValueError: The generation config is outdated and is thus not compatible with the language argument to generate.

    Investigation. Reproduced identically on transformers 5.15.0 and, after downgrading, 4.57.6, so it is a property of this checkpoint's generation_config.json (see transformers issue 25084), not of the library major version. A direct test without language/task transcribed correctly.

    Decision. Make language optional in ASRWrapper: falsy means "pass neither". Set asr.language: null. Relax verify_task2.py to accept null only when the model name contains "telugu", and update its tests.

  4. 4. The transformers version pin

    Problem. The environment had transformers 5.15.0; requirements.txt said <5, and verify_task2.py flagged it.

    Decision. The pin was first relaxed to <6. After issue 3 the environment was downgraded to 4.57.6 to rule the version out; the final evaluations ran on 4.57.6 and the pin stays >=4.45,<6.

    Side effect. Downgrading in a shared global Python environment conflicts with an unrelated installed package (sentence-transformers 6 requires transformers 5). It does not affect this project, but a virtual environment would have avoided it.

  5. 5. 8 dB noise produced no bottleneck

    Problem. The noisy corpus at 8 dB SNR scored WER 0.2913 vs. 0.2928 clean: no degradation, so nothing for a denoiser to fix.

    Decision. Regenerate the noisy corpus at 0 dB (--skip-clean was added so the validated clean corpus stayed untouched). WER rose to 0.3377.

    Effect. A measurable bottleneck now exists. This choice is disclosed because it was made to create the bottleneck, not discovered.

  6. 6. The denoiser did not help, so it was swept, then reported as is

    Problem. At default settings denoising left WER unchanged (+0.001).

    Check. A quick 25-question, ASR-only sweep of mild vs. aggressive subtraction (aggressive was worse). A waveform check confirmed the filter works at signal level.

    Decision. Stop tuning and report a negative result with intervals, rather than searching until something wins on a small set.

  7. 7. Clean and noisy corpora are not matched recordings

    Problem. The TTS model's duration prediction is not seeded; re-synthesizing yields a different waveform for the same text. A waveform comparison revealed it (clean and noisy clips had different lengths).

    Decision. Not redone, for time. Documented instead, and the extension's conclusion is anchored on the baseline-vs-denoised comparison, which is matched (same audio, one flag). The paired bootstrap shows the clean-vs-noisy gap is real regardless.

  8. 8. Pinning model revisions partly failed

    Problem. Trying to pin vasista22/whisper-telugu-small to the hash in the cache broke loading: OSError: ... does not appear to have a file named model.safetensors. The cache held two snapshots for the same main: the tokenizer and config files under one commit, the weights under another.

    Decision. Leave that one checkpoint at main, with a comment; pin Qwen (989aa798...), whose snapshot was consistent. This is listed under Limitations.

  9. 9. Hallucination rate was missing, then made precise

    Problem. The requirements name a hallucination rate; the first report had only word-overlap F1 and a qualitative note.

    Decision. Add hallucination.py: a three-way classifier against the single fact in each reference answer. The first version scored every answer as hallucinated. Before trusting it, raw responses were inspected: they really did lack the fact, but 18 sum answers contained digits, so digit forms (whole-number matching) were added. Result: 0/129 correct from speech, 3/129 from human transcripts.

  10. 10. Confidence intervals

    Problem. Calling a difference "within noise" without an interval is not defensible.

    Decision. Add bootstrap.py (paired, by question). It confirmed the noise effect is real and the denoiser's is not.

  11. 11. Report packaging

    The Task 1 diagrams were first drawn in TikZ with two label overlaps that a first pass missed; they were found by zooming into the render and fixed by anchoring labels to node edges. The standalone reports were then merged into one ACL-style paper; wide figures had to be allowed on float pages or LaTeX stranded all of them at the end. Reports contain no Telugu script because plain pdflatex cannot render it; Telugu phrases appear in transliteration there, and in script on this site.

  12. 12. Process conventions

    Per AGENTS.md: commit each completed logical step with a concise Conventional Commits message, run appropriate checks first, and keep generated outputs, model caches, temporary dependencies and local reference documents out of version control. That is why outputs/, data/, corpus_*, .cache/, tmp/ and the reference PDFs are git-ignored.

Lessons that generalize