Fix for #1220 (PR #1367) was reintroduced by #1386 — wildcard alignment code is back in v3.8.3+
Author: bansal-sidCreated Jul 11, 2026Updated Aug 15, 2026
PR #1367 fixed #1220 by removing the wildcard-column CTC scoring mechanism introduced by #986. That fix shipped cleanly in v3.8.2 only. PR #1386 (merged for v3.8.3, closing #1372) reintroduced the same wildcard-column mechanism verbatim to restore timestamps for digit/punctuation-only words. As a result, the code #1367 removed is present again in v3.8.3 through v3.8.6 (current latest at time of writing).
Versions checked
Verified by diffing whisperx/alignment.py at each GitHub release tag
for has_wildcard / wildcard_col / get_wildcard_emission:
| Version | Wildcard code present? |
|---|---|
| v3.8.1 | Yes (original #986/#1220 state) |
| v3.8.2 | No — #1367 fix present, clean |
| v3.8.3 | Yes — reintroduced |
| v3.8.4 | Yes |
| v3.8.5 | Yes |
| v3.8.6 | Yes (confirmed against installed PyPI package, byte-identical to the GitHub tag) |
Root cause
Commit 39aa9f5 (PR #1386, closing #1372) re-adds:
has_wildcard = any(c not in model_dictionary for c in text_clean)
if has_wildcard:
non_blank_mask = torch.ones(emission.size(1), dtype=torch.bool)
non_blank_mask[blank_id] = False
wildcard_col = emission[:, non_blank_mask].max(dim=1).values
emission = torch.cat([emission, wildcard_col.unsqueeze(1)], dim=1)
wildcard_id = emission.size(1) - 1
tokens = [model_dictionary.get(c, wildcard_id) for c in text_clean]
This is the exact code PR #1367 removed. PR #1386's description states:
Unlike PR #986, this doesn't rewrite get_trellis or backtrack,
avoiding the regression that caused #1220.
That's true only with respect to the get_trellis/backtrack rewrite
(one of #986's three original changes). The wildcard-scoring change
itself — the part #1367 also removed — is back, unconditionally, for
any segment containing a character outside the alignment model's
vocabulary (digits, punctuation, foreign script).Source: m-bain/whisperX