Пора!
Пора!

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

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

  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 ничего не дают.

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

Комментарии (33)


  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. Lecron
            31.10.2025 08:45

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


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

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


  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 кб.


    1. suprimex
      31.10.2025 08:45

      Да, пожалуйста, было бы интересно.


      1. programania
        31.10.2025 08:45

        silero-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



  1. Lecron
    31.10.2025 08:45

    Покрутил "ручки", послушал демки — проект достойный. В первую очередь оцениваю с точки зрения приватного озвучивания книг, не особо напрягаясь вопросом лицензионной чистоты. Больше всего радует стабильность и (автоматизируемая) управляемость. Этой пары больше никто не предоставляет. А вот качество... еще один проект среди достойных, плюс-минус. Во главу угла была поставлена скорость и этот результат был достигнут. На CPU cопоставима с классическими SAPI синтезаторами старой школы. Было бы интересно глянуть, если бы не "стали в 3-4 раза быстрее", а разменяли скорость на качество, сохранив её как у v3 или лучше v4.

    Из наиболее бросающегося в глаза. Предложения не выделены соответствующими паузами. Речь сливается. Более того, паузы часто меньше чем от запятой, а иногда и вовсе отсутствуют. Это в принципе исправляется вручную, вставкой тегов или генерацией тишины в коде. Но для режима "сделай хорошо" нужна встроенная поддержка. Которая заодно поможет решить проблему "при генерации сразу сильно длинного аудио скорость немного проседает". Разбивать внутри текст на предложения, например razdel из проекта Natasha (очень быстрый и качественный), озвучивать порциями, вставляя пустые межблоки в выходное аудио. Ну и заодно подумать о расширении интерфейса библиотеки потоковым методом. Уменьшит задержку между запросом и ответом. Не нужно будет ждать синтеза всего запроса.


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

      Этой пары больше никто не предоставляет.

      Ещё никто не предоставляет такую поддержку ударений и омографов. И самое главное, мы даже ручные словари правил ещё не трогали.

      Было бы интересно глянуть, если бы не "стали в 3-4 раза быстрее", а разменяли скорость на качество, сохранив её как у v3 или лучше v4.

      Качество тут выше, чем у v3 и значительно выше, чем уv4.

      Обычно, когда люди кричат про качество, там либо требуется на порядки больше ресурсов, GPU, работает даже на GPU медленно и банально синтез работает как лотерея и не проведена банальная продуктовая работа. То есть надо генерить много раз, чтобы было что-то вменяемое.

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

      Для фришной библиотеки с такой скоростью это имхо трата ресурсов / времени. Побить на абзацы / предложения и вперёд.

      Предложения не выделены соответствующими паузами. Речь сливается. Более того, паузы часто меньше чем от запятой, а иногда и вовсе отсутствуют.

      Это уже слабо похоже на правду, нужны примеры.


      1. Lecron
        31.10.2025 08:45

        Качество тут выше, чем у v3 и значительно выше, чем уv4

        Бесспорно. Скорость в 3-4 раза быстрее v3 и качество на X пунктов выше. А если бы скорость была равна, на сколько бы пунктов было выше качество? Вот это и хотелось бы глянуть. Любопытство, не более. Если что, к фонетике вообще непритязателен. Больше обращаю внимания на просодию. И тут вы прилично подтянулись. Надо еще послушать непрерывно пару-тройку книг, чтобы окончательно в этом убедиться (или опровергнуть).

        Это уже слабо похоже на правду, нужны примеры.

        Если не возражаете, можете прогуляться на 4pda. Откройте Айдара в аудиоредакторе. В лучшем случае, паузы 200 и менее миллисекунд. Если память не изменяет, рядовым является 400-750 мс. Особое внимание отрывку 30-48 секунд. Да, пунктуация там может непростая, но она есть. Можете убедиться по другим озвучкам.

        При озвучке абзацев или не дай создатель, еще больших фрагментов — структура текста теряется. Не считаю это значимой проблемой — "Побить на предложения и вперёд". Но многие, если не большинство, будут использовать библиотеку именно так и впечатление будет соответствующее. Решение за вами.


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

           А если бы скорость была равна, на сколько бы пунктов было выше качество?

          Качество понятие очень растяжимое. Если его измерять как оценку по 5-балльной шкале или оценку предпочтений, то уже на этапе v2 синтеза ОБЫЧНЫЕ люди в телефоне не могли отличить по 1 фразе синтез от не-синтеза.

          Копать имхо надо в сторону интонаций / контроля эмоций / интонаций.

          Если не возражаете, можете прогуляться на 4pda. Откройте Айдара в аудиоредакторе. В лучшем случае, паузы 200 и менее миллисекунд. Если память не изменяет, рядовым является 400-750 мс. Особое внимание отрывку 30-48 секунд. Да, пунктуация там может непростая, но она есть. Можете убедиться по другим озвучкам.

          Нет времени читать все 56 страниц форума. Вы можете прислать конкретные проблемные участки с минимальным кодом для их репликации? Иначе разговор получается не очень предметным.

          При озвучке абзацев или не дай создатель, еще больших фрагментов — структура текста теряется. Не считаю это значимой проблемой — "Побить на предложения и вперёд". Но многие, если не большинство, будут использовать библиотеку именно так и впечатление будет соответствующее. Решение за вами.

          Если вам нужен контроль длины пауз или более длинные паузы между абзацами - то в SSML это всё есть. О какой структуре текста вообще может идти речь в синтезе, который в принципе не понимает смысла прочитанного?


          1. Lecron
            31.10.2025 08:45

            ...не могли отличить по 1 фразе синтез от не-синтеза. Копать имхо надо в сторону интонаций / контроля эмоций / интонаций.

            О какой структуре текста вообще может идти речь в синтезе, который в принципе не понимает смысла прочитанного?

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

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

            Нет времени читать все 56 страниц форума.

            Ссылка ведет на конкретный пост, а не ветку.

            Если вам нужен контроль длины пауз или более длинные паузы между абзацами - то в SSML это всё есть.

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


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

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

              Тут намешано 3 разных понятия:

              • Чтение вопросов;

              • Чтение восклицаний;

              • Интонация в рамках уже не предложения, а в рамках абзаца / страницы текста.

              Если первое и второе решаемо в принципе для компактных локальных моделей, то третье скорее всего решаемо в рамках гигантских моделей.

              Ссылка ведет на конкретный пост, а не ветку.

              При попытке открыть аудио выдает 404. Если есть конкретные предложения или баги по чтению конкретных фраз - то прошу приложить минимальный код для репликации ошибки (в посте этого нет) или проблемы - мы поправим.


              1. Lecron
                31.10.2025 08:45

                Интонация в рамках уже не предложения, а в рамках абзаца / страницы текста.

                Да нет же. Монотонность создается отсутствием пауз. Должна ли пауза повествовательного отличаться от его длительности? Или длительности последнего "блока", от запятой до финала? Какая пауза должна быть на многоточии, тире? А у восклицательного и вопросительного?

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

                Слишком все бросились в нейросети. Решают квадратное уравнение через интегралы :)

                При попытке открыть аудио выдает 404.

                Нужна регистрация для доступа к вложениям, вроде бы.

                Ошибка не в конкретном месте. Мол везде хорошо, а тут. Ошибка в отсутствии. Системном. Лучше покажу в волновой форме. Основное внимание на диапазон 50-80% трека, но и остальное показательно.

                Скрытый текст


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

                  Я не понимаю, что конкретно от нас требуется. Можете сформулировать мысль в таком ключе:

                  • Вот аудио;

                  • Вот сниппет кода, которым его сгенерировали;

                  • Вот как должно быть / что не так с этим аудио;


                  1. Lecron
                    31.10.2025 08:45

                    В таком нет. Но попробую близко.

                    Обратите внимание на структуру, чередование сигнал-тишина. Как для внутренней пунктуации предложения, так и между ними. В качестве образца можете взять абсолютно любой текст на ~1 минуту звучания, а в качестве эталона озвучку любым другим синтезатором, а лучше живую речь.

                    По данному примеру... например, в двух других голосах видна 1 запятая в первом предложении и 2 в третьем. У вас сплошной поток. И так далее по всему треку.


                    1. 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 голоса, на остальных тоже видно.


                      1. Lecron
                        31.10.2025 08:45

                        Потому что не я делал демку.

                        По вашему примеру... текст должен быть чуть больше, либо уменьшить масштаб. И тут нет эталона. Нет сравнения. Сравнения не между вашими голосами, а с вашими голосами. Я же не сказал, что у вас совсем нет "артикуляции", лишь что она слабовыразительна, до полной потери.

                        Попросите в понедельник прочесть этот фрагмент кого-то из коллег, не особо привлекая к этому внимания, чтобы получилась речь в естественной среде. Ну либо просто забейте, если считаете это не важным, а мои реплики придирками. Так тоже может быть. До следующей встречи, коллега.


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

                        Исходя из базовых тестов я не увидел "слабовыразительности" и "до полной потери".

                        Вы ссылаетесь на тесты другого человека, но по ссылке выше непонятно как повторить результат.

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

                        Есть подозрение, что возможно что иначе дело с пре-процессингом текста. Но если честно я даже не знаю, как тут можно что-то сломать.

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

                        Но это же движок, в его задачи не входит нормализация текста. То есть при полноценной поддержке SSML, можно конечно ввести какое-то правило, что при наличии знака переноса строки мы считаем его параграфом, но это немного влазит на чужую территорию.


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

          Про продакшен вам конечно виднее.

          Создавать виртуалов

          А правила хабра неплохо бы не нарушать.


  1. anonymous
    31.10.2025 08:45


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

      Часто путает е и э в словах типа "модЭли",

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

      и вообще ударения

      Если есть конкретные слова, где есть ошибки - можете прикрепить список / файл сюда, или создать тикет, мы поправим. Если ошибка в омографах, то модель естественно не всегда ставит омографы правильно, но это пока буквально первая версия модель омографов.

      Текст для озвучки приходится готовить в больших ллм, транслитерировать, разворачивать сокращения итп. После этого уже непонятно зачем локально генерировать если можно через тот же edge-tts озвучить.

      Скоро люди, чтобы за покупками сходить будут что-то в больших ЛЛМ готовить. Без меня уже тома написаны на эту тему, что компании, которые хостят такие АПИ работают в безумный убыток и в продакшене очень странно стучаться в американский сервис с конским ценником.

      Кейсы бывают разные - и полностью решить задачу нормализации на русском языке, чтобы это работало условно за 10ms на 1 потоке процессора - задача мягко говоря нетривиальная.

      После этого уже непонятно зачем локально генерировать если можно через тот же edge-tts озвучить.

      Удивительно, что кто-то ещё задаёт такой вопрос в 2025 году. Тут могу посоветовать посмотреть на направление куда развивается Windows и сделать выводы. Также в коде библиотеки есть замечательный файлик drm.py, который намекает, что аттракцион неслыханной щедрости может в любом момент закончиться.


  1. anonymous
    31.10.2025 08:45


  1. anonymous
    31.10.2025 08:45