
Время пришло. Мы решили задачу омографов (пока в первой версии, но идей ещё вагон) и теперь удовольствие от публикации наших новых публичных моделей синтеза наконец-то будет полным! Более того, что следом за ними пойдут ещё кое-какие модели, но это будет сюрприз.
Что поменялось:
- Модели стали в 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 ничего не дают.
Если у вас есть какие-то прикольные или оригинальные идеи насчёт улучшения открытого синтеза речи - будем рады обсудить в комментариях или в тикетах в репозитории. Вы также можете прислать свои данные для ударений и омографов - мы сделаем базовую библиотеку лучше.
Комментарии (11)
 - BlackStorkKCO31.10.2025 08:45- А с числами в тексте что-то планируете делать? Сейчас приходится свои обёртки писать для преобразования в текст  - snakers4 Автор31.10.2025 08:45- Оно вечно на будущее откладывается в пользу прикладных проектов, а у заказчиков как правило свои костыли. Как это сделать в принципе понятно, но чтобы нормально работало, там совсем какие-то огромные оценки по человеко-часам на это всё.  - Lecron31.10.2025 08:45- Число в текст, с учетом спряжений и склонений, количественной и порядковой формы, дело нескольких чел*часов. Правда я использовал PyMorphy. - Осталось выбрать из корпуса числа с контекстом (±1-2 слова), сгруппировать, разметить форму и обучить сетку. Которая потом и будет эту форму указывать дискретному конвертеру. Тут пока даже предварительных оценок нет. Но таки думаю, что не огромные, а просто большие. 
 
 
 - programania31.10.2025 08:45- Не понятно как Silero использовать через Speech API как RHVoice. 
 Поэтому сделал себе сервер http с Silero на Python для использования из других языков,
 например Delphi и для преобразования текста из файла в wav.
 Если интересует могу записать куда-нибудь. Там 10 кб.
 
           
 

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