import torch from TTS.api import TTS # Patch the ...

Создано: 16 августа 2025 г.

Отвечено с использованием GPT-5 от Chat01

Вопрос

import torch
from TTS.api import TTS

Patch the load function if needed (not recommended)

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 the weights_only argument in torch.load from False to True. Re-running torch.load with weights_only set to False 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 with weights_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 use torch.serialization.add_safe_globals([TTS.tts.configs.xtts_config.XttsConfig]) or the torch.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

в чем проблема и как ее решить

Мысль

Explaining the error and fixes

The error occurs because PyTorch 2.6 changed the weights_only default to True, causing the UnpicklingError. To fix it, either pass weights_only=False into the TTS load function (by monkey-patching TTS.utils.io.load_fsspec), or use torch.serialization.add_safe_globals and allow TTS.tts.configs.xtts_config.XttsConfig. You could also downgrade to PyTorch <2.6 or set TORCH_LOAD_WEIGHTS_ONLY. Upgrading Coqui TTS to a version supporting safe loading might help.

Explaining patch options

The issue arises due to PyTorch 2.6's default weights_only=True. To bypass the error, a patch could be:

python
from TTS.utils import io as tts_io tts_io.load_fsspec = lambda path, map_location, **kw: torch.load(path, map_location=map_location, weights_only=False)

Alternatively, use the safe_globals context manager:

python
from torch.serialization import add_safe_globals from TTS.tts.configs.xtts_config import XttsConfig add_safe_globals([XttsConfig])

Or pin PyTorch to version 2.5.*.

Thought for 9s

Ответ

Коротко: у вас PyTorch 2.6, где torch.load по умолчанию грузит только веса (weights_only=True). Чекпоинт xtts_v2 от Coqui TTS содержит объекты конфигурации (XttsConfig), и при “безопасной” загрузке PyTorch их блокирует → UnpicklingError.
Вы пробовали написать custom_load_fsspec(..., weights_only=False), но этот код нигде не подключён — библиотека всё равно вызывает свой load_fsspec.

Есть 3 рабочих пути — выберите любой.


Вариант 1 (рекомендуемый): разрешить нужный класс для «безопасной» загрузки

Это сохраняет поведение weights_only=True, но беллистит XttsConfig.

python
import 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")

Это безопаснее, чем полностью отключать «безопасный» режим, потому что вы разрешаете только конкретный класс, а не любой код.


Вариант 2: временно отключить «безопасный» режим загрузки (менее безопасно)

Если вы на 100% доверяете модели/чекпоинту, можно заставить Coqui TTS вызывать torch.load(..., weights_only=False).

Минимально-инвазивный патч на уровне Coqui:

python
import 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 возможна произвольная десериализация кода из чекпоинта. Делайте так только с доверенными файлами.


Вариант 3: откатить PyTorch ниже 2.6

В PyTorch ≤ 2.5 weights_only по умолчанию было False, и всё работало «как раньше».

bash
pip 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

Дополнительные советы

  • Обновите Coqui TTS до последней версии — возможно, там уже учли изменения PyTorch:
    pip install -U TTS
  • Ваш custom_load_fsspec(...) сам по себе не сработает, пока вы не подмените им реальный вызов внутри TTS.utils.io.load_fsspec (см. Вариант 2).
  • Если после запуска голосов tts.speakers пустой — для XTTS обычно указывают референс-клип (аудио говорящего) через speaker_wav или speaker_embeddings; но для простого теста можно использовать встроенные спикеры, если они присутствуют.

Если хотите, я могу прислать минимальный рабочий скрипт под ваш случай с Вариантом 1.

Поделиться этим Q&A