Наконец-то представляем наш синтез для я��ыков России и СНГ. В этот раз получилось покрыть 20 языков, всего 95 голосов. От старой демки этот релиз отличается следующим:
Модель поддерживает SSML;
Модель стала быстрее примерно на 20-25% (до 100 секунд аудио в секунду на CPU);
С живыми дикторами были подписаны договоры на запись их голоса;
Запись велась в максимально высоком из практически доступного качестве на качественные микрофоны;
Для ряда языков опубликованы модели простановки ударений и / или словари с ударениями в рамках
silero-stress;К модели синтеза применены все оптимизации, как к нашей прошлой публичной модели;
В прошлый раз мы использовали шумные публичные данные низкого качества. В этот раз большинство голосов мы записывали самостоятельно - как следствие выросло качество синтеза.
Оглавление статьи c якорями
Примеры звучания синтеза
Сразу приведём примеры звучания:
Принципы выбора языков и список языков
Если просуммировать количество носителей родного языка (для всех стран СНГ кроме Белоруссии понятие родного языка и языка, на котором говорят в семье, являются почти синонимами) в России и странах СНГ на основе последних официальных переписей населения, то существует как минимум следующее число языков (исключая русский язык):
3 языка с более чем 10 миллионами носителей (украинский, узбекский, казахский);
14 языков с более чем 1 миллионом, но менее чем 10 миллионами носителей;
23 языка с более чем 100 тысячами, но менее чем 1 миллионом носителей.
При выборе языков, мы ставили перед собой следующие задачи:
Покрыть как минимум 10 популярных языков России и СНГ;
Все дикторы должны записать как свой родной язык, так и русский язык как второй (при этом мы не ставили задачу найти дикторов с идеальным знанием русского языка);
Родной язык должен быть … родным, то есть первым языком (везде кроме Белоруссии родной почти равен первому языку, официальному языку и языку общения в семье и на работе);
Синтез должен работать на основе единого алфавита на основе кириллицы и уметь как в родной язык, так и в русский язык;
Как следствие все дикторы должны свободно владеть и русским языком. Естественно, если русский не первый язык - то возможен акцент. Найти людей у которых было бы ДВА родных языка в нашем случае затруднительно (хотя есть и яркие исключения).
Как ни странно, найти готовых записать свой голос людей, которые бы соответствовали всем критериям было довольно сложно и было много процессуальных вопросов. Всего мы так или иначе связались где-то с тысячей человек, более-менее плотно пообщались с сотней-другой, записать удалось более 30 разных голосов.
От себя лично благодарю всех участников проекта. В знак благодарности за проделанную работу мы продолжили свою традицию, и назвали все голоса в нашем синтезе в честь людей, которые собственно их и записывали. Внешние голоса не везде имели имена, и поэтому некоторые нам пришлось придумать.
Всего покрыть получилось следующие языки (число носителей родного языка примерное, округлено до 1 знака вверх, сумма последних официальных национальных переписей и переписи РФ):
Список покрытых языков
ID |
Название |
Родной язык, M |
ru |
Русский |
112 |
ukr |
Украинский |
32 |
uzb |
Узбекский |
24 |
kaz |
Казахский |
10 |
aze |
Азербайджанский |
8.5 |
tgk |
Таджикский |
7.8 |
bel |
Белорусский |
5 |
tat |
Татарский |
4 |
kat |
Грузинский |
4 |
kir |
Киргизский |
3.8 |
hye |
Армянский |
3.5 |
bak |
Башкирский |
1.3 |
chv |
Чувашский язык |
0.8 |
kbd |
Кабардино-черкесский |
0.6 |
sah |
Якутский |
0.5 |
udm |
Удмуртский |
0.3 |
mdf |
Мокшанский |
0.2 |
xal |
Калмыцкий |
0.2 |
kjh |
Хакасский |
0.1 |
erz |
Эрзянский |
0.1 |
Несложно заметить, что задача по покрытию самых популярных языков была выполнена, но не были покрыты в основной массе многочисленные языки Дагестана и Чечни.
Также внимательный читатель может заметить, что у ряда языков вообще-то алфавит основан не на кириллице или был де-факто или де-юре официально заменён на латиницу. Изначально мы вообще не планировали делать такие языки. Но, в частности, к нам обратились носители армянского и грузинских языков и мы не смогли им отказать в участии в нашем проекте. Тем более, что как оказалось алфавиты у них хоть и древние, но весьма фонетические и поддающиеся "кириллизации".
Не будем погружаться в политику, но есть регионы где переход на латиницу по факту состоялся, а есть регионы - где по факту все всё равно или так и используют кириллицу (включая разные регионы нашей страны). В этой статье мы не ставим задачу давать оценку политическим явлениям, но тем не менее мы сделали так, что:
Казахский принимает только кириллицу;
Азербайджанский и узбекский принимают оба алфавита.
Предобработка данных и фонетика
В общем работа для каждого языка строилась следующим образом:
Мы анализировали алфавит и подбирали схему унификации и приведения к расширенной кириллице;
Мы собирали корпуса текстов. Предпочтение отдавали или уже готовым корпусам, или книгам или новостным ресурсам. Контент сайтом социальных сетей старались не использовать;
Далее мы применяли ряд хаков и алгоритмов, с целью очистки текста от русского языка, неграмотно написанных слов без использования "правильного" алфавита, ошибок, опечаток и технических дефектов текста. Естественно сделать это на 100% невозможно, особенно для языков более глубоко смешанных с русским;
Далее мы выделяли корпус для разметки ударений и корпус для записи аудио;
Всего мы записывали от 2 часов аудио на родном языке и от часа аудио на русском ("грязных" данных), хотя были энтузиасты, кто записал в разы больше по собственному желанию. Особенно активным в этом плане было комьюнити башкирского языка;
Отдельно размечались ударения. С ними есть определённые моменты, об этом напишем ниже.
Мы ставили задачу максимально обеспечить совместимость с уд��рениями русского языка, но об этом подробнее также напишем ниже. С каждым языком были определённые моменты, но всего будет невозможно уместить, иначе статья очень растянется.
В начале работы мы выдвинули следующие гипотезы:
Фонемы не нужны для такого синтеза;
Алфавиты достаточно фонетические, чтобы использовать их напрямую или с рядом фонетических замен;
Алфавиты, не основанные на кириллице, также приводятся к ней простыми заменами;
Синтез для славянских языков нормально не работает без явной простановки ударения на письме.
Из самого важного, что касается "родословной", фонетики и грамматики языков:
Очень много родственных тюркских языков. Ударение в них в 90% случаев (а где-то даже в 95%) падает на последний слог. Это создаёт определенный дисбаланс и проблемы;
Письмо у большинства языков (кроме языков славянской группы) в больше степени фонетическое;
Мы проанализировали фонетику каждого языка, сделали словари перехода от латиницы в кириллицу и из армянского и грузинского алфавита в кириллицу, унифицировали похожие звуки разных языков, обозначаемые разными буквами;
По итогу многочисленных экспериментов оказалось, что по качеству звучания и генерализации модели разницы между простой конкатенацией разных алфавитов (в том числе исторических и синтетических) и более полной унификацией (мы унифицировали где-то пятую часть символов) - нет. Жаль признавать это, но это показывает, что тезисы в базисе были верные, по сути не подтвердилась только гипотеза про фонетические замены.
Список алфавитов
Для полноты и на всякий случай (вдруг кто-то из носителей родного языка найдёт у нас ошибку) публикуем использованные алфавиты:
Список алфавитов
ID |
Название |
Алфавит(ы) |
aze |
Азербайдж. |
|
aze |
Азербайдж. |
|
hye |
Армянский |
|
bak |
Башкирский |
|
bel |
Белорусский |
|
kat |
Грузинский |
|
kbd |
К.-черкесский |
|
kaz |
Казахский |
|
xal |
Калмыцкий |
|
kir |
Киргизский |
|
mdf |
Мокшанский |
|
ru |
Русский |
|
tgk |
Таджикский |
|
tat |
Татарский |
|
udm |
Удмуртский |
|
uzb |
Узбекский |
|
uzb |
Узбекский |
|
ukr |
Украинский |
|
kjh |
Хакасский |
|
chv |
Чувашский |
|
erz |
Эрзянский |
|
sah |
Якутский |
|
В итоге для всех языков алфавит используется as-is, кроме двух случаев:
Армянский и грузинский - используется настоящий "родной" алфавит, но под капотом модели делают фонетические замены на кириллицу;
Азербайджанский и узбекский - могут использоваться оба алфавита - кириллица и латиница, но модель работает на кириллице.
Решение вопроса ударений
Изначально, по опыту тренировки прошлых би- (и более) -язычных моделей мы думали что если правильно расставить ударения у всех слов во всех языках, то модели научатся в том числе ставить "неправильные" ударения, если их расставить вручную.
Это оказалось так, но не на все 100%. Модели "понимают", что в славянских языках ударение "важно" и бодро реагируют на него, но из-за того, что в других языках ударение часто падает на один и тот же слог (яркий пример - тюркские языки - там от 90% до 95% это последний слог), модели не всегда реагируют на вручную проставленное ударение.
По этой причине мы решили опубликовать две модели:
Одну, которая при тренировке видела вообще все языки с ударениями;
Вторую, которая видела ударения только в славянских языках.
Мы опубликовали наше решение для простановки ударений в рамках проекта silero-stress. Где-то получилось собрать такой большой словарь, что это даже оправдало тренировку модели-акцентора (украинский язык), где-то используется словарь + правила, где-то просто правила:
Таблица ударений
Язык |
Размер словаря |
Акцентор |
Размечен вручную |
Алгоритм доразметки |
|---|---|---|---|---|
ru |
~4 млн |
акцентор |
частично |
— |
ukr |
~3 млн |
акцентор |
частично |
— |
bel |
24 тыс. |
словарь |
да |
никакого, только словарь |
sah |
86 тыс. |
словарь + алгоритм |
частично |
последний слог |
aze |
11 тыс. |
словарь + алгоритм |
да |
последний слог |
hye |
8.5 тыс. |
словарь + алгоритм |
да |
последний слог |
bak |
9.7 тыс. |
словарь + алгоритм |
да |
последний слог |
kat |
12.5 тыс. |
алгоритм |
нет |
предпоследний слог |
kbd |
5.5 тыс. |
словарь + алгоритм |
да |
последний слог |
kaz |
6.8 тыс. |
словарь + алгоритм |
да |
последний слог |
xal |
9 тыс. |
алгоритм |
нет |
последний слог |
kir |
11.7 тыс. |
словарь + алгоритм |
да |
последний слог |
mdf |
5.3 тыс. |
словарь + алгоритм |
да |
первый слог |
tgk |
9 тыс. |
словарь + алгоритм |
да |
последний слог |
tat |
11.5 тыс. |
словарь + алгоритм |
да |
последний слог |
udm |
13.5 тыс. |
алгоритм |
нет |
последний слог |
uzb |
5 тыс. |
алгоритм |
нет |
последний слог |
kjh |
12.3 тыс. |
словарь + алгоритм |
да |
последний слог |
chv |
23 тыс. |
словарь + алгоритм |
да |
последний слог |
erz |
4 тыс. |
словарь + алгоритм |
да |
первый слог |
В языках, у которых в колонке "Акцентор" стоит только "алгоритм", словарь размечен этим же алгоритмом и существует скорее для удобства. Для всех остальных языков словарь был размечен/проверен вручную, и лучше сначала искать слово в словаре, а out-of-vocab слова доразмечать эвристиками.
Мы отдаём себе отчёт, что супер-полезным акценторы будут скорее всего только у русского (там у нас ещё решаются омографы) и украинского языков (пользователи Хабра прислали уже и огромный словарь белорусского языка!).
Но тем не менее первый шаг сделан. Далее шаг, по сути, за сообществом. Если сообществу будут нужны, например следующие инструменты, технология у нас разработана, нужно "просто добавить данных":
Акцентор и решение омографов для украинского и белорусских языков;
Акценторы для прочих языков.
Естественно, начинать надо с простого - с большого словаря ударений. Ещё есть следующая фишечка. Словарь ударений на миллионы слов весит сотни мегабайт. Понятное дело, его можно сжать. Но акцентор это по сути ещё более сильная сжималка - она способна сжать сколь угодно большой словарь ударений до нескольких мегабайт.
Опубликованные модели и список голосов, генерализация
Итого, получается, что всего мы опубликовали четыре модели:
baseмодель под лицензией MIT со всеми ударениями;extмодель под лицензией CC-NC-BY со всеми ударениями;baseмодель под лицензией MIT только с ударениями в славянских языках;extмодель под лицензиейCC-NC-BYтолько с ударениями в славянских языкахмодель не доехала в последний момент, не успели дополировать (будут обновления, плюс не доехал ряд голосов на казахском языке).
Логика тут проста. Если пользователи не захотят заморачиваться с ударениями и захотят отдать их "усмотрение" модели (что логично для ряда языков) - то можно использовать вторые модели. Если захочется вручную попробовать поуправлять ударением - то первые.
Важно заметить, что без правильного ударения модели славянских языков работают плохо, но так и должно быть. Наличие ударения прямо влияет на фонему. Для тех, кто не в теме - произнесите вслух слово "молоко". Буква о тут - это ТРИ разных фонемы. Вот такие дела.
Список голосов
Язык |
Голос |
Модель |
Лицензия |
Комментарий |
Азербайдж. |
aze_gamat |
base |
MIT |
|
Армянский |
hye_zara |
base |
MIT |
|
Башкирский |
bak_aigul |
base |
MIT |
|
Башкирский |
bak_alfia |
base |
MIT |
|
Башкирский |
bak_alfia2 |
base |
MIT |
|
Башкирский |
bak_miyau |
base |
MIT |
|
Башкирский |
bak_ramilia |
base |
MIT |
|
Белорусский |
bel_anatoliy |
base |
MIT |
|
Белорусский |
bel_dmitriy |
base |
MIT |
|
Белорусский |
bel_larisa |
base |
MIT |
|
Грузинский |
kat_vika |
base |
MIT |
|
К.-черкесский |
kbd_eduard |
base |
MIT |
|
Казахский |
kaz_abai |
ext |
CC-NC-BY |
Только с ударениями |
Казахский |
kaz_aidana |
ext |
CC-NC-BY |
Только с ударениями |
Казахский |
kaz_aisha |
ext |
CC-NC-BY |
Только с ударениями |
Казахский |
kaz_bakir |
ext |
CC-NC-BY |
Только с ударениями |
Казахский |
kaz_danara |
ext |
CC-NC-BY |
Только с ударениями |
Казахский |
kaz_zhadyra |
base |
MIT |
|
Казахский |
kaz_zhazira |
base |
MIT |
|
Калмыцкий |
xal_delghir |
ext |
CC-NC-BY |
|
Калмыцкий |
xal_erdni |
ext |
CC-NC-BY |
|
Калмыцкий |
xal_kejilgan |
base |
MIT |
|
Калмыцкий |
xal_kermen |
base |
MIT |
|
Киргизский |
kir_nurgul |
base |
MIT |
|
Мокшанский |
mdf_oksana |
base |
MIT |
|
Русский |
ru_aigul |
base |
MIT |
|
Русский |
ru_albina |
base |
MIT |
|
Русский |
ru_alexandr |
base |
MIT |
|
Русский |
ru_alfia |
base |
MIT |
|
Русский |
ru_alfia2 |
base |
MIT |
|
Русский |
ru_bogdan |
base |
MIT |
|
Русский |
ru_dmitriy |
base |
MIT |
|
Русский |
ru_eduard |
base |
MIT |
|
Русский |
ru_ekaterina |
base |
MIT |
|
Русский |
ru_gamat |
base |
MIT |
|
Русский |
ru_igor |
base |
MIT |
|
Русский |
ru_karina |
base |
MIT |
|
Русский |
ru_kejilgan |
base |
MIT |
|
Русский |
ru_kermen |
base |
MIT |
|
Русский |
ru_marat |
base |
MIT |
|
Русский |
ru_miyau |
base |
MIT |
|
Русский |
ru_nurgul |
base |
MIT |
|
Русский |
ru_oksana |
base |
MIT |
|
Русский |
ru_onaoy |
base |
MIT |
|
Русский |
ru_ramilia |
base |
MIT |
|
Русский |
ru_roman |
base |
MIT |
|
Русский |
ru_safarhuja |
base |
MIT |
|
Русский |
ru_saida |
base |
MIT |
|
Русский |
ru_sibday |
base |
MIT |
|
Русский |
ru_vika |
base |
MIT |
|
Русский |
ru_zara |
base |
MIT |
|
Русский |
ru_zhadyra |
base |
MIT |
|
Русский |
ru_zhazira |
base |
MIT |
|
Русский |
ru_zinaida |
base |
MIT |
|
Таджикский |
tgk_onaoy |
base |
MIT |
|
Таджикский |
tgk_safarhuja |
base |
MIT |
|
Татарский |
tat_adiba |
ext |
CC-NC-BY |
|
Татарский |
tat_albina |
base |
MIT |
|
Татарский |
tat_alsou |
ext |
CC-NC-BY |
|
Татарский |
tat_amir |
ext |
CC-NC-BY |
|
Татарский |
tat_azat |
ext |
CC-NC-BY |
|
Татарский |
tat_batir |
ext |
CC-NC-BY |
|
Татарский |
tat_bulat |
ext |
CC-NC-BY |
|
Татарский |
tat_damir |
ext |
CC-NC-BY |
|
Татарский |
tat_guzel |
ext |
CC-NC-BY |
|
Татарский |
tat_ildar |
ext |
CC-NC-BY |
|
Татарский |
tat_ilgiz |
ext |
CC-NC-BY |
|
Татарский |
tat_karim |
ext |
CC-NC-BY |
|
Татарский |
tat_mansur |
ext |
CC-NC-BY |
|
Татарский |
tat_marat |
base |
MIT |
|
Татарский |
tat_murat |
ext |
CC-NC-BY |
|
Татарский |
tat_rasima |
ext |
CC-NC-BY |
|
Татарский |
tat_rustem |
ext |
CC-NC-BY |
|
Татарский |
tat_timur |
ext |
CC-NC-BY |
|
Татарский |
tat_zifa |
ext |
CC-NC-BY |
|
Татарский |
tat_zufar |
ext |
CC-NC-BY |
|
Татарский |
tat_zulfiya |
ext |
CC-NC-BY |
|
Удмуртский |
udm_bogdan |
base |
MIT |
|
Узбекский |
uzb_anora |
ext |
CC-NC-BY |
|
Узбекский |
uzb_dilnavoz |
ext |
CC-NC-BY |
|
Узбекский |
uzb_saida |
base |
MIT |
|
Украинский |
ukr_igor |
base |
MIT |
|
Украинский |
ukr_kateryna |
ext |
CC-NC-BY |
|
Украинский |
ukr_lada |
ext |
CC-NC-BY |
|
Украинский |
ukr_mykyta |
ext |
CC-NC-BY |
|
Украинский |
ukr_oleksa |
ext |
CC-NC-BY |
|
Украинский |
ukr_roman |
base |
MIT |
|
Украинский |
ukr_tetiana |
ext |
CC-NC-BY |
|
Хакасский |
kjh_karina |
base |
MIT |
|
Хакасский |
kjh_sibday |
base |
MIT |
|
Чувашский |
chv_aihwa |
ext |
CC-NC-BY |
|
Чувашский |
chv_alima |
ext |
CC-NC-BY |
|
Чувашский |
chv_ekaterina |
base |
MIT |
|
Эрзянский |
erz_alexandr |
base |
MIT |
|
Якутский |
sah_zinaida |
base |
MIT |
Что касается генерализации моделей, то она есть и работает довольно интересно:
Все голоса в рамках одной модели могут говорить на всех языках (в том числе голоса в
extмогут говорить по-русски);У
baseмодели есть русские голоса, кто-то говорит очень чисто, кто-то со своим естественным акцентом. Акценты разнятся от лёгких до существенных;Когда мы "заставляем" диктора говорить на языке, отличного от родного, он говорит с акцентом. Насколько этот акцент серьёзный - вам решать. Можно придумать прикольные применения для разных комбинаций акцентов;
Немаловажно, что поддерживается вставка русских слов в речь на других языках - достаточно написать слово по-русски с ударением;
Если вставлять в речь слова на "иностранном" для него языке, если таких слов мало, акцент менее заметен. Если много слов - становится сильно заметен;
Несмотря на формальное разделение моделей,
extмодели тоже умеют говорить по-русски;Все эти эффекты генерализации очень сильно отличаются от языка и от диктора;
Генерализацию между двумя языками, если один из них отличен от русского, мы не исследовали.
Как запускать
Мы опубликовали отдельный ноутбучек с примерами. Запуск тут такой же, как у всех наших моделей - можно установить pip-пакет, или можно запускать через torch.hub. Или напрямую скачать репозиторий и самостоятельно дёргать модель, если вы прямо продвинутый пользователь.
Самый минимальный код запуска базовой модели с ударениями только на славянских языках выглядит так:
!pip install silero
from silero import silero_tts
model, example_text = silero_tts(language='ru',
speaker='v5_cis_base_nostress')
audio = model.apply_tts(text=example_text)
Минимальный код запуска базовой модели с ударениями только на славянских языках например для башкирского языка выглядит вот так:
!pip install silero
from silero import silero_tts
model, _ = silero_tts(language='ru',
speaker='v5_cis_base_nostress')
audio = model.apply_tts(text='Мин һәр саңғыраҡ тауҙа түбәнәгендә йәйенә йөҙөп йөрөйм.',
speaker='bak_alfia')
Рекомендуется установить нужную вам версию
torch(GPU, CPU) по официальной инструкции до запуска моделей. По умолчанию торч из pip может тянуть ненужные пакеты (и там недавно как-то поменялся рекомендуемый способ установки самого торча, обратите внимание).
Более сложные примеры на своём родном языке вы можете попробовать позапускать в ноутбучке с примерами. Особенный интерес представляет генерализация между разными языками, плюс хаки в духе "мой непокрытый язык сильно похож на такой-то, а что будет если я попробую его синтезировать самым близким голосом".
Мы изначально хотели сделать простецкую веб-демку, но рассудили, что наверное пример в ноутбучке не так и плох, но может руки дойдут докинуть её для полноты картины.
Также естественно никто не запрещает комбинировать silero-stress и эти модели. В silero-stress точно доедет большой белорусский акцентор.
Лицензия и внешние источники
Модель, сделанная на основе наших данных в рамках проекта, опубликована под лицензией MIT.
Дополнительная модель, сделанная на основе внешних и прочих данных (у нас есть данные от прошлых проектов) опубликована под лицензией CC-NC-BY, чтобы максимально минимизировать конфликты лицензий и избежать любых вопросов со стороны людей, кто опубликовал эти датасеты.
Список источников внешних данных (на момент старта активной фазы проекта, это были все релевантные датасеты плюс-минус приемлемого качества, которые мы нашли):
Как вы можете помочь проекту
Во-первых, вы можете помочь с развитием словарей ударений и омографов для проекта silero-stress. Пользователи Хабра уже прислали огромный белорусский словарь.
Во-вторых, вы можете послушать модели на своём родном языке и дать нам обратную связь. Это не финальная и конечная версия моделей, они будут какое-то время развиваться вместе с нашими основными версиями моделей. Есть много вещей, которые резко возникли и мы на финишной прямой переделывали или делали уже в духе "вижу цель не вижу препятствий".
Может вы найдёте ошибки в алфавитах / ударениях / фонетике / конверсии символов. В принципе есть ещё много чего, что можно улучшить и мы не можем объять необъятное малыми ресурсами.
Цитирование и аффилиации
Модели синтеза речи созданы при поддержке Фонда содействия инновациям в рамках федерального проекта «Искусственный интеллект» национальной программы «Цифровая экономика Российской Федерации».
Цитировать наши модели можно следующим образом:
@misc{Silero Models,
author = {Silero Team},
title = {Silero Models: pre-trained text-to-speech models made embarrassingly simple},
year = {2025},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/snakers4/silero-models}},
commit = {insert_some_commit_here},
email = {hello@silero.ai}
}
Ссылки
Наши модели для простановки ударений - https://github.com/snakers4/silero-stress;
Наши модели синтеза - https://github.com/snakers4/silero-models;
Новые модели опубликованные в рамках проекта - https://github.com/snakers4/silero-models?tab=readme-ov-file#v5-cis-base-models;
Примеры запуска моделей для языков России и СНГ;
Обновление проекта
silero-stress.