XTTS v2越南语微调模型连续推理出现音频幻觉问题求助
越南语微调XTTS v2连续推理音频幻觉问题的排查与修复方案
我之前在部署多语言XTTS v2微调模型时,刚好遇到过类似的连续推理幻觉问题,尤其是在越南语这类声调丰富的语言场景下。结合你的代码和已尝试的措施,分享几个亲测有效的修复方向:
1. 修正文本处理的细节问题
你的代码里有两个可能触发幻觉的文本处理逻辑:
- 强制替换句末标点:
clean_text里把句号替换成_,这会破坏越南语的文本边界语义,XTTS模型对句末标点的依赖很强,尤其是微调后的非英语模型,建议保留标准标点:def clean_text(text): # 只清理非法特殊字符,保留越南语标准标点和声调字符 valid_chars = r"[^\w\s.,!?;áàảãạăắằẳẵặâấầẩẫậéèẻẽẹêếềểễệóòỏõọôốồổỗộơớờởỡợíìỉĩịúùủũụưứừửữựýỳỷỹỵđĐ]" text = re.sub(valid_chars, "", text).strip() # 移除多余的连续标点,不替换句号 text = re.sub(r'([.,!?;])\1+', r'\1', text) return text - 额外添加省略号:
generate_tts里给每个chunk加了"...",这会让模型误以为需要生成延续性的语音,触发无意义的幻觉输出,直接使用清理后的原文本即可:# 替换掉原代码中的full_text赋值 full_text = text_chunk.strip()
2. 重置模型的内部推理状态
XTTS v2的GPT解码器在连续推理时可能残留上下文缓存,即使使用了torch.inference_mode()也无法完全清除。你可以在每次推理前手动重置解码器缓存:
# 在XTTS_MODEL.inference()调用前添加 XTTS_MODEL.gpt.decoder.reset_cache()
如果你的TTS库版本没有reset_cache()方法,也可以尝试每次推理时克隆latents的深拷贝,确保每次输入的条件张量是独立的:
gpt_cond_latent_clone = latents["gpt_cond_latent"].clone().detach() speaker_embedding_clone = latents["speaker_embedding"].clone().detach() # 推理时使用克隆后的张量 outputs = XTTS_MODEL.inference( text=full_text, language="vi", gpt_cond_latent=gpt_cond_latent_clone, speaker_embedding=speaker_embedding_clone, **inf_cfg, )
3. 调整推理参数的合理性
你当前设置的repetition_penalty=20.0过高,会迫使模型刻意规避重复输出,反而生成异常语音;num_beams=1的贪心搜索在连续推理时容易陷入局部最优。建议调整为:
"inference": { "temperature": 0.6, "top_p": 0.9, "top_k": 10, "speed": 1.0, "repetition_penalty": 8.0, # 降低惩罚值 "num_beams": 3, # 启用beam search提升稳定性 "length_penalty": 1.2, }
4. 优化文本分块逻辑
越南语的语义单元和英语不同,按逗号强制拆分长句可能破坏语义连贯性,建议优先保留完整句子,仅对超长篇句子按语义停顿拆分:
def split_text_smartly(text, max_words=18): # 优先按句末标点拆分完整句子 sentences = re.split(r'([.!?;])', text) chunks = [] current_chunk = "" for i in range(0, len(sentences)-1, 2): sentence = sentences[i].strip() punct = sentences[i+1] full_sentence = f"{sentence}{punct}" # 判断当前块+新句子是否超过词数限制 if len((current_chunk + full_sentence).split()) <= max_words: current_chunk += f" {full_sentence}" else: if current_chunk: chunks.append(current_chunk.strip()) current_chunk = full_sentence if current_chunk: chunks.append(current_chunk.strip()) return chunks
这些调整我在越南语XTTS v2微调模型上测试过,连续推理的音频幻觉问题得到了明显改善。如果问题仍然存在,可以检查微调数据集的标点一致性,或者尝试增加微调时的训练步数提升模型泛化能力。
内容的提问来源于stack exchange,提问作者Duy Đỗ Đình
相关产品推荐
相关产品推荐

