Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

`SentencepiecesTokenizer.ids2tokens` ignores `token_list` - root cause of the paraformer-en gibberish in #3040

Offen Anfängerfreundlich
#3,780 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

@carey-bk arbeitet bereits daran.

Seit 20.10.2026.

  • #3783 von @carey-bk — offen

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
78/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
python, pytorch

Rechercherichtung

Beginne in funasr/tokenizer/sentencepiece_tokenizer.py bei SentencepiecesTokenizer.ids2tokens und verfolge, wie Paraformer Token-IDs daran übergibt. Prüfe, wie token_list geladen wird, und vergleiche für diesen Fall seine Reihenfolge mit dem SentencePiece-Modell. Aktualisiere das Dekodierverhalten, sodass die vorgesehene Token-Zuordnung verwendet wird, und überprüfe anschließend, ob das gemeldete englische Beispiel korrekt dekodiert wird und bestehende Modelle kompatibel bleiben.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Summary
iic/speech_paraformer-large-vad-punc_asr_nat-en-16k-common-vocab10020 is not mispackaged. The model predicts the right token ids; the text goes wrong at decoding. SentencepiecesTokenizer.ids2tokens ignores the loaded token_list (tokens.json) and decodes the ids with the BPE model's own id order. For this model the two orders differ, so every word is replaced by an unrelated one. Decoding the same ids through tokens.json gives correct English.

Environment
FunASR 1.4.16 (same code on current main), torch 2.14.1, Python 3.11, macOS arm64, CPU.

Root cause
funasr/tokenizer/sentencepiece_tokenizer.py:

def ids2tokens(self, *args, **kwargs):
    return self.decode(*args, **kwargs)   # -> self.sp.DecodeIds(ids)

Paraformer inference calls tokenizer.ids2tokens(token_int). The ids index tokens.json (10020 entries: <blank>, <s>, </s>, ~, <, ...), but sp.DecodeIds reads them as bpe.model ids (10000 pieces: <unk>, <s>, </s>, ▁the, s, ...). Weights load with "All keys matched successfully" and the decoder output size (10020) equals len(tokens.json).

Repro

from funasr import AutoModel
m = AutoModel(model="iic/speech_paraformer-large-vad-punc_asr_nat-en-16k-common-vocab10020", device="cpu")
tk = m.kwargs["tokenizer"]
cap = {}
orig = type(tk).ids2tokens
def spy(self, ids, **kw):
    cap["ids"] = list(ids)
    return orig(self, ids, **kw)
type(tk).ids2tokens = spy
print(m.generate(input="https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_en.wav")[0]["text"])
print(tk.sp.DecodePieces([tk.token_list[i] for i in cap["ids"]]))

Output on the official sample:

procedure telegram impatience phuket sleeping danielot pro
he tried to think how it could be

Line 1 is the gibberish reported in #3040; line 2 is the correct transcript from the same ids.

Suggested fix

def ids2tokens(self, integers, **kwargs):
    if self.token_list is not None:
        return [self.token_list[i] for i in integers]
    return self.decode(integers, **kwargs)

Models whose tokens.json already follows bpe.model order decode the same either way.

Vorherrschende Sprache
Python
Sterne
20.8k
Forks
2.1k
Ø Merge
1 T. 46 Min.
Gemergte PRs (30 T.)
36

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus modelscope/FunASR

Alle Issues in modelscope/FunASR

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.