
Наконец-то представляем наш синтез для языков России и СНГ. В этот раз получилось покрыть 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 | Азербайджанский | 10.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.