import torch from TTS.api import TTS # Patch the ...
Создано: 16 августа 2025 г.
Создано: 16 августа 2025 г.
import torch
from TTS.api import TTS
def custom_load_fsspec(model_path, map_location):
return torch.load(model_path, map_location=map_location, weights_only=False)
tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2")
text = "Привет, это тест русского голоса."
speaker = tts.speakers[0]
tts.tts_to_file(text=text, speaker=speaker, language="ru", file_path="output.wav")
print("Аудио сохранено в output.wav")
tts_models/multilingual/multi-dataset/xtts_v2 is already downloaded.
Using model: xtts
Traceback (most recent call last):
File "F:\Users\Pozdin\PycharmProjects\youtube_vor\text-to-speech.py", line 8, in <module>
tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2")
File "F:\Users\Pozdin\PycharmProjects\youtube_vor\venv\lib\site-packages\TTS\api.py", line 74, in init
self.load_tts_model_by_name(model_name, gpu)
File "F:\Users\Pozdin\PycharmProjects\youtube_vor\venv\lib\site-packages\TTS\api.py", line 177, in load_tts_model_by_name
self.synthesizer = Synthesizer(
File "F:\Users\Pozdin\PycharmProjects\youtube_vor\venv\lib\site-packages\TTS\utils\synthesizer.py", line 109, in init
self._load_tts_from_dir(model_dir, use_cuda)
File "F:\Users\Pozdin\PycharmProjects\youtube_vor\venv\lib\site-packages\TTS\utils\synthesizer.py", line 164, in _load_tts_from_dir
self.tts_model.load_checkpoint(config, checkpoint_dir=model_dir, eval=True)
File "F:\Users\Pozdin\PycharmProjects\youtube_vor\venv\lib\site-packages\TTS\tts\models\xtts.py", line 771, in load_checkpoint
checkpoint = self.get_compatible_checkpoint_state_dict(model_path)
File "F:\Users\Pozdin\PycharmProjects\youtube_vor\venv\lib\site-packages\TTS\tts\models\xtts.py", line 714, in get_compatible_checkpoint_state_dict
checkpoint = load_fsspec(model_path, map_location=torch.device("cpu"))["model"]
File "F:\Users\Pozdin\PycharmProjects\youtube_vor\venv\lib\site-packages\TTS\utils\io.py", line 54, in load_fsspec
return torch.load(f, map_location=map_location, **kwargs)
File "F:\Users\Pozdin\PycharmProjects\youtube_vor\venv\lib\site-packages\torch\serialization.py", line 1529, in load
raise pickle.UnpicklingError(_get_wo_message(str(e))) from None
_pickle.UnpicklingError: Weights only load failed. This file can still be loaded, to do so you have two options, do those steps only if you trust the source of the checkpoint.
(1) In PyTorch 2.6, we changed the default value of theweights_only
argument intorch.load
fromFalse
toTrue
. Re-runningtorch.load
withweights_only
set toFalse
will likely succeed, but it can result in arbitrary code execution. Do it only if you got the file from a trusted source.
(2) Alternatively, to load withweights_only=True
please check the recommended steps in the following error message.
WeightsUnpickler error: Unsupported global: GLOBAL TTS.tts.configs.xtts_config.XttsConfig was not an allowed global by default. Please usetorch.serialization.add_safe_globals([TTS.tts.configs.xtts_config.XttsConfig])
or thetorch.serialization.safe_globals([TTS.tts.configs.xtts_config.XttsConfig])
context manager to allowlist this global if you trust this class/function.
Check the documentation of torch.load to learn more about types accepted by default with weights_only https://pytorch.org/docs/stable/generated/torch.load.html.
Process finished with exit code 1
в чем проблема и как ее решить
Коротко: у вас PyTorch 2.6, где torch.load
по умолчанию грузит только веса (weights_only=True
). Чекпоинт xtts_v2
от Coqui TTS содержит объекты конфигурации (XttsConfig
), и при “безопасной” загрузке PyTorch их блокирует → UnpicklingError
.
Вы пробовали написать custom_load_fsspec(..., weights_only=False)
, но этот код нигде не подключён — библиотека всё равно вызывает свой load_fsspec
.
Есть 3 рабочих пути — выберите любой.
Это сохраняет поведение weights_only=True
, но беллистит XttsConfig
.
pythonimport torch from torch.serialization import add_safe_globals from TTS.tts.configs.xtts_config import XttsConfig # Разрешаем класс конфигурации, которому не доверял безопасный загрузчик add_safe_globals([XttsConfig]) from TTS.api import TTS tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2") text = "Привет, это тест русского голоса." speaker = tts.speakers[0] tts.tts_to_file(text=text, speaker=speaker, language="ru", file_path="output.wav") print("Аудио сохранено в output.wav")
Это безопаснее, чем полностью отключать «безопасный» режим, потому что вы разрешаете только конкретный класс, а не любой код.
Если вы на 100% доверяете модели/чекпоинту, можно заставить Coqui TTS вызывать torch.load(..., weights_only=False)
.
Минимально-инвазивный патч на уровне Coqui:
pythonimport torch from TTS.utils import io as tts_io # это модуль, где вызывают torch.load # Подменяем функцию, чтобы всегда выставлять weights_only=False _orig_load_fsspec = tts_io.load_fsspec def _load_fsspec_unrestricted(path, map_location=None, **kwargs): kwargs["weights_only"] = False return _orig_load_fsspec(path, map_location=map_location, **kwargs) tts_io.load_fsspec = _load_fsspec_unrestricted from TTS.api import TTS tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2")
Риск: при
weights_only=False
возможна произвольная десериализация кода из чекпоинта. Делайте так только с доверенными файлами.
В PyTorch ≤ 2.5 weights_only
по умолчанию было False
, и всё работало «как раньше».
bashpip uninstall -y torch torchvision torchaudio pip install torch==2.5.1 --index-url https://download.pytorch.org/whl/cu121 # подберите под вашу CUDA/CPU # или для CPU: # pip install torch==2.5.1 --index-url https://download.pytorch.org/whl/cpu
pip install -U TTS
custom_load_fsspec(...)
сам по себе не сработает, пока вы не подмените им реальный вызов внутри TTS.utils.io.load_fsspec
(см. Вариант 2).tts.speakers
пустой — для XTTS обычно указывают референс-клип (аудио говорящего) через speaker_wav
или speaker_embeddings
; но для простого теста можно использовать встроенные спикеры, если они присутствуют.Если хотите, я могу прислать минимальный рабочий скрипт под ваш случай с Вариантом 1.