Parity and declared deviations
pstrain rebuilds stock SphinxTrain with a vendored C core and reimplemented orchestration. A parity experiment compares the two engines under pinned conditions. Configuration equality is not input equality: stage inputs, shard membership, reduction order, front-end settings, inventory policy, and checkpoint convention must be recorded or made identical for the claim being tested.
The Arctic benchmark pin records the end-to-end product measurement. The design records linked below define the narrower contracts behind each classified difference.
Declared register
Surface |
Classification |
pstrain posture |
Stock posture |
A parity experiment must pin |
|---|---|---|---|---|
Untied inventory |
Deliberate deviation with upstream-compatible and exhaustive alternatives |
Shipped default and live benchmark profile: |
First-pronunciation-observed inventory, equivalent to pstrain’s |
Multipron mode, inventory policy, dictionary, transcripts, and the produced untied mdef |
Training front end |
Deliberate deviation |
Dither and per-frame DC removal enabled |
Neither enabled |
Input audio, complete feature configuration, extractor identity, and produced feature bytes |
Alignment retry |
Deliberate deviation |
One wider-beam retry after a forward-final-state pruning failure |
No retry |
Normal beam, retry factor, failure policy, retry telemetry, and skipped-utterance identities |
Optional final silence |
Deliberate deviation |
Final transcript silence may consume zero frames |
Final silence must consume a frame |
Optional-final-silence setting, transcripts, alignment outcomes, and accepted frame counts |
Baum-Welch checkpoint representation |
Aligned |
Raw mixture-weight and transition-matrix accumulators are serialized; checkpoints copy those files unchanged |
Raw-count checkpoints; loaders normalize them |
Common pre-reload inputs, checkpoint bytes, loader path, and post-reload arrays |
Shard partition position |
Shipped default plus upstream-compatible alternative |
Shipped default |
Floor-sized leading shards and the entire remainder in the last shard |
|
Shard reduction order |
Aligned |
Ascending shard-index reduction, independent of worker completion order |
Ascending partition-index reduction |
Accumulator inputs and reduction order |
Vendored byte swapping |
Aligned safety fix |
Exact-width unsigned intermediates avoid undefined signed shifts while preserving output bits |
Signed shift expressions rely on implementation behavior |
Serialized model and feature bytes |
Alignment dictionary, dropped base pronunciation |
Deliberate deviation |
A word whose unsuffixed pronunciation is dropped for a phone the model does not define takes its first surviving alternative as its base entry and aligns over all of its surviving alternatives, with a warning, as multiple-pronunciation training does |
The aligner ends the process on the surviving alternative, so no utterance aligns |
Dictionary, model phone inventory, and the alignment outcomes of utterances using the word |
Vendored log-math conversion |
Aligned safety fix |
Log-to-linear conversions scale by 2^shift with |
Left shift of a negative log value, which is undefined |
Aligner model load and alignment scores |
Aligner CI-senone count |
Aligned safety fix |
The count of leading CI senones stops at the model’s senone count, with no output change |
Reads past the end of the senone table for a model with only CI senones |
Model definition |
Library alignment frame limit |
Deliberate deviation |
The library path aligns up to 32,768 frames per utterance and refuses a longer one before any work, with a message naming its frame count and the limit |
|
Utterance lengths, and which utterances are refused |
Forced-alignment retry acceptance |
Deliberate deviation |
After a final-state failure the library aligner retries once at the nominal beam divided by |
|
Nominal beam, retry factor, acceptance target or supplied threshold, the calibration sample, and which recoveries were accepted or rejected |
Alignment score range |
Deliberate deviation |
Phone, word and total scores beyond the int32 range saturate at the range edge |
Such scores wrap around |
Segment lengths and the reported phone, word and total scores |
Inventory under multiple pronunciations
The shipped pstrain default is transcript-reachable when multipron training
is enabled, as it is by default, and the live Arctic evidence is measured under
that policy. It follows the pronunciation graphs consumed by multipron
Baum-Welch, covering contexts from every usable pronunciation without
allocating the complete phoneset cross-product produced by all-triphone.
Unlike stock SphinxTrain’s first-pronunciation-observed inventory, represented
by pstrain’s linear policy, it does not omit contexts that are reachable only
through alternative pronunciations. Stock SphinxTrain does observe only the
first pronunciation while producing its untied inventory, even when later
training uses pronunciation alternatives. Within a configuration layer, an
explicit inventory is honored. However, a later layer that sets
multipron_training=false without also setting an inventory triggers the
resolver’s linear auto-substitution and can override the earlier explicit
choice. This is a known pre-existing resolver behavior tracked as a follow-up.
The inventory producer and its interaction with training mode are specified in
multiple-pronunciation training.
Training front-end boundary
pstrain trains with dither and DC removal enabled; stock SphinxTrain trains with neither. A localized boundary effect was measured out-of-tree, so its numeric estimate is not part of the checked-in evidence. The remainder is UNEXPLAINED. Different tree inputs and Gaussian artifacts remain hypotheses, not separately demonstrated mechanisms; the available measurement does not justify attributing the WER movement to either one.
Alignment recovery and final silence
The product defaults recover once with a wider forward beam and allow final
transcript silence to consume zero frames. Stock SphinxTrain has no retry and
requires final silence to consume a frame. Under pstrain’s defaults,
arctic_a0587 trains without a skip. Experiments intended to mirror stock must
set training.retry_beam_factor=1, training.failed_alignment=omit, and
training.optional_final_silence=false. The omit policy is required because
disabling retry under the shipped recover policy aborts on a final-state
failure instead of reproducing stock’s report-and-omit behavior. These are
comparison controls, not the product posture. The runtime guarantees are
detailed in
failed-alignment policy and
optional final silence.
Checkpoints, sharding, and reduction
Current pstrain serializes raw mixture-weight and transition-matrix accumulators, and checkpoint creation copies those model files unchanged. Loaders normalize them before use, matching the stock checkpoint convention. The normalization contract is recorded in Baum-Welch normalization policy.
The shipped pstrain sharding.partition_position=remainder-first policy gives
one extra utterance to each leading shard. Stock SphinxTrain uses floor-sized
leading shards and assigns the entire remainder to the last shard; parity arms
can select that behavior with remainder-last. The default remains unchanged.
In the measured 1,042-utterance, eight-shard input, the two shapes were
131,131,130,130,130,130,130,130 and
130,130,130,130,130,130,130,132, moving 13 utterances between adjacent
shards without changing manifest order or coverage.
Production reduction was already deterministic before this option: worker results and accumulator directories are ordered by ascending shard index before the vendored reducer is called, independently of completion order. When shard membership and reduction order are matched, accumulation is byte-identical. With different grouping, non-associative floating-point addition supplies a real but controllable seed. pstrain’s guarantees and limits are recorded in Baum-Welch sharding contract.
Dropped base pronunciations in the alignment dictionary
The alignment dictionary loader drops a pronunciation that uses a phone the
acoustic model does not define. Upstream, when the dropped pronunciation is a
word’s unsuffixed one and an alternative such as word(2) survives, the loader
ends the process on that alternative (“Missing base word”), so no utterance
aligns, including utterances that never use the word. The training loader
behaves differently: it keeps the surviving alternatives under the word, and
multiple-pronunciation training, the default, trains over all of them.
pstrain’s alignment loader deliberately follows training. The first surviving alternative read after the dropped line becomes the word’s base entry, the unsuffixed spelling in a transcript reaches it, and later alternatives link to it as usual. The word therefore aligns over all of its surviving alternatives and the best-matching one wins, as in multiple-pronunciation training. The loader warns that it has done so. The pre-run phone report still lists the dropped pronunciation and says the word is aligned over its surviving alternatives.
The change is confined to a base that was read and dropped from the same dictionary file as the alternative, so a main-dictionary word never lands in the filler range. An alternative read before any unsuffixed line for its word, including a dictionary that never has one, or one whose dropped base is in the other file, still ends the aligner as it does upstream.