The dataset checklist to run before speech recognition training starts
Transcript conventions, segment lengths, speaker-disjoint splits, and duplicate checks. The work that decides whether training converges on anything.
Training scripts are rarely the reason a speech model fails to converge on anything useful. The reason is almost always upstream: two people transcribed the same corpus under two different conventions, the same speaker appears in both the training and the test split, or half the segments cut through the middle of a word.
This is the checklist worth running over a corpus before it goes into a training run, whether it was collected in house or bought.
Write the transcript convention down
Every corpus has a convention whether or not anyone wrote it down, and an undocumented convention is really several conventions wearing one name. The decisions that matter:
- Verbatim or cleaned. Verbatim keeps filler words, false starts, and repetitions; cleaned removes them. Both are defensible. A corpus that contains both, because different annotators chose differently, is not.
- Partial words. A cut-off word is usually marked with a single trailing hyphen, so the model can learn to emit something for it rather than being asked to produce a whole word that was never spoken.
- Non-speech sounds. Decide whether laughter, coughing, and background speech appear as bracketed tags or not at all, and if they appear, fix the tag list. A free-form tag list becomes a vocabulary of one-off tokens that the model can never learn.
- Numbers and abbreviations. Writing them as spoken, "twenty three" rather than "23", keeps the transcript faithful to the audio and puts written-form conversion in a separate, testable step. Whichever way the choice goes, the same rule has to apply to the test set, or the evaluation measures the convention difference instead of the model.
- Code-switching and loanwords. Fix which script each language is written in and mark the switch point, or the same utterance will be written three ways by three annotators.
Segment lengths, and the edges
A workable training band is roughly two to twenty seconds per segment. The floor exists because very short segments waste compute on padding and can break sequence losses when the transcript is longer than the model has output frames for. The ceiling exists because long segments make batches ragged and put more of the transcript at risk from a single truncation.
The edge rule matters more than the band: never cut inside a word, and make the transcript match the segment exactly. A segment whose audio contains a word the transcript omits is a mislabeled example, and it is the most common silent defect in a corpus that was cut by an automatic tool. Two checks catch most of it. The last word of each segment should end in silence, and the sum of the segment durations should account for the whole file with no unexplained gaps.
If the toolchain supports offsets, keeping the original long recordings and pointing at segments in the manifest beats cutting files. Segments can be re-derived after a rule changes; cut files cannot be un-cut.
Split by speaker, not by file
The most expensive mistake on this list is splitting a corpus by file or at random. If the same speaker appears in the training and validation splits, the validation number is optimistic in a way that does not surface until deployment, because the model has memorized the voice and will look better on that voice than on anyone else. Group every recording of a speaker into one split, and hold out whole speakers.
Where recordings come from sessions, the same room and microphone and day, keep sessions intact as well, because the recording conditions leak across a split the same way the voice does. With a small speaker pool this can leave a validation set too small to be reliable. The honest response is to report the split policy next to every number, so that nobody compares a speaker-disjoint word error rate against a random-split one and concludes the wrong model won.
Deduplicate before you split
Duplicates are common in corpora that grew by merging sources, and they do two kinds of damage: they inflate the apparent size of the training set, and when a duplicate pair straddles the split boundary the test set contains material the model trained on. Run the pass before the split, not after.
- Transcript duplicates: normalize the text, then group by exact match, ignoring utterances below a word-count threshold so that legitimate short utterances are not collapsed into one.
- Acoustic near-duplicates: compute a fixed-length embedding per utterance, compare within the corpus, and review a sample of the pairs above a similarity threshold. This catches the same prompt read twice and the same interview segment reused across two sources.
- Reused background: the same room tone or the same background recording under different speakers is not a duplicate, but it teaches the model the room instead of the voice. If it is widespread, record it in the metadata so it can be spread across the splits deliberately rather than by accident.
The manifest, and the assertions that run on every build
One row per segment: audio path, duration, transcript, speaker identifier, language, session, and a source field for licensing. Then the checks that run every time the manifest is rebuilt, failing loudly and counting violations rather than stopping at the first.
- Every audio file exists, and its duration matches the declared duration within a tolerance.
- No transcript is empty, and the character inventory of the training split covers the validation and test splits.
- No speaker identifier and no session identifier appears in more than one split.
- Hours per speaker sit within a sane band. One speaker contributing a large share of the total is a generalization risk, not a bonus.
- The manifest is versioned, so any reported word error rate can be traced back to the exact data that produced it.