
Время пришло. Мы решили задачу омографов (пока в первой версии, но идей ещё вагон) и теперь удовольствие от публикации наших новых публичных моделей синтеза наконец-то будет полным! Более того, что следом за ними пойдут ещё кое-какие модели, но это будет сюрприз.
Что поменялось:
Модели стали в 3-4 раза быстрее, чем
v3, и в 1.5 - 2 раза быстрее, чемv4;Добавилась автоматическая расстановка ударений в омографах;
Значительно повысилось качество звучания и стабильность генерации;
В моделях всё так же поддерживается SSML;
Список голосов:
aidar,baya,kseniya,xenia,eugene;Ставить можно через
torch.hub, черезpipи просто локально через торч;
Новые флаги
Из-за омографов добавились новые флаги. Для полноты картины давайте перечислем все флаги, связанные с ударением, составляющие полную группу:
put_accent=True,
put_yo=True,
put_stress_homo=True,
put_yo_homo=True
Эти флаги делают следующее:
put_accent- простановка ударений в обычных словах (где юзер не расставил ударения сам);put_yo- расстановка буквё, где юзер заленился написать её;put_stress_homo- простановка ударений в обычных омографах (без буквыё);put_yo_homo- простановка ударений в омографах с буквойё;
Мы специально сделали полную группу флагов, чтобы пользователи могли гибко и тонко настраивать движок под себя.
Подробно почитать про саму расстановку омографов можно тут.
Скорость работы
У наших моделей скорость работы теперь находится почти уже на грани возможного (без жертв качеством). Мы пробовали много всякого, чтобы сделать модели ещё быстрее, но везде есть компромиссы. К примеру можно снизить потребление ресурсов в разы, но скорость от этого упадёт. Или можно ещё ускориться в пару (тройку?) раз, но начнёт заметно проседать качество (или модели перестануть работать на каком-то классе устройств).
Мы снимали скорость модели для простановки омографов на достаточно стрессовых данных. На обычных данных просадка по скорости при вызове омографов менее заметна.
Скорость, измеренная в секундах синтезированного аудио в секунду у нас получилась такая:
Устройство |
Только TTS |
Плюс ударения |
Ещё плюс омографы |
GPU |
300 - 350 |
250 - 300 |
250 - 300 |
CPU, 1 поток |
37 - 42 |
37 - 40 |
37 - 40 |
CPU, 4 потока |
100 - 110 |
90 - 100 |
90 - 100 |
Для тестов использовался процессор Intel(R) Core(TM) i9-10940X CPU @ 3.30GHz и видеокарта 3090 (на более "маленьких" карточках начиная с поколения Ampere результаты мало отличаются). При тестировании средствами PyTorch выставлялось количество потоков процессора (torch.set_num_threads(1) или torch.set_num_threads(4)).
Ещё важная ремарка состоит в том, что скорость замерялась для оптимальной длины: для процессора - от 5 до 20 секунд, для видеокарты от 10 секунд. Также при генерации сразу сильно длинного аудио (до минуты) скорость немного проседает. Лучше генерировать короткими абзацами или длинными предложениями. При тестировании использовались реальные предложения с омографами.
Влияние числа омографов на скорость работы
Въедливый читатель может заметить, что при пересчёте цифр скорости работы омографа и синтеза получается, что омографы как-то мало влияют на скорость работы синтеза. Но мы специально убедились, что всё посчитано верно и посчитали смешной стресс тест.
Стресс-тест

Предложения, на которых замеряли выглядели примерно так:
Когда горбачёвская оттепель приобрела довольно-таки явные …
Замена:
мести горбачёвская оттепель приобрела довольно-таки явные …
мести ядра оттепель приобрела довольно-таки явные …
мести ядра воронья приобрела довольно-таки явные …
Пакет pip и примеры запуска
Теперь у нас также есть pip-пакет, pip install silero. Если использовать его, то минимальный код запуска выглядит уже совсем лаконично:
!pip install silero
from silero import silero_tts
model, example_text = silero_tts(language='ru',
speaker='v5_ru')
audio = model.apply_tts(text=example_text)
Полный код запуска, например с использованием torch.hub со всеми флагами уже выглядит вот так (подробнее можно потыкать в интерактивном ноутбучке):
import torch
language = 'ru'
model_id = 'v5_ru'
device = torch.device('cpu')
model, example_text = torch.hub.load(repo_or_dir='snakers4/silero-models',
model='silero_tts',
language=language,
speaker=model_id)
model.to(device) # gpu or cpu
sample_rate = 48000
speaker = 'xenia'
put_accent=True
put_yo=True
put_stress_homo=True
put_yo_homo=True
example_text = 'Меня зовут Лева Королев. Я из готов. И я уже готов открыть все ваши замки любой сложности!'
audio = model.apply_tts(text=example_text,
speaker=speaker,
sample_rate=sample_rate,
put_accent=put_accent,
put_yo=put_yo,
put_stress_homo=put_stress_homo,
put_yo_homo=put_yo_homo)
ssml_sample = """
<speak>
<p>
Когда я просыпаюсь, <prosody rate="x-slow">я говорю довольно медленно</prosody>.
Потом я начинаю говорить своим обычным голосом,
<prosody pitch="x-high"> а могу говорить тоном выше </prosody>,
или <prosody pitch="x-low">наоборот, ниже</prosody>.
Потом, если повезет – <prosody rate="fast">я могу говорить и довольно быстро.</prosody>
А еще я умею делать паузы любой длины, например, две секунды <break time="2000ms"/>.
<p>
Также я умею делать паузы между параграфами.
</p>
<p>
<s>И также я умею делать паузы между предложениями</s>
<s>Вот например как сейчас</s>
</p>
</p>
</speak>
"""
audio = model.apply_tts(ssml_text=ssml_sample,
speaker=speaker,
sample_rate=sample_rate)
Размер модели
Без особых усилий у нас получилось урезать размер модели до ~140 мегабайт. В принципе, если сильно заморочиться, то можно уменьшить размер модели ещё в два раза, но пока показалось, что разница получается уже не сильно большая.
Вместо вывода
В ближайшем будущем ожидается также ещё один (на порядок более крупный) релиз моделей синтеза речи, но тут пока создадим иллюзию тайны.
Что касается синтеза русского языка - то за годы работы с ним по сути на вменяемый процент (97% или 99%) для ВСЕХ случаев осталось решить только задачу нормализации текста, но тут смущает совсем уже нетривиальное количество требуемых усилий, чтобы оно прямо вообще почти всегда и на всём работало.
Что же касается скорости, качества, удобства и продуктовости синтеза - кажется, что текущая модель вышла на определённое плато. Ещё есть ряд идей, как можно улучшить текущий синтез, существенно не ухудшив какие-то из его характеристик, но это довольно тяжело сделать. Тут, к сожалению, 9 экспериментов из 10 ничего не дают.
Если у вас есть какие-то прикольные или оригинальные идеи насчёт улучшения открытого синтеза речи - будем рады обсудить в комментариях или в тикетах в репозитории. Вы также можете прислать свои данные для ударений и омографов - мы сделаем базовую библиотеку лучше.
Комментарии (33)

BlackStorkKCO
31.10.2025 08:45А с числами в тексте что-то планируете делать? Сейчас приходится свои обёртки писать для преобразования в текст

snakers4 Автор
31.10.2025 08:45Оно вечно на будущее откладывается в пользу прикладных проектов, а у заказчиков как правило свои костыли. Как это сделать в принципе понятно, но чтобы нормально работало, там совсем какие-то огромные оценки по человеко-часам на это всё.

Lecron
31.10.2025 08:45Число в текст, с учетом спряжений и склонений, количественной и порядковой формы, дело нескольких чел*часов. Правда я использовал PyMorphy.
Осталось выбрать из корпуса числа с контекстом (±1-2 слова), сгруппировать, разметить форму и обучить сетку. Которая потом и будет эту форму указывать дискретному конвертеру. Тут пока даже предварительных оценок нет. Но таки думаю, что не огромные, а просто большие.

snakers4 Автор
31.10.2025 08:45Это всего лишь один из сотен юзкейсов.

Lecron
31.10.2025 08:45Это вы про время, дату, температуру, координаты и римские цифры? Ну да, есть такая буква. И все они сводятся к уже описанному, согласовать слово с числом и число со словом. Остальные юзкейсы либо исчезающие, либо не детектируемые.

snakers4 Автор
31.10.2025 08:45Если бы задача была такой тривиальной, то давно были бы многочисленные публичные качественные решения с качеством 99%.

programania
31.10.2025 08:45Не понятно как Silero использовать через Speech API как RHVoice.
Поэтому сделал себе сервер http с Silero на Python для использования из других языков,
например Delphi и для преобразования текста из файла в wav.
Если интересует могу записать куда-нибудь. Там 10 кб.
suprimex
31.10.2025 08:45Да, пожалуйста, было бы интересно.

programania
31.10.2025 08:45silero-server:
https://drive.google.com/file/d/1Utd723fRY5bdXBpwoFZGkO3RJbWDmeNW/view?usp=sharing
Запустить silero-server.bat и открыть http://127.0.0.1:8888
Возможно, в bat нужно указать где Python и модель Silero, например v5_ru.pt

Lecron
31.10.2025 08:45Покрутил "ручки", послушал демки — проект достойный. В первую очередь оцениваю с точки зрения приватного озвучивания книг, не особо напрягаясь вопросом лицензионной чистоты. Больше всего радует стабильность и (автоматизируемая) управляемость. Этой пары больше никто не предоставляет. А вот качество... еще один проект среди достойных, плюс-минус. Во главу угла была поставлена скорость и этот результат был достигнут. На CPU cопоставима с классическими SAPI синтезаторами старой школы. Было бы интересно глянуть, если бы не "стали в 3-4 раза быстрее", а разменяли скорость на качество, сохранив её как у v3 или лучше v4.
Из наиболее бросающегося в глаза. Предложения не выделены соответствующими паузами. Речь сливается. Более того, паузы часто меньше чем от запятой, а иногда и вовсе отсутствуют. Это в принципе исправляется вручную, вставкой тегов или генерацией тишины в коде. Но для режима "сделай хорошо" нужна встроенная поддержка. Которая заодно поможет решить проблему "при генерации сразу сильно длинного аудио скорость немного проседает". Разбивать внутри текст на предложения, например
razdelиз проектаNatasha(очень быстрый и качественный), озвучивать порциями, вставляя пустые межблоки в выходное аудио. Ну и заодно подумать о расширении интерфейса библиотеки потоковым методом. Уменьшит задержку между запросом и ответом. Не нужно будет ждать синтеза всего запроса.
snakers4 Автор
31.10.2025 08:45Этой пары больше никто не предоставляет.
Ещё никто не предоставляет такую поддержку ударений и омографов. И самое главное, мы даже ручные словари правил ещё не трогали.
Было бы интересно глянуть, если бы не "стали в 3-4 раза быстрее", а разменяли скорость на качество, сохранив её как у v3 или лучше v4.
Качество тут выше, чем у
v3и значительно выше, чем уv4.Обычно, когда люди кричат про качество, там либо требуется на порядки больше ресурсов, GPU, работает даже на GPU медленно и банально синтез работает как лотерея и не проведена банальная продуктовая работа. То есть надо генерить много раз, чтобы было что-то вменяемое.
Ну и заодно подумать о расширении интерфейса библиотеки потоковым методом.
Для фришной библиотеки с такой скоростью это имхо трата ресурсов / времени. Побить на абзацы / предложения и вперёд.
Предложения не выделены соответствующими паузами. Речь сливается. Более того, паузы часто меньше чем от запятой, а иногда и вовсе отсутствуют.
Это уже слабо похоже на правду, нужны примеры.

Lecron
31.10.2025 08:45Качество тут выше, чем у
v3и значительно выше, чем уv4Бесспорно. Скорость в 3-4 раза быстрее v3 и качество на X пунктов выше. А если бы скорость была равна, на сколько бы пунктов было выше качество? Вот это и хотелось бы глянуть. Любопытство, не более. Если что, к фонетике вообще непритязателен. Больше обращаю внимания на просодию. И тут вы прилично подтянулись. Надо еще послушать непрерывно пару-тройку книг, чтобы окончательно в этом убедиться (или опровергнуть).
Это уже слабо похоже на правду, нужны примеры.
Если не возражаете, можете прогуляться на 4pda. Откройте Айдара в аудиоредакторе. В лучшем случае, паузы 200 и менее миллисекунд. Если память не изменяет, рядовым является 400-750 мс. Особое внимание отрывку 30-48 секунд. Да, пунктуация там может непростая, но она есть. Можете убедиться по другим озвучкам.
При озвучке абзацев или не дай создатель, еще больших фрагментов — структура текста теряется. Не считаю это значимой проблемой — "Побить на предложения и вперёд". Но многие, если не большинство, будут использовать библиотеку именно так и впечатление будет соответствующее. Решение за вами.

snakers4 Автор
31.10.2025 08:45А если бы скорость была равна, на сколько бы пунктов было выше качество?
Качество понятие очень растяжимое. Если его измерять как оценку по 5-балльной шкале или оценку предпочтений, то уже на этапе v2 синтеза ОБЫЧНЫЕ люди в телефоне не могли отличить по 1 фразе синтез от не-синтеза.
Копать имхо надо в сторону интонаций / контроля эмоций / интонаций.
Если не возражаете, можете прогуляться на 4pda. Откройте Айдара в аудиоредакторе. В лучшем случае, паузы 200 и менее миллисекунд. Если память не изменяет, рядовым является 400-750 мс. Особое внимание отрывку 30-48 секунд. Да, пунктуация там может непростая, но она есть. Можете убедиться по другим озвучкам.
Нет времени читать все 56 страниц форума. Вы можете прислать конкретные проблемные участки с минимальным кодом для их репликации? Иначе разговор получается не очень предметным.
При озвучке абзацев или не дай создатель, еще больших фрагментов — структура текста теряется. Не считаю это значимой проблемой — "Побить на предложения и вперёд". Но многие, если не большинство, будут использовать библиотеку именно так и впечатление будет соответствующее. Решение за вами.
Если вам нужен контроль длины пауз или более длинные паузы между абзацами - то в SSML это всё есть. О какой структуре текста вообще может идти речь в синтезе, который в принципе не понимает смысла прочитанного?

Lecron
31.10.2025 08:45...не могли отличить по 1 фразе синтез от не-синтеза. Копать имхо надо в сторону интонаций / контроля эмоций / интонаций.
О какой структуре текста вообще может идти речь в синтезе, который в принципе не понимает смысла прочитанного?
Именно, что по фразе. В книге — заметнее. На счет интонаций, в обсуждении "ударятора" я писал, как по моему мнению, происходит окраска текста читателем при чтении книги. Поэтому копать надо в первую очередь в эту сторону. Дать слушателю крепкую основу для личной окраски — озвучить просодией структуру предложения, включая финальный знак.
Не надо понимать смысл прочитанного, надо понимать смысл структуры текста выраженный знаками препинания. Помните пример "выдры в гетрах", где 5 предложений с одинаковым текстом, по разному размечено пунктуацией. Вот именно ее и надо "прочитать" просодией. И только после уверенного преодоления этого этапа, начать окрашивать самому, выступая в роли декламатора, подчеркивающего смыслы.
Нет времени читать все 56 страниц форума.
Ссылка ведет на конкретный пост, а не ветку.
Если вам нужен контроль длины пауз или более длинные паузы между абзацами - то в SSML это всё есть.
Прекрасно понимаю и неоднократно писал об этом. Вопрос в другом. Должно ли продуктовое решение уметь читать абзацы, речью давая понять слушателю, что текст содержит последовательность отдельных утверждений, восклицаний и вопросов? Это один из элементов оценки похожести на человека — монотонность дикции. Только если в предыдущем абзаце речь шла о монотонности в рамках предложения, тут монотонность в рамках более крупной структурной единицы.

snakers4 Автор
31.10.2025 08:45Прекрасно понимаю и неоднократно писал об этом. Вопрос в другом. Должно ли продуктовое решение уметь читать абзацы, речью давая понять слушателю, что текст содержит последовательность отдельных утверждений, восклицаний и вопросов? Это один из элементов оценки похожести на человека — монотонность дикции. Только если в предыдущем абзаце речь шла о монотонности в рамках предложения, тут монотонность в рамках более крупной структурной единицы.
Тут намешано 3 разных понятия:
Чтение вопросов;
Чтение восклицаний;
Интонация в рамках уже не предложения, а в рамках абзаца / страницы текста.
Если первое и второе решаемо в принципе для компактных локальных моделей, то третье скорее всего решаемо в рамках гигантских моделей.
Ссылка ведет на конкретный пост, а не ветку.
При попытке открыть аудио выдает 404. Если есть конкретные предложения или баги по чтению конкретных фраз - то прошу приложить минимальный код для репликации ошибки (в посте этого нет) или проблемы - мы поправим.

Lecron
31.10.2025 08:45Интонация в рамках уже не предложения, а в рамках абзаца / страницы текста.
Да нет же. Монотонность создается отсутствием пауз. Должна ли пауза повествовательного отличаться от его длительности? Или длительности последнего "блока", от запятой до финала? Какая пауза должна быть на многоточии, тире? А у восклицательного и вопросительного?
Здесь не только гигантских моделей не надо, здесь вообще моделей не надо. Если предварительно разбить на предложения и озвучивать по ним. Достаточно отобрать несколько типов предложений, в зависимости какая гипотеза проверяется, проанализировать человеческую дикцию и вывести обобщенную закономерность. Не надо многих часов, пяток предложений тремя-четырмя обычными людьми, на гипотезу.
Слишком все бросились в нейросети. Решают квадратное уравнение через интегралы :)
При попытке открыть аудио выдает 404.
Нужна регистрация для доступа к вложениям, вроде бы.
Ошибка не в конкретном месте. Мол везде хорошо, а тут. Ошибка в отсутствии. Системном. Лучше покажу в волновой форме. Основное внимание на диапазон 50-80% трека, но и остальное показательно.
Скрытый текст

snakers4 Автор
31.10.2025 08:45Я не понимаю, что конкретно от нас требуется. Можете сформулировать мысль в таком ключе:
Вот аудио;
Вот сниппет кода, которым его сгенерировали;
Вот как должно быть / что не так с этим аудио;

Lecron
31.10.2025 08:45В таком нет. Но попробую близко.
Обратите внимание на структуру, чередование сигнал-тишина. Как для внутренней пунктуации предложения, так и между ними. В качестве образца можете взять абсолютно любой текст на ~1 минуту звучания, а в качестве эталона озвучку любым другим синтезатором, а лучше живую речь.
По данному примеру... например, в двух других голосах видна 1 запятая в первом предложении и 2 в третьем. У вас сплошной поток. И так далее по всему треку.

snakers4 Автор
31.10.2025 08:45По описанию выглядит как баги вызова модели, если честно. Не понимаю, почему вы не можете просто код скинуть.
Вот я взял вашу же фразу, погонял на разных спикерах в колабе на готовой демке. Звучит близко к идеальному.
sample_rate = 48000 speaker = 'xenia' put_accent=True put_yo=True put_stress_homo=True put_yo_homo=True example_text = 'Обратите внимание на структуру, чередование сигнал-тишина. Как для внутренней пунктуации предложения, так и между ними. В качестве образца можете взять абсолютно любой текст на одну минуту звучания, а в качестве эталона озвучку любым другим синтезатором, а лучше живую речь.' audio = model.apply_tts(text=example_text, speaker=speaker, sample_rate=sample_rate, put_accent=put_accent, put_yo=put_yo, put_stress_homo=put_stress_homo, put_yo_homo=put_yo_homo)На картинке прекрасно видно паузы, выделил для 1 голоса, на остальных тоже видно.


Lecron
31.10.2025 08:45Потому что не я делал демку.
По вашему примеру... текст должен быть чуть больше, либо уменьшить масштаб. И тут нет эталона. Нет сравнения. Сравнения не между вашими голосами, а с вашими голосами. Я же не сказал, что у вас совсем нет "артикуляции", лишь что она слабовыразительна, до полной потери.
Попросите в понедельник прочесть этот фрагмент кого-то из коллег, не особо привлекая к этому внимания, чтобы получилась речь в естественной среде. Ну либо просто забейте, если считаете это не важным, а мои реплики придирками. Так тоже может быть. До следующей встречи, коллега.

snakers4 Автор
31.10.2025 08:45Исходя из базовых тестов я не увидел "слабовыразительности" и "до полной потери".
Вы ссылаетесь на тесты другого человека, но по ссылке выше непонятно как повторить результат.
Если задача стоит в том, чтобы помочь сделать синтез лучше, нужен какой-то минимальный пример для репликации.
Есть подозрение, что возможно что иначе дело с пре-процессингом текста. Но если честно я даже не знаю, как тут можно что-то сломать.
Помню тут какие-то школьники аж целую хейтерскую статью на Хабре накатали из-за того, что движок синтеза не обрабатывает символ переноса строки.
Но это же движок, в его задачи не входит нормализация текста. То есть при полноценной поддержке SSML, можно конечно ввести какое-то правило, что при наличии знака переноса строки мы считаем его параграфом, но это немного влазит на чужую территорию.

anonymous
31.10.2025 08:45
snakers4 Автор
31.10.2025 08:45Часто путает е и э в словах типа "модЭли",
Э-фикация в принципе не поддаётся правилам русского языка. Мы пока её не касались. По сути это набор слов-исключений типа панель, шинель, нинель, и т.д.
и вообще ударения
Если есть конкретные слова, где есть ошибки - можете прикрепить список / файл сюда, или создать тикет, мы поправим. Если ошибка в омографах, то модель естественно не всегда ставит омографы правильно, но это пока буквально первая версия модель омографов.
Текст для озвучки приходится готовить в больших ллм, транслитерировать, разворачивать сокращения итп. После этого уже непонятно зачем локально генерировать если можно через тот же edge-tts озвучить.
Скоро люди, чтобы за покупками сходить будут что-то в больших ЛЛМ готовить. Без меня уже тома написаны на эту тему, что компании, которые хостят такие АПИ работают в безумный убыток и в продакшене очень странно стучаться в американский сервис с конским ценником.
Кейсы бывают разные - и полностью решить задачу нормализации на русском языке, чтобы это работало условно за 10ms на 1 потоке процессора - задача мягко говоря нетривиальная.
После этого уже непонятно зачем локально генерировать если можно через тот же edge-tts озвучить.
Удивительно, что кто-то ещё задаёт такой вопрос в 2025 году. Тут могу посоветовать посмотреть на направление куда развивается Windows и сделать выводы. Также в коде библиотеки есть замечательный файлик drm.py, который намекает, что аттракцион неслыханной щедрости может в любом момент закончиться.

AigizK
уже заждался ))