План статьи

  1. Введение в суть задачи. Для чего и зачем это нужно.

  2. Как оценивать такие модели. Метрики и нюансы сравнения.

  3. Основная часть. Разбор каждой модели. Краткое резюме. Возможности и ограничения. Выводы

  4. Итоговый вывод, общая таблица сравнений OpenSource моделей для задачи TTS.

Введение

Задача Text-to-Speech (TTS) она же задача синтеза речи — заключается в том, чтобы озвучить заранее подготовленный текст голосом спикера. Данная задача является одной из важных в системах взаимодействия человека и компьютера. Конечно, такая задача генерации речи встречается гораздо реже, чем, например, задача генерации или обработки текста, тем не менее, сферы ее применения со временем только увеличиваются в своих масштабах и становится все более востребованной.

Задача синтеза речи лежит в основе всех голосовых ассистентов, например, умная колонка Алиса, навигатор или служба технической поддержки. Кроме таких глобальных внедрений, существуют системы, которые напрямую оказывают ��оддержку людям, которым это действительно важно, например, помогают слепым людям получать информацию об окружающей среде. Такими технологиями озвучивают аудиокниги, персонажей в видеоиграх и еще много всего интересного.

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

Каково мое предназначение? Передай масло.
Каково мое предназначение? Передай масло.

Привет, Хабр, меня зовут Музафаров Данил, я работаю DS инженером в компании Raft и сегодня мы рассмотрим существующие Open Source модели и репозитории, которые решают задачи TTS для русского языка. Возможно, не все модели попадут в мой список, поэтому буду рад, если вы в комментариях посоветуете еще какие-нибудь интересные модели, на которые стоит обратить внимание и в таком случае можно будет сделать вторую часть.

Метрики успеха

Прежде, чем начать анализ и сравнение моделей, необходимо обозначить метрики, по которым мы сможем проводить оценку. В данной задаче синтеза речи сложно объективно оценивать качество речи, но точно можно замерить скорость генерации. Будем замерять скорость на GPU и CPU в секундах.

  • Latency (CPU/GPU)

Также будет моя субъективная оценка результата генерации по следующим параметрам в диапазоне от 1 до 5:

  • Естественность (Naturalness): Насколько речь приближена к человеческой по интонации, тембру, скорости, плавности речи и ее темпу;

  • Выразительность (Expressiveness): Способна ли модель передавать эмоции, варьировать интонацию и подстраиваться под контекст;

  • Легкость интеграции и настройки: Качество документации, на сколько сложно запустить проект локально на ПК

Основная часть

Итак, сегодня мы рассмотрим 7 Open Source решений, а именно:

  • Boson AI / HiggsAudio

  • ChatterBox

  • ESpeech

  • F5-TTS

  • QwenTTS

  • Silero

  • XTTS-v2

HiggsAudio

BosonAI — Компания, специализирующаяся на TTS задачах. У них есть Open Source репозиторий, который предоставляет доступ к их открытым моделям для TTS, также примеры использования.

Ссылка на Boson AI: https://www.boson.ai/blog/higgs-audio-v2
Ссылка на GitHub HiggsAudio: https://github.com/boson-ai/higgs-audio

При тестировании сразу же замечаю предупреждение, что желательно иметь не менее 24 ГБ видеопамяти. К сожалению у меня только 12 ГБ, поэтому пришлось проделать некоторые операции в коде по уменьшению объема используемого кэша, который используется по умолчанию, чтобы модель влезала на мою видеокарту.

Тестирование

Системным промптом прописывается инструкция-описание того, как должен звучать голос, внешние звуки, чистота записи и прочие характеристики.

system_prompt = (
    "Generate audio following instruction.\n\n<|scene_desc_start|>\nAudio is recorded from a quiet room.\n<|scene_desc_end|>"
)

Также прописывается User Prompt. Он отвечает за само аудио наполнение, которое будет синтезировано. Итоговый Message для модели выглядит так:

messages = [
    Message(
	    role="system",
	    content=system_prompt,
    ),
    Message(
	    role="user",
	    content="Коллеги, всем привет! Это синтезированная речь higgs-audio. Меня зовут Музафаров Данил и я тестирую этот репозиторий.",
    ),
]

Далее генерация около пары минут, что само по себе достаточно долго, для английского языка мне потребовалась 1 минута.

На выходе получаем такое аудио:

Звучит буквально как...
Звучит буквально как...

Вывод

Синтезированный голос получился с сильным акцентом. Явно указать русский язык в параметрах генерации нельзя, поэтому имеем такой результат. С английским языком проблем не было, синтезированная речь была чистой и качественной.

Chatterbox

Китайская мультиязычная модель для генерации голоса

GitHub: https://github.com/resemble-ai/chatterbox

Данный репозиторий у меня не получилось запустить на GPU из-за конфликтов с зависимостями для нового типа архитектур видеокарт. Но ничего, попробуем на CPU.

Тестирование

Текст, который планирую озвучить:
«Коллеги, добрый день! Тестирую синтез речи с помощью модели Chatterbox. Это синтезированный голос Данила Музафарова».

Синтез речи со стандартным тембром (голосом)
Ошибся в паре слов с ударением, в начале некорректно использовал интонацию.

Синтез речи с клонированным голосом спикера
Здесь я предварительно записал свой голос и использовал в качестве «Аудиопромпта».
Такая же проблема с ударениями и интонацией. Но в целом похоже на голос спикера.

Вывод

С русским языком умеет работать, но не совсем хорошо. Если использовать GPU, то будет получаться довольно быстро. Для генерации каждой синтезированной аудиодорожки с текстом, который я хотел озвучить на моей CPU ушло примерно 38 секунд.

ESpeech

Русскоязычная команда разработчиков выкатили модели под TTS с gradio интерфейсом/

Ссылка на HF: https://huggingface.co/ESpeech
Ссылка на HF на последнюю модель: https://huggingface.co/ESpeech/ESpeech-TTS-1_RL-V2

Тут нет подробной документации, есть только скрипт, который позволяет поднять gradio веб-интерфейс и протестировать модели в нем. То есть придется самостоятельно разбирать весь код, доставая необходимые функции.

Тестирование

Запуск был очень простой. Предоставлен код, предоставлены зависимости, которые нужно установить. Создал окружение, установил зависимости, создал python скрипт и запустил gradio web-приложение.

Gradio web-интерфейс
Gradio web-интерфейс

Загружается референсное аудио, прописывается его транскрипция.
Прописывается текст для генерации (синтеза).
Также есть Advanced настройки, для более тонкой настройки речи.

Advanced настройки
Advanced настройки

Далее просто нажать на кнопку «Generate Speech».

Референсное аудио

Результат генерации

Вывод

С русской интонацией всё в порядке, если ставить знаки препинания.
С ударениями всё в порядке.
Генерация отличная, без претензий к качеству.
Скорость генерации хорошая, на 14 секунд генерации потратил 6 секунд обработки на GPU.

F5-TTS

Оригинальный репозиторий: https://github.com/SWivid/F5-TTS

В оригинальном репозитории F5-TTS отсутствует русский язык. Но на просторах HF найдена дообученная F5-TTS на русских и английских семплах: https://huggingface.co/Misha24-10/F5-TTS_RUSSIAN

Герои не носят плащи
Герои не носят плащи

Буду тестировать дообученную модель.

Тестирование

Взял дообученную русскоязычную модель с HF: https://huggingface.co/Misha24-10/F5-TTS_RUSSIAN

Использую последнюю версию — F5TTS_v1_Base_v4_winter.

Чтобы использовать модель необходимо иметь референсное аудио, желательно с расшифровкой, если не иметь расшифровку, то будут задействованы дополнительные ресурсы на расшифровку.

В итоге для генерации необходимо прописать следующие cli-аргументы:

f5-tts_infer-cli /
    --model_cfg src/f5_tts/configs/F5TTS_v1_Base_v4_winter.yaml /
    --ckpt_file ckpts/F5TTS_v1_Base_v4_winter/model_212000.safetensors /
    --vocab_file ckpts/F5TTS_v1_Base_v4_winter/vocab.txt /
    --ref_audio ref_danil.ogg
    --ref_text "Всем привет, меня зовут Музафаров Данил и сейчас я тестирую новый аудиоформат" /
    --gen_text "Коллеги, добрый день, меня зовут Музафаров Данил, сейчас я тестирую синтез речи на модели Эф Пять, дообученной на русский язык"
    --device cuda
  • model_cfg — конфиг модели, он изначально есть в репозитории, необходимо поменять название самого конфига и называние модели внутри с «F5TTS_v1_Base_v4» на «F5TTS_v1_Base_v4_winter»;

  • ckpt_file — веса модели;

  • vocab_file — словарь с символами, которые знает модель. Взял из русского репозитория с HF;

  • ref_audio — референсное аудио. Голос спикера, который будем клонировать;

  • ref_text — Расшифровка референсного аудио;

  • gen_text — Текст, который хотим сгенерировать;

  • device — тут либо cuda, либо cpu. Но это опционально, можно не указывать данный параметр.

Референсное аудио

Результат генерации

Вывод

Отличная генерация: порядок с произношением, порядок с интонацией.
Сгенерированное аудио 9 секунд.
На GPU — генерация составила 2 секунды. На CPU — 2 минуты.
В официальном репозитории отсутствуют модели для русского языка.
Долго работает на CPU.
Отсутствуют скрипты для инференса, работа происходит через терминал и cli-аргументы.

QwenTTS

Свежий китайский OpenSource от Qwen для синтеза речи.
GitHub: https://github.com/QwenLM/Qwen3-TTS

Простой ML инженер из лабы Alibaba
Простой ML инженер из лабы Alibaba

Здесь предоставлено 3 основные модели:

  • CustomVoice — предоставляет ограниченное количество голосов спикеров (тембров), которыми можно озвучить текст;

  • VoiceDesign — позволяет промптом описать как должен звучать голос спикера;

  • Base — клонирует голос референсного спикера и озвучивает этим голосом заданный текст.

Тестирование

Модель Qwen3-TTS-12Hz-1.7B-CustomVoice

Модель имеет поддержку нескольких языков:

['auto', 'chinese', 'english', 'french', 'german', 'italian', 'japanese', 'korean', 'portuguese', 'russian', 'spanish']

Модель имеет варианты тембра нескольких спикеров:

['aiden', 'dylan', 'eric', 'ono_anna', 'ryan', 'serena', 'sohee', 'uncle_fu', 'vivian']

Перейдем к синтезу речи. В методе model.generate_custom_voice() есть параметры:

  • text — синтезируемый текст;

  • language — язык генерации, явно указываем русский или Auto;

  • speaker — выбираем спикера, а именно тембр голоса, который будет озвучивать текст. Выбираем из доступных (посмотреть доступных через метод model.get_supported_speakers());

  • instruct — промпт для описания как должен быть озвучен текст. Можно не прописывать.

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
 
model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
    device_map="cuda:0",
    dtype=torch.bfloat16,
)
 
wavs, sr = model.generate_custom_voice(
    text="Привет, меня зовут Данил Музафаров. Это тестирование синтеза речи.",
    language="Russian",
    speaker="ryan",
    instruct="Speak in a calm, confident voice.",
)
sf.write("output_custom_voice.wav", wavs[0], sr)

Результат генерации

Вывод

Хоть модель и ставит ударения правильно, но чувствуется, что есть небольшой акцент и проблемы с интонацией. Это связано с тем, что голоса спикеров имеют изначально в качестве родного языка не русский, а китайский или английский.

Модель Qwen3-TTS-12Hz-1.7B-VoiceDesign

Для генерации в методе model.generate_voice_design() необходимо прописать следующие параметры:

  • text — синтезируемый текст;

  • language — язык генерации, явно указываем русский;

  • instruct — промпт для описания как должен быть озвучен текст. 

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
 
model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign",
    device_map="cuda:0",
    dtype=torch.bfloat16,
)
 
wavs, sr = model.generate_voice_design(
    text="Коллеги, добрый день, меня зовут Данил Музафаров. Это тестирование синтеза речи.",
    language="Russian",
    instruct="The male voice of the announcer with a low timbre",
)
sf.write("output_voice_design.wav", wavs[0], sr)

Результат генерации

Вывод

Промпт необходимо описывать на английском языке, на русском не работает. Результат неплохой, инструкция по описанию голоса соблюдается.

Модель Qwen3-TTS-12Hz-1.7B-Base

Для генерации в методе model.generate_voice_clone() необходимо прописать следующие параметры:

  • text — синтезируемый текст;

  • language — язык генерации, явно указываем русский;

  • ref_audio — аудио голоса спикера, который мы хотим склонировать;

  • ref_text — расшифровка аудио голоса спикера.

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
 
model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-Base",
    device_map="cuda:0",
    dtype=torch.bfloat16,
    #attn_implementation="flash_attention_2",
)
 
ref_audio = "ref_danil.ogg"
ref_text  = "Всем привет, меня зовут Музафаров Данил и сейчас я тестирую новый аудио формат."
 
wavs, sr = model.generate_voice_clone(
    text="Коллеги, добрый день, меня зовут Данил Музафаров. Это тестирование синтеза речи. Сегодня двадцать шестое января.",
    language="Russian",
    ref_audio=ref_audio,
    ref_text=ref_text,
)
sf.write("output_voice_clone.wav", wavs[0], sr)

Аудио референс голоса спикера

Результат генерации

Вывод

Хороший репозиторий, всё очень удобно прописано, интуитивно понятно.
Встроенные голоса — для русского не годятся.
Хороший промпт‑описание голоса спикера показало хороший результат.
Клонирование голоса спикера — отличное.
Инференс врядли подойдет для real time работы, но на проектах, где не так важен RealTime — может показать себя вполне неплохо.

Silero

Русскоязычная разработка для синтеза речи.

GitHub: https://github.com/snakers4/silero-models
Ссылка на свежую статью Хабр: https://habr.com/ru/articles/961930/

Тестирование

Можно использовать только стандартные тембры голосов спикеров. Нет возможности использовать кастомный голос.

Сами модели весят немного и помещаются на CPU

from silero import silero_tts
 
model_id = 'v5_ru'
 
device = torch.device('cpu')
 
model, example_text = silero_tts(language='ru',
                                 speaker=model_id)
model.to(device)  # gpu or cpu

Далее можно посмотреть доступные голоса спикеров через метод sorted(model.speakers)

['aidar', 'baya', 'eugene', 'kseniya', 'xenia']

Далее идет блок кода с синтезом речи

# v5_cis_base_nostress
sample_rate = 48000
speaker = 'eugene'
 
example_text = 'Колл+еги, д+обрый д+ень, мен+я зов+ут Музаф+аров Дан+ил, сейч+ас +я тест+ирую с+интез р+ечи +от Сл+иеро'
 
audio = model.apply_tts(text=example_text,
                        speaker=speaker,
                        sample_rate=sample_rate)
print(example_text)
display(Audio(audio, rate=sample_rate))

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

Конечно, это всё делается не вручную, а через отдельную библиотеку, которую Silero также предоставляет. Пример использования ниже.

from silero_stress import load_accentor
 
accentor = load_accentor(lang='ru')  # lang could be "ru" / "ukr"
sample_sent = "Коллеги, добрый день, меня зовут Музафаров Данил, сейчас я тестирую синтез речи от Слиеро"
print(accentor(sample_sent))

И мы получаем такой результат: 

Колл+еги, д+обрый д+ень, мен+я зов+ут Музаф+аров Дан+ил, сейч+ас +я тест+ирую с+интез р+ечи +от Си+леро

Результат генерации

Вывод

У Silero есть лицензия на использование, поэтому бесплатно его можно использовать только в образовательных целях.

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

Генерация даже на CPU очень быстрая.

XTTS-v2

GitHub: https://github.com/Jaden-J/Coqui-TTS-XTTS-v2-
HuggingFace: https://huggingface.co/coqui/XTTS-v2

Тестирование

Посмотреть доступные модели можно через

tts --list_models

Русские модели отсутствуют, поэтому придется пользоваться мультиязычными.

Клонирование голоса и синтез нового аудио на его основе

from TTS.api import TTS
device = "cpu"
 
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to(device)
 
tts.tts_to_file(text="Коллеги, добрый день, меня зовут Данил Музафаров, сейчас я тестирую новую модель для синтеза речи, получается неплохо, правда не моей видеокарте не получилось запустить, но на процессоре получилось.", speaker_wav="Данил.mp3", language="ru", file_path="output_dan.wav")

Субъективная оценка — действительно неплохо, тембр голоса сохранился. В начале немного не верная интонация, но в остальном нормально. Аудио длительностью 11 секунд — генерировалось 19 секунд на CPU. 

Результат генерации

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

Преобразование голоса

Есть возможность переложить тембр голоса с одного аудиофайла на второй аудиофайл. Тем самым произнести второй аудиофайл голосом из первого.

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

tts = TTS(model_name="voice_conversion_models/multilingual/vctk/freevc24", progress_bar=False).to("cpu")
 
tts.voice_conversion_to_file(source_wav="source_audio.ogg", target_wav="target_audio.ogg", file_path="mix.wav")

Вывод

Очень удобный репозиторий, всё интуитивно понятно. Есть возможность генерации на CPU с приемлемой скоростью. Более менее хорошо решает задачу клонирования голоса спикера и озвучивания текста. Но большой минус в том, что нет модели конкретно под русский язык. Есть возможность для дообучения своих моделей.

Клонирование и генерация речи на русском языке есть, работает нормально, но есть куда расти. Было бы хорошо, если бы была русская модель, так как вся работа идет на мультиязычной и явно режет потенциальное качество.

Хороший репозиторий, но нужно ждать русскую модель, либо дообучать самостоятельно.

Время подводить итоги
Время подводить итоги

Заключение и подведение итогов

Теперь нужно свести все результаты в таблицу, чтобы можно было наглядно оценить наши модели, которые мы рассмотрели. Ранее мы просто посмотрели как работают модели, как они звучат и некоторые моменты их реализации. В самом начале мы обговорили метрики, по которым мы будем оценивать модели и для честности замеров метрик мы будем использовать одни и те же условия. А именно будем генерировать одно и то же аудиосообщение и по нему уже проставлять оценку в таблицу. 

GPU — RTX 5070

Процессор — Ryzen 7500F

Будем озвучивать: «Коллеги, добрый день, меня зовут Музафаров Данил. Я пишу статью на Хабр и сейчас я считаю метрики аудиогенерации по скорости.» Это аудио длительностью примерно 10–15 секунд.

Модель

Latency (CPU), сек

Latency (GPU), сек

Естественность

Выразительность

Легкость интеграции

HiggsAudio

123.34

50.36

1

1

3

ChatterBox

31.63

-

3

3

3

ESpeech (TTS-1 RL-V2)

3.85

3.76

4,5

4

2

F5-TTS (v1_Base_v4_winter)

128.83

2.32

4,5

5

1

QwenTTS (1.7B-VoiceDesign

)

40.487

15.001

4,5

5

4

Silero (v5_ru)

2.62

0.071

4

4

4

XTTS-v2

20.65

18.54

3

3

2

Явный аутсайдер в таблице это HiggsAudio. Хоть он и показывает хорошие результаты на английском языке, к сожалению, на русском он совсем плох. По другим моделям не хочется останавливаться подробно, так как у них есть потенциал, есть свои плюсы и минусы, для каждого он сможет выбрать то, что ему больше нравится и решает его задачу.

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

Буду рад комментариям и конструктивной критике, которая поможет мне в следующих статьях сделать их лучше!