Content is what remains

A speech tokenizer that learns from many voices saying the same words. It keeps what they share and lets the speaker, the room and the microphone fall away.

Swap the voices
1.2%
speaker probe accuracy on PINT tokens, down from 93.1% on HuBERT
27–30%
lower language-model perplexity than HuBERT and WavLM tokens, same model and data
56 b/s
after dedup and BPE, approaching character-level text BPE at 48

Four voices. The same tokens.

Each row is one person saying "Please call Stella." A colour is a token, so matching colours mean matching tokens. Play a voice, hover a band, then switch to HuBERT and watch the rows fall apart.

p230
p244
p245
p259

14% of runs differ

Averaged over the six speaker pairs (normalized edit distance). Lower means the tokens carry less of the speaker.

  • PINT14%
  • HuBERT40%
  • WavLM47%

Real k=200 output from the PINT repository. Four VCTK speakers not seen in training read "Please call Stella." (VCTK corpus, University of Edinburgh, CC BY 4.0; converted to 16 kHz mono). HuBERT and WavLM have their own 200-token codebooks, so compare how the rows agree, not the colours between tokenizers. "Lined up" leaves a gap where a speaker has a run the others lack.

Results

Tokens that stop carrying the speaker are easier to model. PINT also cuts ABX error by 42% against the baselines.

Speaker probe accuracy on the tokens · lower is betterLess of the speaker leaks through
PINT
1.2%
1.2%
HuBERT
93.1%
93.1%
A probe trained to name the speaker from the tokens is close to guessing on PINT.
Final test perplexity · same 85M-parameter model and data · lower is betterEasier for a language model
PINT
1.95
1.95
WavLM
2.67
2.67
HuBERT
2.78
2.78
Ids that do not change with the speaker or the recording leave the language model less to model.

Use it

16 kHz audio in, one 768-dimensional vector or one token id per 20 ms out. Use the tokens as semantic targets for audio codecs or as input for speech language models. It works on English speech.

Python

# pip install git+https://github.com/nyrahealth/PINTfrom pint_infer import PINTTokenizer, format_runstok = PINTTokenizer.from_pretrained("nyralabs/PINT")ids = tok.encode("p230.wav")     # one token id per 20 msframes = tok.embed("p230.wav")   # (T, 768) float32print(format_runs(ids))
3×35 85×2 68×3 60×4 94×3 96×6 110×1 39×2 132×2 63×2 48×9 173×5 79×2 4×1 98×4 99×1 9×1 175×7 0×4 157×4 34×3 46×4 3×5

Research and non-commercial

Weights are free under CC BY-NC 4.0, and the inference code is MIT.

API

PINT is not on the API yet. Tell us if you need it, so we can prioritise it.

In a product

The released weights are non-commercial. For a product, talk to us about a license.

For researchers

The paper, how to cite it, and where to find the weights and code. PINT is the first published piece of the representation line of our research program.

Interspeech 2026

Content is What Remains: Invariant Speech Tokenization from Parallel Utterances

Laurin Wagner, Bernhard Thallinger, Miroslav Stankovic, Mario Zusag

@misc{wagner2026contentremainsinvariantspeech,
  title         = {Content is What Remains: Invariant Speech Tokenization from Parallel Utterances},
  author        = {Laurin Wagner and Bernhard Thallinger and Miroslav Stankovic and Mario Zusag},
  year          = {2026},
  eprint        = {2607.19033},
  archivePrefix = {arXiv},
  primaryClass  = {cs.CL},
  url           = {https://arxiv.org/abs/2607.19033},
  note          = {Accepted at Interspeech 2026}
}