From 6cafe5582caea83df269c36b1ce62d953a9cc66b Mon Sep 17 00:00:00 2001 From: Xiong Wang Date: Fri, 6 Feb 2026 12:11:31 +0800 Subject: [PATCH] fix: padding value process bug in tokenizer decode --- pyproject.toml | 2 +- .../core/tokenizer_12hz/modeling_qwen3_tts_tokenizer_v2.py | 3 ++- .../core/tokenizer_25hz/modeling_qwen3_tts_tokenizer_v1.py | 3 ++- qwen_tts/inference/qwen3_tts_tokenizer.py | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 647b045..d4b6df5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "qwen-tts" -version = "0.1.0" +version = "0.1.1" description = "Qwen-TTS python package" readme = "README.md" requires-python = ">=3.9" diff --git a/qwen_tts/core/tokenizer_12hz/modeling_qwen3_tts_tokenizer_v2.py b/qwen_tts/core/tokenizer_12hz/modeling_qwen3_tts_tokenizer_v2.py index d2c4098..0c00fd3 100644 --- a/qwen_tts/core/tokenizer_12hz/modeling_qwen3_tts_tokenizer_v2.py +++ b/qwen_tts/core/tokenizer_12hz/modeling_qwen3_tts_tokenizer_v2.py @@ -1009,10 +1009,11 @@ class Qwen3TTSTokenizerV2Model(Qwen3TTSTokenizerV2PreTrainedModel): """ return_dict = return_dict if return_dict is not None else self.config.return_dict + audio_lengths = (audio_codes[..., 0] > -1).sum(1) * self.decode_upsample_rate + audio_codes = torch.clamp(audio_codes, min=0) audio_values = self.decoder.chunked_decode(audio_codes.transpose(1, 2)).squeeze(1) - audio_lengths = (audio_codes[..., 0] > 0).sum(1) * self.decode_upsample_rate audio_values = [a[:l] for a, l in zip(audio_values, audio_lengths)] if not return_dict: diff --git a/qwen_tts/core/tokenizer_25hz/modeling_qwen3_tts_tokenizer_v1.py b/qwen_tts/core/tokenizer_25hz/modeling_qwen3_tts_tokenizer_v1.py index 8a38d92..b6f7684 100644 --- a/qwen_tts/core/tokenizer_25hz/modeling_qwen3_tts_tokenizer_v1.py +++ b/qwen_tts/core/tokenizer_25hz/modeling_qwen3_tts_tokenizer_v1.py @@ -1509,12 +1509,13 @@ class Qwen3TTSTokenizerV1Model(Qwen3TTSTokenizerV1PreTrainedModel): """ return_dict = return_dict if return_dict is not None else self.config.return_dict + audio_lengths = (audio_codes > -1).sum(1) * self.decode_upsample_rate + audio_codes = torch.clamp(audio_codes, min=0) audio_values = self.decoder(code=audio_codes, reference_mel=ref_mels, conditioning=xvectors) - audio_lengths = (audio_codes > 0).sum(1) * self.decode_upsample_rate audio_values = [a[:l] for a, l in zip(audio_values, audio_lengths)] if not return_dict: diff --git a/qwen_tts/inference/qwen3_tts_tokenizer.py b/qwen_tts/inference/qwen3_tts_tokenizer.py index eae969d..24f8768 100644 --- a/qwen_tts/inference/qwen3_tts_tokenizer.py +++ b/qwen_tts/inference/qwen3_tts_tokenizer.py @@ -326,7 +326,7 @@ class Qwen3TTSTokenizer: else: # List[Tensor/np] audio_codes_list = [_to_tensor(c, dtype=torch.long) for c in audio_codes_list] - audio_codes_padded = pad_sequence(audio_codes_list, batch_first=True, padding_value=0).to(self.device) + audio_codes_padded = pad_sequence(audio_codes_list, batch_first=True, padding_value=-1).to(self.device) with torch.inference_mode(): if model_type == "qwen3_tts_tokenizer_25hz":