Теперь наш синтез на 20 языках

В нашей прошлой статье мы ускорили наши модели в 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; - Или можно прямо в колабе;
Английский
Английский (Индия)
Испанский
Калмыцкий
Немецкий
Русский
Татарский
Узбекский
Украинский
Французский
Языки народов Индии
Улучшение модели простановки ударений
![]()
Но если без шуток, то задача простановки ударений оказалась сильно сложнее, чем мы предполагалось, но мы смогли добиться в ней впечатляющего прогресса. Если коротко, то нам удалось:
- Собрать словарь ударений размером примерно в 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 слов);
Чтобы дать примерную оценку качества нашего словаря приведем статистику покрытия на популярных интернет корпусах:
Словарь корпуса включает в себя только слова, встречающиеся более 10 раз (иначе общий словарь всех корпусов вырастет до 40 миллионов «слов»).
Также для удобства пользования мы выкладываем наш словарь омографов и словарь из слов «кандидатов» в омографы, на которых мы случайно проставили ударение.
Также опережая очевидный вопрос, почему покрытие P95 не составляет 100%, мы посмотрели каких слов не хватает. В основном там:
- Имена собственные;
- Артефакты процессинга текста и склеенные слова (например, «такойчто» или «неизвестнокогда»);
- Cлова вроде «хм-м», «ааа»;
- И довольно редко встречаются недостающие формы существующих слов;
Со всеми вышеописанными оговорками, наше решение имеет точность в 100% на нашем словаре и занимает примерно 0.2 миллисекунды на 1 слово.
Сравнение с публичными инструментами
Ради интереса, мы также сравнили метрики на нашем словаре с другими публично доступными решениями для простановки ударений:
Сжатие модели
Словарь на 4 миллиона слов весит примерно 100 мегабайт. Наша модель весит примерно 2.6 мегабайта.
То есть у нас получилось с учетом всех вспомогательных файлов и весов модели добиться сжатия словаря примерно в 40 раз. Мое личное мнение — это отличный результат.
Причем если словарь допустим увеличить до 10 миллионов слов, размер модели должен вырасти в сильно меньшей пропорции.
Краевые случаи
Для полноты картины опишем явно известные нам, решенные и еще не решенные краевые случаи.
Решенные краевые случаи:
- Такие слова как
как-то,кое-кто,где-нибудь, итд; - Возможность сохранения авторской пунктуации;
- Возможность использования проставленного пользователем ударения и проставленной буквы
ё; - Разного рода «сложные» слова через дефис (например
квадратно-гнездовой);
Частично и ещё не решенные краевые случаи:
- Ручная чистка и проверка 100,000 самых популярных слов в словаре;
- Омографы, настоящие и «кандидаты» в омографы;
- Настоящие слова с 2 ударениями (например
заднеприводный);
Генерализация модели
Модель так построена, что она в первую очередь хорошо умеет запоминать слова. Но ее архитектура не мешает ей иметь ограниченную генерализацию. В общем — чем длиннее слово — тем лучше генерализация.
И естественно мы пробовали подавать ей разного рода экзотические текста, и в целом по нашим наблюдениям:
- В именах, особенно коротких, часто бывает рандом;
- В длинных и составных словах модель чувствует себя получше;
- В выдуманных и составных русских словах ударение обычно ставится правильно;
Несколько примеров:
гл+окая к+уздра кудлан+ула б+окра +и кудр+ячит бокренк+аЕг+о н+е призн+али в г+ороде родн+ом +и вс+е ег+о шпын+яли +и н+очью, +и дн+ём. Н+е ст+оит огорч+аться +и н+е ст+оит роб+еть, +а л+учше +эту п+есенку вм+есте проп+еть: «К+отопес! К+отопес! Ед+инственный в м+ире мал+ыш К+отопес!
П+осле П+ервой войн+ы с Мельк+ором Вал+ар воздв+игли в Ард+е дв+а Вел+иких Свет+ильника +и созд+али п+ервое корол+евство н+а +острове Алмарен.
+Этому д+олгому м+иру приш+ёл кон+ец, когд+а Мельк+ор т+айно верн+улся в +Арду +и низв+ерг Свет+ильники. Вал+ар в Ам+ане основ+али втор+ое корол+евство Валин+ор.
Йав+анна в+ырастила дв+а Др+ева Св+ета, кот+орые освещ+али Валин+ор, н+о оставл+яли Средиз+емье в+о тьм+е Мельк+ора. В б+олее п+оздних эп+охах +эти дер+евья дал+и плод+ы, кот+орые ст+али С+олнцем +и Лун+ой.с+аша +аня паш+а м+аша зуб+арджат аннаб+ель +анна-мар+ия ангел+ина лар+иса нат+аша д+аша игн+ат иннок+ентий дил+яра караб+ас-бар+абас бурат+ино пуш+инчик ман+я юр+а +юрий +юрасик
Дальнейшие планы
Мы не планируем останавливаться на достигнутом и собираемся продолжать развивать наш синтез:
- Ускорить его еще в несколько раз;
- Прикрутить квантизацию и ONNX для какой-то кастрированной версии синтеза, тем самым возможно ускорив его еще в 2–4 раза;
- Проверить все 100,000 слов на предмет правильности ударений;
- Решить хотя бы самые частотные омографы;
- Добавить возможность использовать фонемы напрямую для синтеза для произношения сложных слов и аббревиатур;
- Дальше развивать фишки по управлению интонацией речи и произношением;
