В нашей прошлой статье мы ускорили наши модели в 10 раз, добавили новые высококачественные голоса и управление с помощью SSML, возможность генерировать аудио с разной частотой дискретизации и много других фишек.
В этот раз мы добавили:
- 1 высококачественный голос на русском языке (
eugeny
); - Синтез на 20 языках, 174 голоса;
- В список языков входят 5 языков народов СНГ: калмыцкий, русский, татарский, узбекский и украинский;
- В список языков входят 5 вариаций на тему романо-германских языков: английский, индийский английский, испанский, немецкий, французский;
- Также в список языков входят 10 языков народов Индии;
- Новую значительно улучшенную модель для простановки ударений и буквы
ё
со словарем в 4 миллиона слов и точностью 100% (но естественно с рядом оговорок); - Все модели наследуют все "фишки" прошлого релиза, кроме автоматической простановки ударений для языков отличных от русского;
Пока улучшение интерфейсов мы отложили на некоторое время. Ускорить модели еще в 3+ раза мы тоже смогли, но пока с потерей качества, что не позволило нам обновить их прямо в этом релизе.
Попробовать модель как обычно можно в нашем репозитории и в колабе.
Как попробовать
Для самых нетерпеливых — вот основные примеры звучания на русском языке:
Как обычно, все инструкции, все модели и языки можно найти:
- В нашем публичном репозитории по ссылке. Вам нужны модели для синтеза
v3
; - Или можно прямо в колабе;
Вот самый минималистичный пример вызова модели:
import torch
device = torch.device('cpu')
torch.set_num_threads(4)
speaker = 'xenia' # 'aidar', 'baya', 'kseniya', 'xenia', 'eugene', 'random'
sample_rate = 48000 # 8000, 24000, 48000
model, example_text = torch.hub.load(repo_or_dir='snakers4/silero-models',
model='silero_tts',
language='v3_1_ru')
model.to(device)
audio = model.apply_tts(text=example_text,
speaker=speaker,
sample_rate=sample_rate)
Спикеров и принимаемые символы для каждой модели можно посмотреть в свойствах модели model.speakers
и model.symbols
.
import os
import torch
device = torch.device('cpu')
torch.set_num_threads(4)
local_file = 'model.pt'
speaker = 'xenia' # 'aidar', 'baya', 'kseniya', 'xenia', 'eugene', 'random'
sample_rate = 48000 # 8000, 24000, 48000
if not os.path.isfile(local_file):
torch.hub.download_url_to_file('https://models.silero.ai/models/tts/ru/v3_1_ru.pt',
local_file)
model = torch.package.PackageImporter(local_file).load_pickle("tts_models", "model")
model.to(device)
audio = model.apply_tts(text=example_text,
speaker=speaker,
sample_rate=sample_rate)
Больше примеров вы можете найти по ссылкам в репозитории. С недавнего времени у моделей также появился своё pip
-пакет, аналогичный по функционалу импорту через torch.hub
.
Более подробное описание всех фишек, связанных с управлением голосом вы сможете найти в прошлой cтатье, тут не будем повторяться.
Новые модели и языки
Язык модели | Название модели | Число языков | Число голосов |
---|---|---|---|
Английский | v3_en |
1 | 118 |
Английский (Индия) | v3_en_indic |
1 | 15 |
Испанский | v3_es |
1 | 3 |
Калмыцкий | v3_xal |
1 | 2 |
Немецкий | v3_de |
1 | 5 |
Русский | v3_1_ru |
1 | 5 |
Татарский | v3_tt |
1 | 1 |
Узбекский | v3_uz |
1 | 1 |
Украинский | v3_ua |
1 | 1 |
Французский | v3_fr |
1 | 6 |
Языки народов Индии | v3_indic |
10 | 17 |
Для всех моделей с более чем одним спикером доступен "случайный" спикер.
Чтобы не делать статью гигантской, просто приведу примеры звучания для каждого языка под спойлером. Попробовать модели как обычно вы можете:
- В нашем публичном репозитории по ссылке. Вам нужны модели для синтеза
v3
; - Или можно прямо в колабе;
Английский
Английский (Индия)
Испанский
Калмыцкий
Немецкий
Русский
Татарский
Узбекский
Украинский
Французский
Языки народов Индии
Улучшение модели простановки ударений
Но если без шуток, то задача простановки ударений оказалась сильно сложнее, чем мы предполагалось, но мы смогли добиться в ней впечатляющего прогресса. Если коротко, то нам удалось:
- Собрать словарь ударений размером примерно в 4 миллиона слов с высоким покрытием разных корпусов;
- Натренировать максимально сжатую модель, выдающую точность 100% (это не ошибка) на таком словаре общим размером менее 2.6 мегабайт (!);
- Инициировать итерационный процесс улучшения и проверки словаря;
- Добиться нетривиальной точности на омографах (но в текущий релиз эти модели пока не вошли) в районе 80%;
Сложность такой задачи покоится на 3 китах:
- Сложность сбора и валидации большого и качественного словаря с ударениями;
- Сложность "упаковки" и сжатия быстрой модели, которая со 100% точностью расставляет ударения на заданном словаре;
- Сложность обработки большого количества краевых
Про каждый из этих пунктов мы отдельно расскажем.
Словарь
Нам удалось собрать словарь размером примерно в 4 миллиона слов. Эти 4 миллиона слов примерно разбиваются на следующие категории:
- Примерно 100,000 частотных слов (5,000 и более вхождений), P95;
- Примерно 1,000,000 слов средней частоты (100 и более вхождений), P50;
- Примерно 3,000,000 "редких" слов;
Из этих 4 миллионов слов примерно 100 тысяч имели "спорное" ударение и были "кандидатами" в омографы. Из этих 100 тысяч у нас получилось выделить следующие категории:
- 50,000 сложных слов с 2 ударениями — мы ими пока просто пренебрегли (и оставили только основное ударение);
- 15,000 частотных слов — "кандидатов" в омографы;
- 35,000 слов — "длинный хвост";
Из 15,000 самых популярных "кандидатов" для части слов (примерно 5,000 штук) мы смогли найти наиболее популярную форму с помощью морфологических парсеров и принять ее за "эталонную". Для остальных — мы просто случайно выбрали одну из форм. Это одна из проблем словаря.
Другая проблема состоит в том, что в словаре много мусора или очень редких форм и часть слов из топовых 100,000 слов имеет просто неверное ударение.
Тут небольшая ремарка, на момент отправки статью в публикацию, мы успели проверить 20,000 самых популярных слов из словаря. Процесс автоматизированный и с многократной проверкой, но естественно не идеальный.
Мы добились того, что наша модель выдает 100% точность на нашем словаре, но в голове нужно держать этот ряд оговорок:
- Часть ударений просто неверная;
- Для известных нам "настоящих" омографов стоит по умолчанию более популярная форма;
- Для части слов ударение было поставлено случайно из имеющихся опций;
- Процесс проверки топ 100,000 самых популярных слов все еще идет (проверено 20,000 слов);
Чтобы дать примерную оценку качества нашего словаря приведем статистику покрытия на популярных интернет корпусах:
Домен | Текстов | Словарь | … P95 | Покрытие текстов, % | … словаря, % | … P95, % |
---|---|---|---|---|---|---|
Финансы | 39,357,993 | 289,182 | 11,531 | 90.9 | 76.05 | 95.37 |
Common Crawl | 300,021,148 | 536,319 | 17,236 | 90.07 | 61.7 | 95.99 |
Книги | 100,013,036 | 903,862 | 29,268 | 91.09 | 61.71 | 95.27 |
Новости | 25,403,505 | 839,365 | 14,559 | 82.53 | 32.09 | 92.49 |
Субтитры | 44,641,621 | 299,061 | 11,764 | 92.82 | 73.14 | 92.97 |
Поэзия, литература | 100,014,088 | 824,830 | 28,031 | 92.56 | 66.38 | 97.65 |
Википедия | 29 401,392 | 768,451 | 21,916 | 85.93 | 54.78 | 96 |
Общая статистика | 638,852,783 | 1,382,006 | 73,556 | 90.69 | 51.57 | 93.28 |
Словарь корпуса включает в себя только слова, встречающиеся более 10 раз (иначе общий словарь всех корпусов вырастет до 40 миллионов "слов").
Также для удобства пользования мы выкладываем наш словарь омографов и словарь из слов "кандидатов" в омографы, на которых мы случайно проставили ударение.
Также опережая очевидный вопрос, почему покрытие P95 не составляет 100%, мы посмотрели каких слов не хватает. В основном там:
- Имена собственные;
- Артефакты процессинга текста и склеенные слова (например, "такойчто" или "неизвестнокогда");
- Cлова вроде "хм-м", "ааа";
- И довольно редко встречаются недостающие формы существующих слов;
Со всеми вышеописанными оговорками, наше решение имеет точность в 100% на нашем словаре и занимает примерно 0.2 миллисекунды на 1 слово.
Сравнение с публичными инструментами
Ради интереса, мы также сравнили метрики на нашем словаре с другими публично доступными решениями для простановки ударений:
Инструмент | Точность на всём словаре, % | … на словаре P95, % | … на словаре P50, % |
---|---|---|---|
espeak |
89.58 | 95.86 | 81.37 |
russtress |
89.47 | 91.98 | 85.63 |
russian_accentuation |
70.3 | 83.86 | 58.86 |
Сжатие модели
Словарь на 4 миллиона слов весит примерно 100 мегабайт. Наша модель весит примерно 2.6 мегабайта.
Сжатие | Размер, MB | Сжатие, раз |
---|---|---|
Словарь | 98 | 1.0 |
Словарь + gzip | 23 | 4.3 |
Наша модель | 2.6 | 37.7 |
То есть у нас получилось с учетом всех вспомогательных файлов и весов модели добиться сжатия словаря примерно в 40 раз. Мое личное мнение — это отличный результат.
Причем если словарь допустим увеличить до 10 миллионов слов, размер модели должен вырасти в сильно меньшей пропорции.
Краевые случаи
Для полноты картины опишем явно известные нам, решенные и еще не решенные краевые случаи.
Решенные краевые случаи:
- Такие слова как
как-то
,кое-кто
,где-нибудь
, итд; - Возможность сохранения авторской пунктуации;
- Возможность использования проставленного пользователем ударения и проставленной буквы
ё
; - Разного рода "сложные" слова через дефис (например
квадратно-гнездовой
);
Частично и ещё не решенные краевые случаи:
- Ручная чистка и проверка 100,000 самых популярных слов в словаре;
- Омографы, настоящие и "кандидаты" в омографы;
- Настоящие слова с 2 ударениями (например
заднеприводный
);
Генерализация модели
Модель так построена, что она в первую очередь хорошо умеет запоминать слова. Но ее архитектура не мешает ей иметь ограниченную генерализацию. В общем — чем длиннее слово — тем лучше генерализация.
И естественно мы пробовали подавать ей разного рода экзотические текста, и в целом по нашим наблюдениям:
- В именах, особенно коротких, часто бывает рандом;
- В длинных и составных словах модель чувствует себя получше;
- В выдуманных и составных русских словах ударение обычно ставится правильно;
Несколько примеров:
гл+окая к+уздра кудлан+ула б+окра +и кудр+ячит бокренк+а
Ег+о н+е призн+али в г+ороде р+одном +и вс+е ег+о шпын+яли +и н+очью, +и дн+ём. Н+е ст+оит огорч+аться +и н+е ст+оит роб+еть, +а л+учше +эту п+есенку вм+есте проп+еть: "К+отопес! К+отопес! Ед+инственный в мир+е мал+ыш К+отопес!
П+осле П+ервой войн+ы с Мельк+ором Вал+ар воздв+игли в Ард+е дв+а Вел+иких Свет+ильника +и созд+али п+ервое корол+евство н+а +острове Алмарен.
+Этому д+олгому м+иру приш+ёл кон+ец, когд+а Мельк+ор т+айно верн+улся в +Арду +и низв+ерг Свет+ильники. Вал+ар в Ам+ане основ+али втор+ое корол+евство Валин+ор.
Йав+анна в+ырастила дв+а Др+ева Св+ета, кот+орые освещ+али Валин+ор, н+о оставл+яли Средиз+емье в+о тьм+е Мельк+ора. В б+олее п+оздних эп+охах +эти дер+евья дал+и плод+ы, кот+орые ст+али С+олнцем +и Лун+ой.
с+аша +аня паш+а м+аша зуб+арджат аннаб+ель +анна-мар+ия ангел+ина лар+иса нат+аша д+аша игн+ат иннок+ентий дил+яра караб+ас-бар+абас бурат+ино пуш+инчик ман+я юр+а +юрий +юрасик
Дальнейшие планы
Мы не планируем останавливаться на достигнутом и собираемся продолжать развивать наш синтез:
- Ускорить его еще в несколько раз;
- Прикрутить квантизацию и ONNX для какой-то кастрированной версии синтеза, тем самым возможно ускорив его еще в 2-4 раза;
- Проверить все 100,000 слов на предмет правильности ударений;
- Решить хотя бы самые частотные омографы;
- Добавить возможность использовать фонемы напрямую для синтеза для произношения сложных слов и аббревиатур;
- Дальше развивать фишки по управлению интонацией речи и произношением;