Обход клонирования голоса в Voxtral-TTS: работа с урезанными весами | AiManual
AiManual Logo Ai / Manual.
10 Апр 2026 Гайд

Voxtral-TTS без клонирования голоса: как обойти удаление энкодера и заставить модель работать

Глубокий разбор архитектуры Voxtral-TTS от Mistral AI. Почему удалили энкодер, как это ломает voice cloning и практическое обходное решение на Wav2Vec2. Актуаль

Анонс против релиза: почему в Voxtral-TTS нельзя клонировать голос

В феврале 2026 года Mistral AI выкатила Voxtral-TTS. Анонс был громким: качественный синтез речи с поддержкой нескольких языков и, что самое главное, возможность клонирования голоса по короткому образцу. Все ждали убийцу ElevenLabs и Resemble AI в open-source мире.

Потом вышел релиз. И оказалось, что веса энкодера — той самой части модели, которая отвечает за анализ и кодирование эталонного голоса — вырезаны из публичной версии. В репозитории лежит только декодер. Вы загружаете модель, подаете на вход текст и... получаете синтез стандартным, предобученным голосом. Клонирование не работает. Вообще.

Это не баг, это фича. Но очень раздражающая. Разработчики оставили комментарий в коде: "Encoder weights removed due to safety and licensing considerations". Безопасность и лицензирование. Звучит солидно, но пахнет политикой.

Пользователи, которые уже читали нашу статью про Qwen3 TTS для аудиокниг, ожидали аналогичного функционала. Вместо этого получили кастрированную модель. Возникает вопрос: а что, собственно, удалили? И можно ли это как-то заменить?

Архитектура Voxtral-TTS: что скрывается под капотом

Чтобы понять, что сломалось, нужно заглянуть внутрь. Voxtral-TTS — это не монолитная нейросеть, а конвейер из трех ключевых компонентов.

Компонент Назначение Статус в релизе
Текстовик / Фонетический энкодер Преобразует текст в фонемы или лингвистические признаки. Присутствует
Энкодер голоса (Voice Encoder) Анализирует аудиосэмпл эталонного голоса, создает компактное векторное представление (спикер-эмбеддинг). Удален. Весов нет.
Декодер / Вокодер Принимает фонетические признаки и спикер-эмбеддинг, генерирует аудиоволну. Присутствует

Именно энкодер голоса — это "магический" модуль, который умеет слушать 10 секунд вашей речи и выделять из нее суть: тембр, манеру, акцент, эмоциональную окраску. Без него декодеру не на что опереться, кроме как на дефолтный эмбеддинг, зашитый в обучении.

💡
Энкодер голоса в архитектурах типа Tacotron или VITS — это обычно конволюционная сеть или трансформер, обученная методом контрастивного обучения. Его цель — создать такое представление голоса, которое было бы инвариантно к произносимому тексту, но чувствительно к идентичности говорящего. Проще говоря, чтобы фраза "Привет" и "До свидания" от одного человека давали похожие эмбеддинги.

Почему его удалили? Официально — безопасность. Неофициально — чтобы не лезли в коммерциализацию. Возможно, Mistral планирует отдельный платный API для клонирования. А может, у них были проблемы с лицензией обучающих данных (голоса из датасетов могли быть не совсем чистыми с точки зрения прав).

Обходной путь: если нет родного энкодера, сделай свой

Ситуация выглядит тупиковой. Но это только на первый взгляд. Архитектура-то осталась. Декодер ожидает на вход некий эмбеддинг определенной размерности. Если мы сможем создать вектор, похожий по свойствам на тот, что генерировал оригинальный энкодер, модель заработает.

Нам нужен заменитель. Идеальный кандидат — модель, которая уже умеет извлекать спикер-эмбеддинги из аудио. На апрель 2026 года есть несколько проверенных вариантов:

  • Wav2Vec2 XLS-R или его более новые наследники (например, WavLM). Эти модели, обученные на самообучении, улавливают не только речь, но и характеристики говорящего.
  • ECAPA-TDNN — классика для верификации говорящего. Быстрая, легкая, специально заточена под эмбеддинги.
  • Wespeaker или SpeechBrain — фреймворки, которые предоставляют готовые модели для извлечения эмбеддингов.

Суть проста: берем эталонную аудиозапись голоса, пропускаем через выбранную модель-экстрактор, получаем вектор. Потом адаптируем его под ожидаемую размерность Voxtral-TTS (скажем, через линейный слой) и подаем в декодер вместе с текстовыми признаками.

Звучит как костыль? Да. Но это рабочий костыль, который позволяет запустить клонирование здесь и сейчас, не дожидаясь милости от Mistral.

1 Сборка инструментария: что ставить

Первым делом — окружение. Мы будем работать с PyTorch и Hugging Face transformers. Убедитесь, что у вас свежие версии. На апрель 2026 актуальны torch 2.4+ и transformers 4.45+.

pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu124  # для CUDA 12.4
pip install transformers==4.45.0
pip install soundfile librosa

Voxtral-TTS мы качаем с официального Hugging Face хаба. Декодер весит около 1.5 ГБ.

from transformers import VitsModel, AutoTokenizer
import torch

# Загружаем то, что есть
model = VitsModel.from_pretrained("mistralai/Voxtral-TTS-Decoder")
tokenizer = AutoTokenizer.from_pretrained("mistralai/Voxtral-TTS-Decoder")

Внимание! В коде модели есть закладка под энкодер. При попытке вызвать клонирование вы получите ошибку, что атрибут `voice_encoder` не найден. Это нормально. Мы его будем имитировать.

2 Выбор и настройка модели-донора эмбеддингов

Я остановился на Wav2Vec2-large от Facebook. Модель 2023 года, но её эмбеддинги до сих пор отлично работают для задач верификации. Более того, есть исследования, что промежуточные слои Wav2Vec2 содержат богатую информацию о говорящем.

from transformers import Wav2Vec2ForSequenceClassification, Wav2Vec2FeatureExtractor
import torchaudio

# Загружаем модель, обученную на распознавании говорящего (например, на VoxCeleb)
# Или используем базовую и дорабатываем
speaker_encoder = Wav2Vec2ForSequenceClassification.from_pretrained("facebook/wav2vec2-large-960h-lv60-self", num_labels=512)
feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained("facebook/wav2vec2-large-960h-lv60-self")

Нам не нужно классифицировать, нам нужны признаки. Поэтому мы возьмем выход последнего скрытого слоя перед классификатором. Это и будет наш "сырой" эмбеддинг. Размерность — 1024. А Voxtral-TTS, предположительно, ожидает 256 или 512. Нужен адаптер.

3 Создание и обучение адаптера

Адаптер — это простая полносвязная сетка, которая преобразует 1024-мерный вектор в 256-мерный, похожий на "родной" эмбеддинг Voxtral. Обучать его будем на небольшом датасете голосов, используя сам Voxtral-TTS как учителя.

Хитрость в том, что мы не можем обучить его напрямую, но можем использовать метод контрастивных потерь: заставляем адаптер выдавать близкие эмбеддинги для одного говорящего и далекие — для разных.

class EmbeddingAdapter(torch.nn.Module):
    def __init__(self, input_dim=1024, output_dim=256):
        super().__init__()
        self.fc1 = torch.nn.Linear(input_dim, 512)
        self.fc2 = torch.nn.Linear(512, output_dim)
        self.relu = torch.nn.ReLU()
        
    def forward(self, x):
        x = self.relu(self.fc1(x))
        return self.fc2(x)

adapter = EmbeddingAdapter().cuda()
optimizer = torch.optim.Adam(adapter.parameters(), lr=1e-4)

Для обучения потребуется пара десятков аудиозаписей разных дикторов. Да, это уже требует некоторой подготовки, но это единственный способ "подружить" два разных представления голоса.

4 Интеграция в конвейер синтеза

Когда адаптер обучен, процесс клонирования выглядит так:

  1. Загружаем эталонное аудио (5-10 секунд, чистая речь, без шума).
  2. Извлекаем признаки через Wav2Vec2, усредняем по времени, получаем вектор 1024.
  3. Пропускаем через адаптер, получаем вектор 256.
  4. Токенизируем текст.
  5. Подаем текст и адаптированный эмбеддинг в декодер Voxtral-TTS.
  6. Получаем синтезированную речь в нужном голосе.
def synthesize_with_custom_voice(text, reference_audio_path):
    # Шаг 1: Эмбеддинг голоса
    waveform, sr = torchaudio.load(reference_audio_path)
    waveform = waveform.squeeze().numpy()
    inputs = feature_extractor(waveform, sampling_rate=16000, return_tensors="pt", padding=True)
    with torch.no_grad():
        outputs = speaker_encoder(**inputs, output_hidden_states=True)
        hidden_states = outputs.hidden_states[-1]  # берем последний слой
        w2v_embedding = hidden_states.mean(dim=1)  # усредняем по времени
    
    # Шаг 2: Адаптация
    adapted_embedding = adapter(w2v_embedding.cuda())
    
    # Шаг 3: Синтез
    inputs = tokenizer(text, return_tensors="pt")
    with torch.no_grad():
        # Здесь ключевой момент: нужно передать эмбеддинг в модель
        # В исходном коде Voxtral-TTS, вероятно, есть параметр speaker_embeddings
        output = model(input_ids=inputs.input_ids, speaker_embeddings=adapted_embedding)
    audio = output.audio.cpu().numpy().squeeze()
    return audio

Подводные камни и почему это не идеально

Работает? Да. Идеально? Нет. Есть несколько фундаментальных проблем.

  • Несоответствие распределений. Эмбеддинги от Wav2Vec2 живут в своем пространстве. Эмбеддинги от оригинального энкодера — в своем. Адаптер пытается их сопоставить, но это всегда аппроксимация. Голос может звучать немного "не так": с потерями в эмоциональности или с артефактами.
  • Зависимость от качества эталона. Шумы, музыка на фоне, эхо — все это попадет в эмбеддинг и испортит синтез.
  • Проблема с языком. Voxtral-TTS обучен на нескольких языках. А Wav2Vec2, который мы взяли, — на английском. Для русского голоса эмбеддинг может быть менее репрезентативным. Решение — использовать мультиязычные модели вроде XLS-R или Voxtral-Mini (если удастся вытащить из неё энкодер).

Но главная проблема в другом. Этот обход требует технических навыков и времени. Обычный пользователь, который ждал "нажми одну кнопку и клонируй голос", разочаруется. Это временное решение для энтузиастов, пока сообщество не найдет более элегантный способ или пока Mistral не передумает.

Что дальше? Прогнозы на 2026-2027

Ситуация с Voxtral-TTS — симптом общей болезни. Компании выпускают мощные open-source модели, но вырезают ключевые коммерческие функции. Скорее всего, в течение 2026 года появятся:

  1. Неофициальные веса энкодера. Кто-то мог сохранить их до удаления. Или переобучить с нуля на публичных датасетах вроде LibriTTS или VCTK.
  2. Стандартизация спикер-эмбеддингов. Сообщество может договориться об общем формате, как это произошло с изображениями (CLIP). Тогда одна модель для извлечения эмбеддингов будет работать с множеством декодеров.
  3. Ответвление проекта (fork). Энтузиасты могут сделать полную версию Voxtral-TTS с открытыми весами, как это было со Stable Diffusion.

Пока же, если вам нужно качественное клонирование голоса для проектов, где нельзя использовать облачные API, присмотритесь к другим open-source TTS. Qwen3 TTS, XTTSv3 или Coqui TTS могут оказаться проще и стабильнее в настройке.

А Voxtral-TTS в его текущем виде — это напоминание о том, что в мире open-source AI не все так открыто, как хотелось бы. Но и это не повод опускать руки. Это повод разобраться в архитектуре и попытаться сделать свой велосипед. Иногда он даже едет.

Подписаться на канал