- BrainTools - https://www.braintools.ru -
Время пришло. Мы решили задачу омографов [1] (пока в первой версии, но идей ещё вагон) и теперь удовольствие от публикации наших новых публичных моделей синтеза наконец-то будет полным! Более того, что следом за ними пойдут ещё кое-какие модели, но это будет сюрприз.
Что поменялось:
Модели стали в 3-4 раза быстрее, чем v3 , и в 1.5 – 2 раза быстрее, чем v4;
Добавилась автоматическая расстановка ударений в омографах;
Значительно повысилось качество звучания и стабильность генерации;
В моделях всё так же поддерживается SSML [2];
Список голосов: 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 – простановка ударений в омографах с буквой ё;
Мы специально сделали полную группу флагов, чтобы пользователи могли гибко и тонко настраивать движок под себя.
Подробно почитать про саму расстановку омографов можно тут [1].
У наших моделей скорость работы теперь находится почти уже на грани возможного (без жертв качеством). Мы пробовали много всякого, чтобы сделать модели ещё быстрее, но везде есть компромиссы. К примеру можно снизить потребление ресурсов в разы, но скорость от этого упадёт. Или можно ещё ускориться в пару (тройку?) раз, но начнёт заметно проседать качество (или модели перестануть работать на каком-то классе устройств).
Мы снимали скорость модели для простановки омографов на достаточно стрессовых данных. На обычных данных просадка по скорости при вызове омографов менее заметна.
Скорость, измеренная в секундах синтезированного аудио в секунду у нас получилась такая:
|
Устройство |
Только 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 секунд. Также при генерации сразу сильно длинного аудио (до минуты) скорость немного проседает. Лучше генерировать короткими абзацами или длинными предложениями. При тестировании использовались реальные предложения с омографами.
Въедливый читатель может заметить, что при пересчёте цифр скорости работы омографа и синтеза получается, что омографы как-то мало влияют на скорость работы синтеза. Но мы специально убедились, что всё посчитано верно и посчитали смешной стресс [3] тест.
Предложения, на которых замеряли выглядели примерно так:
Когда горбачёвская оттепель приобрела довольно-таки явные …
Замена:
мести горбачёвская оттепель приобрела довольно-таки явные …
мести ядра оттепель приобрела довольно-таки явные …
мести ядра воронья приобрела довольно-таки явные …
Теперь у нас также есть 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 со всеми флагами уже выглядит вот так (подробнее можно потыкать в интерактивном ноутбучке [4]):
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
Источник [5]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/21358
URLs in this post:
[1] омографов: https://habr.com/ru/articles/955130/
[2] SSML: https://github.com/snakers4/silero-models/wiki/SSML
[3] стресс: http://www.braintools.ru/article/9548
[4] ноутбучке: https://colab.research.google.com/github/snakers4/silero-models/blob/master/examples_tts.ipynb
[5] Источник: https://habr.com/ru/articles/961930/?utm_campaign=961930&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.