You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 09:52:28