`SentencepiecesTokenizer.ids2tokens` ignores `token_list` - root cause of the paraformer-en gibberish in #3040
Maintainer antworten meist innerhalb von 1 Tag
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 78/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Bereich
- backend, machine-learning
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
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus modelscope/FunASR
-
compute_wer_by_line raises OverflowError at 32,768 tokens with NumPy 2.3.5Evtl. vergeben @carey-bk hat das vor 1 Tag übernommen. Offenbug needs triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
modelscope/FunASR#3781 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
modelscope/FunASR#3762 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Bug: blank lines in wav.scp / jsonl file lists crash prepare_data_iterator (IndexError / JSONDecodeError)Evtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offenneeds feedback
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
modelscope/FunASR#3757 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
modelscope/FunASR#3730 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100
modelscope/FunASR#3704 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in modelscope/FunASR
Ähnliche Issues
-
documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 67/100
Maintainer antworten meist innerhalb von 1 Tag
-
good first issue module-baseline needs triage ux
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
darnitdevorg/darnit#650 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
nyjc-computing/campus#938 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
nf-osi/nf-metadata-dictionary#1027 ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug documentation
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 92/100
qatrackplus/qatrackplus#913 ·
Maintainer antworten meist innerhalb von 3 Tagen