Пора!
Пора!

Время пришло. Мы решили задачу омографов (пока в первой версии, но идей ещё вагон) и теперь удовольствие от публикации наших новых публичных моделей синтеза наконец-то будет полным! Более того, что следом за ними пойдут ещё кое-какие модели, но это будет сюрприз.

Что поменялось:

  1. Модели стали в 3-4 раза быстрее, чем v3 , и в 1.5 - 2 раза быстрее, чем v4;

  2. Добавилась автоматическая расстановка ударений в омографах;

  3. Значительно повысилось качество звучания и стабильность генерации;

  4. В моделях всё так же поддерживается SSML;

  5. Список голосов: aidar, baya, kseniya, xenia, eugene;

  6. Ставить можно через 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 секунд. Также при генерации сразу сильно длинного аудио (до минуты) скорость немного проседает. Лучше генерировать короткими абзацами или длинными предложениями. При тестировании использовались реальные предложения с омографами.

Влияние числа омографов на скорость работы

Въедливый читатель может заметить, что при пересчёте цифр скорости работы омографа и синтеза получается, что омографы как-то мало влияют на скорость работы синтеза. Но мы специально убедились, что всё посчитано верно и посчитали смешной стресс тест.

Стресс-тест
Замеряем скорость as-is, без омографов (только ударения), и с большим числом омографов
Замеряем скорость as-is, без омографов (только ударения), и с большим числом омографов

Предложения, на которых замеряли выглядели примерно так:

Когда горбачёвская оттепель приобрела довольно-таки явные …

Замена:
мести горбачёвская оттепель приобрела довольно-таки явные …
мести ядра оттепель приобрела довольно-таки явные …
мести ядра воронья приобрела довольно-таки явные …

Пакет 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)


  1. AigizK
    31.10.2025 08:45

    но тут пока создадим иллюзию тайны

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


  1. BlackStorkKCO
    31.10.2025 08:45

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


    1. snakers4 Автор
      31.10.2025 08:45

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


      1. Lecron
        31.10.2025 08:45

        Число в текст, с учетом спряжений и склонений, количественной и порядковой формы, дело нескольких чел*часов. Правда я использовал PyMorphy.

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


        1. snakers4 Автор
          31.10.2025 08:45

          Это всего лишь один из сотен юзкейсов.


  1. Kirithu
    31.10.2025 08:45

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


    1. snakers4 Автор
      31.10.2025 08:45

      Если под профилем имеется в виду создание своего голоса, то таких планов пока нет.


      1. Kirithu
        31.10.2025 08:45

        понял, благодарю.


  1. Kenenbek
    31.10.2025 08:45

    А какие вы используете инструменты для русской нормализации?


    1. snakers4 Автор
      31.10.2025 08:45

      На данный момент почти не используем, но были простейшие самописные когда-то, когда надо было


  1. programania
    31.10.2025 08:45

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