import torch
from TTS.tts.models.xtts import XttsAudioConfig  
from TTS.tts.configs.xtts_config import XttsConfig  
from TTS.config.shared_configs import BaseDatasetConfig  
from TTS.tts.models.xtts import XttsArgs  

# **添加 `XttsConfig` 到 PyTorch 安全全局对象**
torch.serialization.add_safe_globals([XttsConfig, XttsAudioConfig, BaseDatasetConfig, XttsArgs])

# **强制 `weights_only=False` 解决 UnpicklingError**
# def load_fsspec_fixed(*args, **kwargs):
#     kwargs["weights_only"] = False  # 关键修正
#     return torch.load(*args, **kwargs)

def load_fsspec_fixed(*args, **kwargs):
    kwargs.pop("cache", None)  # 移除 cache 参数，避免报错
    kwargs["weights_only"] = False  # 关键修正
    return torch.load(*args, **kwargs)


# **覆盖 Coqui TTS 的 `load_fsspec` 方法**
import TTS.utils.io
TTS.utils.io.load_fsspec = load_fsspec_fixed

from TTS.api import TTS

# **XTTS v2 高质量多语言模型**
XTTS_MODEL = "tts_models/multilingual/multi-dataset/xtts_v2"

# **VITS 高质量单语言模型**
VITS_MODEL = "tts_models/en/ljspeech/vits"

# **高质量的参考音频**
speaker_wav_en = "example_speaker_en.wav"  # 必须提供此音频，确保质量良好

# **要转换的文本**
text_en = "This is a high-quality text-to-speech conversion using XTTS v2 and VITS."
text = "记者从越秀区了解到，广州博物馆隆重推出“吉祥有年——广州博物馆藏吉祥文物展”及“吉祥有年·潮派趁墟”主题新春市集，让市民群众在探秘文物珍宝的同时，也能解锁非遗新体验、品尝地道广府味，一起喜迎吉祥乙巳蛇年。"

# **加载 XTTS v2**
print("🚀 正在加载 XTTS v2 模型，请稍候...")
tts_xtts = TTS(XTTS_MODEL)

# **使用 XTTS v2 生成语音**
tts_xtts.tts_to_file(
    text=text, 
    file_path="output_xtts.wav", 
    speaker_wav=speaker_wav_en,  # 参考音频（用于克隆音色）
    language="zh-cn",  # 语言代码，必须匹配文本语言
    split_sentences=True  # 让模型自动优化长文本
)
print("✅ XTTS v2 语音合成完成！已保存到 output_xtts.wav 🎵")

# **加载 VITS**
print("🚀 正在加载 VITS 模型，请稍候...")
tts_vits = TTS(VITS_MODEL)

# **使用 VITS 生成语音**
tts_vits.tts_to_file(
    text=text_en,
    split_sentences=True,
    file_path="output_vits.wav"
)
print("✅ VITS 语音合成完成！已保存到 output_vits.wav 🎵")
