Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

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

Aberta Para iniciantes
#3,780 1 comentário 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

@carey-bk já está trabalhando nisso.

Desde 20/10/2026.

  • #3783 de @carey-bk — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
78/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
python, pytorch

Direção de pesquisa

Comece em funasr/tokenizer/sentencepiece_tokenizer.py, em SentencepiecesTokenizer.ids2tokens, e acompanhe como o Paraformer passa os IDs dos tokens para ele. Verifique como token_list é carregado e compare sua ordem com a do modelo SentencePiece neste caso. Atualize o comportamento de decodificação para usar o mapeamento de tokens pretendido e, em seguida, verifique se a amostra em inglês relatada é decodificada corretamente e se os modelos existentes continuam compatíveis.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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.

Linguagem predominante
Python
Estrelas
20.8k
Forks
2.1k
Merge médio
23h 48min
PRs com merge (30d)
38

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de modelscope/FunASR

Todas as issues de modelscope/FunASR

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.