Мы опубликовали silero-tts v5 на русском языке. silero.. silero. tts.. silero. tts. нейросети.. silero. tts. нейросети. озвучка.. silero. tts. нейросети. озвучка. омографы.. silero. tts. нейросети. озвучка. омографы. русский язык.. silero. tts. нейросети. озвучка. омографы. русский язык. синтез речи.. silero. tts. нейросети. озвучка. омографы. русский язык. синтез речи. синтезатор речи.. silero. tts. нейросети. озвучка. омографы. русский язык. синтез речи. синтезатор речи. ударение.
Пора!

Пора!

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

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

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

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

Автор: snakers4

Источник

Rambler's Top100