#1449·whisperX

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:

python
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).