В нашей прошлой статье мы ускорили наши модели в 10 раз, добавили новые высококачественные голоса и управление с помощью SSML, возможность генерировать аудио с разной частотой дискретизации и много других фишек.
В этот раз мы добавили:
- 1 высококачественный голос на русском языке (
eugeny
); - Синтез на 20 языках, 174 голоса;
- В список языков входят 5 языков народов СНГ: калмыцкий, русский, татарский, узбекский и украинский;
- В список языков входят 5 вариаций на тему романо-германских языков: английский, индийский английский, испанский, немецкий, французский;
- Также в список языков входят 10 языков народов Индии;
- Новую значительно улучшенную модель для простановки ударений и буквы
ё
со словарем в 4 миллиона слов и точностью 100% (но естественно с рядом оговорок); - Все модели наследуют все "фишки" прошлого релиза, кроме автоматической простановки ударений для языков отличных от русского;
Пока улучшение интерфейсов мы отложили на некоторое время. Ускорить модели еще в 3+ раза мы тоже смогли, но пока с потерей качества, что не позволило нам обновить их прямо в этом релизе.
Попробовать модель как обычно можно в нашем репозитории и в колабе.
Как попробовать
Для самых нетерпеливых — вот основные примеры звучания на русском языке:
Как обычно, все инструкции, все модели и языки можно найти:
Вот самый минималистичный пример вызова модели:
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 |
Для всех моделей с более чем одним спикером доступен "случайный" спикер.
Чтобы не делать статью гигантской, просто приведу примеры звучания для каждого языка под спойлером. Попробовать модели как обычно вы можете:
Английский
Английский (Индия)
Испанский
Калмыцкий
Немецкий
Русский
Татарский
Узбекский
Украинский
Французский
Языки народов Индии
Улучшение модели простановки ударений
Но если без шуток, то задача простановки ударений оказалась сильно сложнее, чем предполагалось, но мы смогли добиться в ней впечатляющего прогресса. Если коротко, то нам удалось:
- Собрать словарь ударений размером примерно в 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 слов на предмет правильности ударений;
- Решить хотя бы самые частотные омографы;
- Добавить возможность использовать фонемы напрямую для синтеза для произношения сложных слов и аббревиатур;
- Дальше развивать фишки по управлению интонацией речи и произношением;
Комментарии (14)
vagon333
07.06.2022 00:47+1У вас в примерах есть британский английский, но я не услышал американский английский.
Есть модель американского английского, или ограничились только британским?
dmitryvolochaev
07.06.2022 10:42+1В выдуманных и составных русских словах ударение обычно ставится правильно
А что такое "правильное ударение" для выдуманных слов?
snakers4 Автор
07.06.2022 12:36Пара примеров:
глокая куздра
заднеприводный
, но заменитьзадне
на какое-то другое слово
ElvenSailor
07.06.2022 11:04+3это круто!
но,кто такие "мы" ?
это не троллинг, из статьи реально не очевидно.
Lecron
07.06.2022 13:10+1Предположу что написанное уже учтено, но на всякий случай хотелось бы отметить. Очень уж хочется решения давней проблемы.
Омографы можно разделить на группы:мн.им/ед.род — скалы, адреса, беды;
жен/муж — внучка, ворона, голубка, толстячкам;
сов/несов — зерно (еще) высыпАлось, зерно (уже) вЫсыпалось;
смысловые;
возможно какие-то еще.
Каждая группа требует немного различных критериев. Многие из которых, можно перенести от одного популярного слова на другие непопулярные, для которых составление корпуса для индивидуального обучения затруднительно. Можно вообще обучать группой. И только смысловые — индивидуально.
Просмотрел ваш список омографов. В первой сотне нашел слова — отзывы, сила, стихи, — вторую форму которых представить не смог.
censor2005
07.06.2022 15:04+1Потрясающая работа! Такой вопрос: примеры из коллаба должны выводить звук на динамик? Запустил локально, работает только пример с генерацией wav, а на динамик выводить не хочет.
snakers4 Автор
07.06.2022 15:23+1Там есть примеры, которые выводят. Но в колабе есть Ipython, он по сути выводит аудио в элементе веб страницы. Как играть аудио у себя - зависит от того на чем играть.
Скорее всего это гуглится по слову pyaudio.
Holser
08.06.2022 16:23-3А что такое народы СНГ? Украина вышла из СНГ вышла в 2018 году. Можно убрать этот имперский фразеологизм?
MAXH0
Доброго вечера! Можно задать вопрос.
Если использовать эти голоса для записи школьных видео-уроков, то это платно или нет?
Где вообще можно узнать подробности?
snakers4 Автор
Если использование некоммерческое, то почему нет.
MAXH0
Спасибо за ответ, но можно мне позанудствовать?
Как педагог я получаю зарплату. А если я выложил видео в Vk и повышаю популярность своей ленты. А если школьники делают проект и собираются его подавать... Варианты есть разные когда некомерческое становится коммерческим... Можно уточнить все же где читать подробности?
Меня бы очень устроила образовательная лицензия, где все это было бы подробно расписано.
alekssamos
Я запустил локально на своём домашнем ноутбуке, всё хорошо, работает. Так что вполне себе можно.