From 09b3592920cf923f63c19c2e4a69f399d817eb4e Mon Sep 17 00:00:00 2001 From: chenpipi0807 <144689950+chenpipi0807@users.noreply.github.com> Date: Sun, 18 May 2025 14:43:33 +0800 Subject: [PATCH] V2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化了长期以来transformers库4.50+版本的API变化与原始IndexTTS模型代码不兼容导致的生成报错问题 --- indextts/gpt/model.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/indextts/gpt/model.py b/indextts/gpt/model.py index 16ff155..2b5e201 100644 --- a/indextts/gpt/model.py +++ b/indextts/gpt/model.py @@ -618,8 +618,31 @@ class UnifiedVoice(nn.Module): logits_processor = LogitsProcessorList([TypicalLogitsWarper(mass=typical_mass)]) if typical_sampling else LogitsProcessorList() max_length = trunc_index + self.max_mel_tokens - 1 if max_generate_length is None else trunc_index + max_generate_length - gen = self.inference_model.generate(inputs, bos_token_id=self.start_mel_token, pad_token_id=self.stop_mel_token, - eos_token_id=self.stop_mel_token, - max_length=max_length, logits_processor=logits_processor, - num_return_sequences=num_return_sequences, **hf_generate_kwargs) + + # 修补:为新版transformers (4.50+) 添加一个解决方法,解决tensor reshape问题 + try: + # 尝试正常生成 + gen = self.inference_model.generate(inputs, bos_token_id=self.start_mel_token, pad_token_id=self.stop_mel_token, + eos_token_id=self.stop_mel_token, + max_length=max_length, logits_processor=logits_processor, + num_return_sequences=num_return_sequences, **hf_generate_kwargs) + except RuntimeError as e: + if "shape" in str(e) and "invalid for input of size" in str(e): + print(f">> 检测到transformers reshape错误,尝试使用替代生成方法") + # 替代方法:使用sample而不是beam search + # 这实际上是一个回退机制,因为在更新的transformers版本中,beam search的实现发生了变化 + gen = self.inference_model.generate(inputs, bos_token_id=self.start_mel_token, pad_token_id=self.stop_mel_token, + eos_token_id=self.stop_mel_token, + max_length=max_length, logits_processor=logits_processor, + num_return_sequences=num_return_sequences, + do_sample=True, # 使用采样而不是beam search + num_beams=1, # 设置为1,实际上禁用beam search + temperature=1.0, # 使用温度为1.0的采样 + top_k=30, # 仍然可以使用top_k过滤 + top_p=0.9, # 和top_p过滤 + **{k: v for k, v in hf_generate_kwargs.items() if k not in ['num_beams', 'do_sample', 'temperature', 'top_k', 'top_p']}) + else: + # 如果是其他错误,则重新抛出 + raise + return gen[:, trunc_index:]