Как стать автором
Обновить

Теперь наш публичный синтез в супер-высоком качестве, в 10 раз быстрее и без детских болячек

Время на прочтение8 мин
Количество просмотров50K
Всего голосов 130: ↑129 и ↓1+156
Комментарии100

Комментарии 100

Потрясающе! Сэмплы ну прям сочно звучат!

Спасибо! Там, где не указано иное, аудио в 48 kHz.

Качественный TTS. Поздравляю.
Пробовал свой текст.
Числа не обрабатываются:
18 мая -> "мая"
2022 года -> "года"

Да, а мы специально и не обрабатываем их.

Как мне кажется всякие подобные "middleware" не должны быть частью публичного движка для синтеза и должны настраиваться под конкретную задачу отдельно.

Понятно, что в целом решить задачу нормализации любого текста очень сложно, но в SSML есть рудиментарные теги, которые сильно проще сделать, но люди скорее всего не захотят заморачиваться, все в идеале должно работать "само".

А тут на самом деле не просто всё. Как в общем случае отличить количественные, порядковые, собирательные, те же рода и единственное/множественное и т.п.
Не говоря уж про всякие зависимости окончания от одушевлённости/неодушевлённости...

Ну и без контекстного фильтра, и/или семантических и морфологических моделей сложностей хватает, к примеру - "17 года" - это "семнадцатые года́" или "семнадцатого гóда"?

Я как-то игрался с такими преобразованиями (и чисто алгоритмически и на ML) в контексте предложения, где-то лежит для русского в том числе, если найду выложу и кину ссылку.

Если найдёте, киньте, пожалуйста.

В общем случае все равно будут компромиссы. И количество усилий для решения этой задачи на 99% нетривиально. И с коммерческой точки зрения - пока не совсем ясно зачем это нужно, т.к. шаблоны можно в бизнесе любые заранее создать.

Спасибо! Генерация стала еще качественней с прошлого релиза, особенно 48 000 вообще чума :)

Уже прикрутил к своему голосовому помощнику Ирине (плагин tts_silero_v3, залил минут 15 назад). Надо сказать, что v2 на моей машине генерировал результат с заметной задержкой, а вот v3 работает практически без задержки (правда, пришлось снизить частоту до 24 000).

Нативная частота в 48 kHz - это отчасти китч, отчасти просто публикация некоторых коммерческих фич, отчасти месседж (как вы поняли, это не просто ресемплинг для галочки).

В хороших наушниках разница между 24 и 48 конечно слышна, а так на самом деле конечно меньше.

Насчет задержки - модели реально стали в 10 раз быстрее, и это еще без квантизации и ONNX. И самое главное - мы знаем как сделать еще в 2-4 раза быстрее без потери качества.

Когда руки дойдут до ONNX, квантизации и дистилляции - будет еще 2-4 раза поверх. Но пока надо сделать релизы других языков и дистрибутивов.

Новый голос xenia потребовал всего 2 часа записей. Понятно, что тут главное знать как записывать, но я допускаю, что в какой-то момент станет нужно буквально 5-15 минут для голоса такого же качества как xenia

А насчет опасности - я пытался подробно описать почему ее на самом деле нет в этой статье (ищем Существует ли массовая опасность со стороны "ИИ"). Основной аргумент - shit in - shit out. И на массе все-таки сильно проще применять социальный инжиниринг. Для таргетирования high net worth целей - уже даже наши технологии позволяют это делать, но геморрой.

В "zero shot" я не особо верю, ну или качество будет посредственное, или кост вычислений высокий.

Дешёвое масштабирование перекрывает низкое качество, тупо один на тысячу повёлся - уже доход, который можно нелинейно умножать количеством серверов :).

Но ваши аргументы я тоже понимаю, да.

Не уверен, что служба поддержки "Сбербанка" (которая явно переключилась на генерацию фейков по мотивам последних событий - звонки лично мне прекратились) и просто говенные СМС бабулькам типа "сынок помоги" не являются лучшей сетью.

А для богатых целей - можно и наверное проще применить специально обученных биороботов.

Отличное качество. Насколько требователен к железу для работы в "реальном времени"? Хотим прикрутить автоответ на "голосовухи" в чате, а сам бот-автоответчик крутится в виртуалке.

Автоответ это посылание далеко?
Боты автоответчики бесят.

В данном случае автоответ - сообщение о том, что голосовые сообщения запрещены, но уже не текстом, а приятным женским голосом).

Возможно, тогда имеет смысл один раз записать WAV-файл, а затем его отправлять — не очень видно, зачем тут нужна генерация.

Для такого проще просто предзаписать 1 аудио.

Если вы готовы так заморачиваться, то может лучше сделать распознавание голосовух ботом, а не генерацию сообщения о запрете?

Насчет требовательности и скорости, сокращенно процитирую часть статьи.

На 1 или 4 потоках (2 ядра) современного процессора Intel c AVX2 инструкциями (95% процессоров выпускаемых последние лет 5-7) показатели скорости такие:

|           | V3 модель | V3 модель |
|-----------|-----------|-----------|
|           | 1 поток   | 4 потока  |
| 8 kHz     | 15 — 25   | 30 — 60   |
| 16 kHz    | -         | -         |
| 24 kHz    | 10        | 15 — 20   |
| 48 kHz    | 5         | 10        |

На GPU (не помню, будет ли запускаться публичная модель на ней) - должно быть еще в ~10 раз быстрее.

На AMD будет хуже. На ARM или RISC V не тестировали. Наверное это решит ONNX, но пока ресурсов инвестировать в это нет.

Будет релиз еще с ускорением в 2-4 раза, потом еще релиз с ускорением в 2-4. Когда - как обычно КТТС / when it's done.

У меня, кстати, странный опыт — публичная модель вполне запустилась на device('cuda'), но генерация стала даже немного медленнее. Возможно, дело в том, что старт дольше + у меня маленькие тексты, на которых не заметно разницы. Но тем не менее.

PS: Буду ждать релиза с ускорением :)

Иногда модели при первом запуске "тупят". Попробуйте несколько раз, на текстах разной длины.

Вообще если честно мы эту модель даже не тестировали на видеокартах, т.к. скорее основная цель была сделать быстрый и нетребовательный синтез.

Вручную ударение, как и раньше, можно проставлять с помощью символа + перед ударной гласной.

Кошмар, кто в лес, кто по дрова.
Тинькофф: Для управления ударениями достаточно добавить 0 после ударной гласной: «соро0ка» и «сорока0».
speechpro: stress=«позиция ударения» (указание места ударения посредством сообщения номера ударной гласной от начала слова.)
Сбер: поставьте ударение в слове на ударный слог с буквой «е», используя апостроф — '. Обратите внимание, что апостроф ставится после ударной буквы.
aimyvoice: Указывает порядковый номер ударной гласной в слове. Чтобы обозначить ударение в слове, при передаче текста вы также можете использовать + после ударной гласной.
Google TTS умеет в юникодные знаки ударения: «они произносят иначе „кóторый“ и „котóрый“ „

Мне видится наиболее логичным использование тега для отдельной буквы (указывать номер тоже можно, но как-то криво). При использовании тега он не будет прорываться в обычный текст, и текст можно будет использовать в других местах. Либо юникодный символ, который специально для этого и сделан.

Позволю себе поиронизировать над тем, что сравнивается работающий на 1 потоке процессора бесплатный релиз синтеза, по качеству не уступающий или даже превосходящий решения корпораций и олигархов, с закрытыми продуктами, в которые вбухали на пару порядков больше бабла (причем как иногда в случае со Сбером и частично с ЦРТ - взятого из нашего с вами кармана без нашего согласия) и которые крутятся на корпоративных "суперкомпьютерах". Я думаю, что Яндекс только диктору заплатил больше, чем весь наш бюджет на разработку =)

Но если отложить демагогию в сторону, то давайте попробуем разложить это все по полочкам:

(0) Интерфейс простановки ударения

Указывать позицию ударения и чтение в виде очень verbose тега - кажется как минимум неуважением к пользователю. Нам очень не нравится XML и SSML, но скрепя сердце, мы не нашли лучшей альтернативы.

Но для указания ударения добавлять тег на каждое слово - ну такое (разве что так корпорациям будет проще майнить разметку из ваших данных xD ).

То же самое касается и юникод символов с ударением. С фонемами еще это имеет смысл (их много, они сложные и редкие, явно нужны для особых случаев), но юзеры проклянут такие символы, банально потому что на клавиатуре их нет. Решения с плюсами и апострофами кажутся гораздо более простыми и лаконичными. Почему мы взяли плюс - он не встречается ни в каком языке. Почему до буквы - честно говоря я даже не вспомню.

По этой же логике мы не стали впиливать вещи типа наивной интерпретации типа say-as или sub, потому что многие такие вещи проще сделать на стороне пользователя и мое личное мнение - они служат только целям сборки разметки.

Все должно работать или само - или быть максимально минималистичным.

(1) Упоминание словарей и автоматической расстановки ударений

Нигде не нашел явного упоминания, какая точность расстановки ударений и точность учета контекста ни у кого. У ЦРТ написано что-то про словарь, но ни слова про его размер и как разрешаются омографы.

Готов предположить - все или плохо или просто никто не измеряет. Хотя если бы точность была 99%, никто бы не давал возможность править руками.

(2) Вычислительные мощности

Нигде нет никакой информации, как АПИ разрешающие омографы работают и какие там модели или инструменты используются. Если судить по публикации Яндекса на Хабре - там огромные языковые модели. Как по мне, это далековато от народа.

Ну и еще раз повторю свой посыл, что большая часть этих решений и близко не будут работать на 1 потоке процессора.

Круто, поздравляю! Перенос интонации вообще тема, особенно с рандомными голосами.

А можно ли в перспективе рандомный голос генерить, который похож на указанный? Причем, чтоб указанный голос был носителем другого языка?

А можно ли в перспективе рандомный голос генерить, который похож на указанный? Причем, чтоб указанный голос был носителем другого языка?

Да, это и есть voice transfer. Хотя мы на это скорее смотрим как на снижение количества аудио для качественного голоса. В zero shot трансфер я не верю.

Не думаю, что в скором времени это будет частью публичных релизов. В качестве экспериментов это все уже работает, но особой ценности или коммерческого смысла я пока не вижу, если конечно нужен качественный синтез.

Насчет большого числа языков в рамках одной модели - все это в принципе уже прекрасно работает, надо только финально решить вопрос фонем.

Я тут рассматриваю с точки зрения перевода мультиков. Как раз 2 проблемы там:

  1. В переводе голос чтоб был похож на оригинал

  2. Читать надо с интонацией

Второй пункт уже решен, достаточно самому прочитать с нужной интонацией и натравить синтезатор. Первый то же можно решить, нагенерив много голосов и подобрав похожий. Но можно ли сразу генерить, чтоб не перебирать варианты?

Короткий ответ - можно.

Длинный ответ - качество будет ниже.

Мощно! Вашу команду купить уже не предлагали? Чтобы затем разработки закрыть и коммерциализировать.

Купить естественно предлагали, но очень странные люди при странных обстоятельствах и со странными целями за странное количество денег xD Тут даже не булочка и трамвайчик, а скорее рваный носок, пакет от мусора и большая честь.

Не думаю, что наша идеология в принципе может сочетаться с "закрыть и коммерциализировать", если конечно нам не начнут ломать ноги.

А насчет коммерциализации - ну мы пока вроде сами справляемся с этим. Хотелось бы конечно, чтобы денег было больше, но полагаю, что это "налог на суверенитет".

Звучит действительно хорошо, но синтез таки опознаётся - местами отдаёт характерным автотюном. Если попытаться этот эффект убрать - будет ещё более реалистично.

Ну это неизбежно. А можете указать, на каком примере или тексте? Еще повторяется? Там в статье еще некоторые примеры были от предфинальных версий модели.

Не про автотюн, но когда проставляете паузы, то слишком резко обрубается голос. Паузы между предложениями затухают более естественно.
UPD. запустил на колабе — затухает уже нормально, не как в примерах.

А это кажется уже пофиксили. Мне просто было лень генерить все фразы заново. Я просто вчерашний билд использовал.

Проверьте на вашем примере, уже не должно быть.

Я проверил только что, эффект гораздо менее заметен. Я обновлю в статье.

Одновременно с вами свой коммент исправил :)
Да, сейчас вообще не заметно.

Да, спасибо за внимательность. Я думал народ не заметит и поленился при последней вычитке обновить, но народ заметил. Но я уже вставил "опровержение" в нужные места статьи, в плейлисте не нашел как аудио заменит.

Зато лишняя движуха под статьей, почему нет.

У меня почему-то здесь просто тишина, хотя все остальные нормально проигрываются. И да, в некоторых таки заметно, что это синтез (характерный скрежет в речи) — в рандомных голосах, например.

У меня почему-то при запуске аудио вкладка в браузере его выключает.

Наверное, это глюк на серверах SoundCloud. Сейчас уже звук слышен. Браузер точно не отключал вкладку, потому что я для проверки запускал проблемный звук и он молчал, а до него и после — соседние семплы в статье, и они звучали

Квантовые флуктуации.

Действительно, синтез очень качественный ?

Есть ли возможность использовать вне питона?

Иначе придётся генерировать какой-то сервис на питона, чтоб потом его использовать в другом проекте(конкретно интересует .Net Core)

Бесплатные модели - скорее всего нет, банально у нас нет специалистов на шарпах. Мы подумали про ONNX, но наверное в него будем упаковывать только базовые модели без доп. функционала (просто предложения).

Если у вас .Net, то скорее всего за этим стоит платежеспособный бизнес. А если так, то вы всегда можете купить у нас лицензию на наши коммерческие модели и обвязку вокруг них, чтобы дергать через АПИ. Ну или мы можем обсудить разработку или упаковку какого-то кастома.

За этим стоит физ лицо, с основным языком C# =D

Но спасибо за ответ, пока просто собираю информацию по тому что может быть полезно, о коммерции пока даже речи нет.

можете написать маленький питон скрипт, который запускает модель, а потом начинает мониторить stdin.

А ваш c# код запускает этот скрипт как субпроцесс и отправляет в его stdin и ждет ответ от stdout

это самый простой рабочий способ запустить питон

спасибо, я примерно про это и говорил в первом своем сообщении.

Чуть менее простой и чуть более рабочий - заимплементить обёртку вокруг необходимого кода и подключить CPython к основному проекту.

На полтона ошиблись. C# = D♭
Извините :)

Все нужные шаги по пакетированию уже сделаны в наших коммерческих дистрибутивах. У всех наших публичных моделей некоммерческая лицензия.

Если нужно использовать для коммерческих целей - то нужно договариваться с авторами.

Я не против рекламы настоящих FOSS проектов, но вы уже как-то слишком активно пиаритесь под каждой второй веткой.

Не совсем понимаю, зачем тащить за собой ещё миллион обёрток, если авторы уже всё завернули в пакет.

Это особенность конкретного диктора. Она просто так говорит.

Возможно я что-то упустил, но похоже, что новая модель работает только с Русским языком. Возможен ли синтез речи для текстов содержащих одновременно русский и английский языки в одном предложении, например текст "java-разработчик"?

Есть несколько способов решения этой задачи:

(0) Заменить текст на английском текстом на русском, т.е. сделать транскрипцию. Благо у нас довольно "фонетический" язык. Думаю это можно для простых случаев это самое оно.

(1) Сделать модель, которая бы опционально работала с фонемами. Это по сути просто прошлый пункт на максималках. Просто чуть более точно можно произносить слова.

(2) Сделать модель, которая бы озвучивала фонемы разным образом, в зависимости от метки языка, например.

Вот есть примеры (1 2) как это может звучать, на базовом и продвинутом уровне. Но тут опять же фонемы, и явная польза только будет, если вы хотите прямо "говорить" на другом языке.

(2) скорее всего мы всегда будем держать для платящих клиентов, (1) возможно когда-то мигрирует в паблик, а (0) делается простыми методами от ситуации.

Какие-то middleware для транслитерации мы естественно у себя не держим по очевидным причинам.

Респект вам от слепых, классный синтез! Удачи в дальнейшей разработке!

Мы пробовали делать его голос еще год назад. В целом - качество публичного аудио не очень и очень много эмоций.

Но у нас есть другие идеи, какие поздравления сделать. Модели, скорее всего выкладывать не будем.

Поищите возможность выделить установку ударений в отдельный модуль или какой-либо опцией сделать возможным вывод размеченного текста из существующей модели (без синтеза речи). Полезно для составления/генерации корректирующих пользовательских словарей. И даже для разметки текста с последующей озвучкой другим движком.

Существует немало синтетических имен собственных из различных книжек, обычно фантастики. Где-то уникальные, где-то повторяющиеся, особенно внутри цикла произведений. Сюда можно добавить устаревшие слова или слова некоей предметной области. У часто пользующихся синтезом уже сформирован свой словарь, у особо замороченных сформированы эпические словари ударений. Любой движок дает ошибки. Которые хотелось бы быстро найти и использовать небольшие корректирующие словари конкретно для вашей модели. Также полезно при обновлениях модели. В новой версии могут исправится одни ошибки и появится другие.

Поищите возможность выделить установку ударений в отдельный модуль или какой-либо опцией сделать возможным вывод размеченного текста из существующей модели (без синтеза речи).

Таких планов у нас точно нет. Мы вложили очень много усилий конкретно в этот модуль (и в его максимально возможную обфускацию без ущерба функционалу), и у нас довольно мало желания делиться с корпорациями и олигархами нашими наработками бесплатно и без боя.

Мы думали в сторону полной обфускации модулей, но там беда в том, что бинари создаются на конкретную версию питона, и это бы вызвало шквал сложностей и обычных пользователей.

Существует немало синтетических имен собственных из различных книжек, обычно фантастики. Где-то уникальные, где-то повторяющиеся, особенно внутри цикла произведений. Сюда можно добавить устаревшие слова или слова некоей предметной области.

Во-первых, "длинные", русские, греческие и латинские слова модель и так часто нормально понимает, даже если их не было в словаре, основная проблема сейчас в омографах.

Во-вторых, не совсем понимаю, почему если у вас есть словарь вы просто не делаете по нему замены автоматически, модель это поддерживает. Качество от того, что вы разметите пару слов, которые модель уже знает, качество не изменится.

почему если у вас есть словарь вы просто не делаете по нему замены автоматически, модель это поддерживает. Качество от того, что вы разметите пару слов, которые модель уже знает, качество не изменится.

Возможно вы не верно поняли цель. Речь не о "разметить", и даже не о "что размечать", а что "не размечать". Опишу свой процесс. В Балаболке есть "поиск имен". Они прослушиваются, где есть ошибка вносятся в словарь, где нет, вносятся в список прослушанных слов, которые при следующем поиске удаляются из списка. За годы использования TTS прослушано ~100к имен и создан словарь на ~15к записей.

При переходе на ваш движок (спасибо, круто), придется все это дропнуть и начать прослушивание заново. И главное, это придется делать с нуля при каждом обновлении проекта. Если сегодня Александар, Наруто Узумаки или Кецалькоатль произносятся верно, не значит что это будет верно завтра.

Поэтому нужна возможность быстро узнать, где движок поставит ударение. Так же не понял, что может грозить вашему алгоритму. Нужен ведь не он, а результат. Причем не для общеизвестных слов и имен, которые нетрудно собрать из сети (зализняк, wiktionary и пр), а именно для редких и специфичных, ударения которых все равно нельзя использовать без предварительного контроля глазами. То есть никакой автоматизации сторонних проектов, а лишь работа с вашим.

За годы использования TTS прослушано ~100к имен и создан словарь на ~15к записей.

При переходе на ваш движок (спасибо, круто), придется все это дропнуть и начать прослушивание заново. И главное, это придется делать с нуля при каждом обновлении проекта. Если сегодня Александар, Наруто Узумаки или Кецалькоатль произносятся верно, не значит что это будет верно завтра.

Не совсем вижу проблему. У вас есть ~15к "сложных" или "особенных" слов (вероятно в основном имена собственные), которые или совсем особенные или которые балаболка плохо принимала.

Вы можете просто применять их как словарь ДО отправки в нашу модель (там как есть флаги расстановки ударения, так и можно просто ставить ударение самому) и ставить ударение. Если вы слышите ошибку - точно так же дополняете словарь. Процесс не меняется вообще никак.

Если вы разметили "лишнее" слово - разницы никакой, модель его произнесет как вы указали. Если какие-то слова наши алгоритмы размечают не так - просто вносите в словарь. Омографы пока лучше все равно размечать самому. Возможно словари даже не разойдутся, потому что разметить "лишнее" слово - это не проблема.

И главное, это придется делать с нуля при каждом обновлении проекта. 

Это тоже маловероятно, т.к. модели мы будем обновлять только при росте метрик. Возможно, что какие-то редкие слова не из вашего списка "сломаются" при обновлении, но это будет условно 1 слово на тысячу, и скорее всего никто не заметит, или оно будет внесено в словарь.

Я бы конечно вел два словаря - имена собственные и "обычные" слова, которые модель портит, но суть мало меняется от этого.

Решения принимались лично, Балаболка только интерфейс.

Да, эти 15к можно использовать по прежнему, хотя конечно хотелось бы избежать лишней вычислительной сложности, если ваша расстановка ударений лучше. Вопрос в том, что делать с 100к имен, который прошлый движок произносил верно? Пример с Александар и Узумаки как раз из этого списка. Если и для них извлечь ударения и создать словарь на 115к, а потом туда добавить еще словари обычных слов специфичные для прошлого движка, еще 100к слов, то так и до собственного движка ударений можно дойти :)

Еще раз повторю, дело не в словарях, а в быстром определении слов "которые модель портит" при наличии эталонного значения ударения, то есть слов, для которых этот словарь нужен.

еще 100к слов, то так и до собственного движка ударений можно дойти :)

Для полноценного собственного движка ударений нужно на два порядка больше слов + решение вопроса с омографами.

Вопрос в том, что делать с 100к имен, который прошлый движок произносил верно?

Еще раз повторю, дело не в словарях, а в быстром определении слов "которые модель портит" при наличии эталонного значения ударения, то есть слов, для которых этот словарь нужен.

Если у вас есть "эталонное" ударение для этих 100к слов, то опять же в чем вопрос? Просто добавьте их в свой словарь и все. Модель не обидится, если вы дадите ей лишнее ударение.

Публично выкладывать, даже неявно, свои словари даже опосредованным способом мы очевидно не очень заинтересованы.

 Пример с Александар и Узумаки как раз из этого списка.

Звучит будто бы вы занимаетесь озвучкой аниме. Не готов гуглить, но раньше это было довольно прибыльным рекламным бизнесом (помню как моя компания на тот момент, Ponominalu, даже давала партизанскую рекламу в озвучках сериалов на 50-100к в месяц).

Возможно рынок поменялся, но вам явно нужна коммерческая поддержка моделей, т.к. даже судя по объемам словарей это не похоже на какую-то благотворительность.

Соответственно именно с аниме можно придумать миллион премиум фич не считая озвучки - например говорить голосом, похожим на персонажа конкретного аниме - это самое очевидное, что приходит в голову. Ну или говорить по-русски с японским акцентом голосами персонажей из аниме.

Спасибо за общение. Нет, так нет. Но это не коммерция. Реально много слушаю, причем больше 10 лет без смены движка, вот и собралось.

Если вы напишите к нам в личку, мы поможем решить вопрос с разметкой, если конечно он не решается вышеописанными методами.

В паблик точно выкладывать не будем наши словари.

По поводу словарей. Это ваше решение, но предлагаю взглянуть на вопрос еще раз.

Существуют публичные словари Зализняка (плюс извеcтный в кругах любителей TTS основанный на нем orfoepic) и дамп Викисловаря. Это миллионы словоформ с большой избыточностью. Чтобы ее сократить, проводил исследование частотности использования слов.
Проверено ~10к книг разных жанров и времен, включая классику, русскую и переводы зарубежной.
Найдено ~1.9м словоформ требующих ударения, с ~400м вхождений.
Из них в публичных словарях найдено ~1м словоформ, с ~375м вхождений.
Покрытие словарями 95%

Не знаю насколько более полон ваш словарь, пусть будет предельные 5%, но отсюда вопрос: я их недооцениваю или вы переоцениваете скрывая? Речь не об омографах, для которых нужен контекст и с которыми хорошо справляется проект Natasha (есть на Хабре). Только об обычных словах. Для которых API будет принимать только одиночные вхождения.

По поводу лички. Спасибо, но откажусь. Не люблю использовать привилегированный доступ в некритичных вопросах.

Речь не об омографах, для которых нужен контекст и с которыми хорошо справляется проект Natasha (есть на Хабре)

Мы не можем засунуть Наташу к себе внутрь сетки (точнее в пакет можем, но это идеологически неверно, плюс у Наташи тоже точность будет в районе 85-90%), но омографы решить все-таки можем.

Если я верно понял вопрос, словоформ у нас уже в разы больше.

И не надо засовывать. Это отдельный проект, используется как мидлваре. Лишь намек, что и уникальность разрешения омографов не столь велика. Точность Наташи зависит от частотности. Все/всё и чем/чём больше 98%. А для нечасто употребляемых слов, может вообще заклинить в одном положении — в уже` или ду`шу. Еще сами с столкнетесь. Но тут частотность тоже позволяет утверждать хорошую достоверность. Одно у`же встречается на 500+ уже`.

По словоформам, это лишь реально встреченные в тексте. Оценка важности, а не количества. Количество же в исходных публичных словарях уже не помню, но мнооооого.

Есть ощущение что у вас замылился взгляд с позиции разработчика. Кажется что пользователи смогут вытащить из результата работы модели ваши наработки. В реальности, для них все ударения потенциально недостоверные. Без ручного контроля восстановить не выйдет. А ручной контроль можно сделать и на других предикторах. Поэтому, в первую очередь, это нужно для улучшения работы пользователей с вашей же моделью. "Вредоносное" использование даже представить не могу.

Я все еще не понимаю, в чем претензия.

Хотите - ставьте все ударения самостоятельно и ставьте флаг False. Хотите - правьте только отдельные слова.

Наша задача сделать инструмент, который бы покрывал все основные кейсы работы юзеров, не имел внешних зависимостей и работал в 90 - 95 - 99% случаев без участия пользователя.

Я сильно сомневаюсь, что точность синтаксических парсеров приближается к 98%.

Ни в коем случае не претензия. Омографы были затронуты вскользь и не являются предметом обсуждения. Только слова с постоянным ударением и попытка убедить, что отдача предсказанной позиции ударения вреда коммерции не принесет. Невозможно составить достоверный словарь ударений по прогнозам, только сравнить с уже существующим эталоном. Что облегчит генерацию корректирующих словарей конкретно под движок. Облегчит, а не даст возможность. Новые слова, как и прежде для SAPI движков, будут добавляться путем прослушивания.

Прошу прощения за навязчивость. Сегодня занялся тестированием более плотно. За 30 минут нашел ошибки ударения в крайне популярных словах.

ему. просто. такой. именно. свои. прямо. сама. кого. своей. моей. моих. мире. всему. судя. власти. столе. дочери. шаги. коня. будучи. зверя. братьев. второй. никого.

Сколько еще таких популярных слов ошибочны? И как можно добиться безошибочной озвучки длинных текстов (книг), не забивая в корректирующий словарь все известные миллионы правил?

Допускаю, что вы не только не хотите выкладывать свои наработки, но и затруднены в этом архитектурой приложения. Поэтому просьба трансформируется. Используя публичные датасеты (Зализняк, Викисловарь) проверьте корректность сами и прикладывайте к модели список исключений. Хотя бы для популярных слов составляющих 99% текста.

Вот основные причины, подобных ошибок:


  1. Слово не попало в список самых частотных слов, и как следствие в словарь исключений для бустинга внутренних алгоритмов;
  2. Слово в словаре с ошибкой изначально;
  3. Слово в словаре считается омографом;
  4. Слово в словаре не с ошибкой, и не считается омографом, но является таковым ("судя" в словарях только как производное от "судить" -> "суд+я");
  5. Нет в словаре;

Распределение ошибок:


  • Причина 1 — 8 штук;
  • Причина 2 или 4 — 3 штуки;
  • Причина 3 — 9 штук;
  • Причина 5 — остальные;

Причины 2, 4 и 5 не решаются в принципе.
Причина 1 это наш косяк.


Причина 3 и омографы — мы не заявляли, что мы их решили в текущем релизе.


Сколько еще таких популярных слов ошибочны?

Для популярных слов, точность расстановки ударений была то ли 99%, то ли 98% + словарь исключений. Не всегда правильно получается распределить слова по "частотности".


И как можно добиться безошибочной озвучки длинных текстов (книг), не забивая в корректирующий словарь все известные миллионы правил?

Либо ставить ударения самому вручную или своими "безошибочными" алгоритмами, либо купить у нас коммерческую лицензию и заказать кастомную разработку под решение ваших конкретных задач c устраивающей вас точностью — тогда достижение нужной точности на вашей задаче будет сделано нашими силами.


Поэтому просьба трансформируется. Используя публичные датасеты (Зализняк, Викисловарь) проверьте корректность сами и прикладывайте к модели список исключений.

Прикладывать наверное мы точно ничего не будем, но лишний раз проверить свои внутренние словари не помешает.


Мнение, что публичные датасеты не имеют ошибок — ошибочное.


Также на всякий случай продублирую, что конечная цель — чтобы пакет синтеза был меньше 10 мегабайт, включая всю внутрянку и НЕ ИМЕЛ ВНЕШНИХ ЗАВИСИМОCТЕЙ.


Требовать от бесплатного публичного решения учета всех хотелок всех пользователей за бесплатно, мне кажется крамольным.


Если вы хотите, чтобы конкретно ваш кейс был решен на 100% — поддерживайте разработчиков.

Звук сгенерированный RHVoice распознает процентов на 90. Голос "Елена", скорость 80.

А вот живой голос слабо. Пример:

Оригинал.

Еще бы понять, какое это имеет отношение к этой статье, но наше распознавание распознает получше, но жует слово знамя:

Еще бы понять, какое это имеет отношение к этой статье

Я Вас понял. О статье. Но ведь не даром у вас на гите лежат скипты распознавания.

Генерю(пока) RHVoice, но планирую тщательно исследовать Ваш движок. На выходных.
За статьи - СПАСИБО!

Звучит классно! В виде TTS для Андроида ваше решение не существует, да? Есть ли планы?

Не существует. Делать будем наверное только если будет заказчик плюс помощь с самим андроидом. Сами модели уже дастоточно быстрые.

А вот задача:

Есть книга в epub, есть аудиокнига для неё.

Насколько сложно с помощью вашей модели сделать новую аудиокнигу с другим голосом?

Т.е. не вручную расставлять подсказки где и какие акценты и ударения, а получать эту информацию с имеющейся озвучки?

Без текста, распознавание это не lossless процесс.

А аудио в аудио мы не исследовали.

Так текст (может быть, с небольшими отличиями) есть.

Просто такая комбинация вводных данных (звук + текст) куда удобнее для практического применения, например, при многоголосой озвучке силами одного актёра.

Кроме того, из озвучки можно получить море дополнительной информации, помимо акцентов или ударений, которая не (или плохо) формализирована, и которая может пригодиться для синтеза более живо звучащей речи.

Уже описанный список фич тянет или на отдельный коммерческий продукт, или на разработку на заказ. Переозвучка, много голосов, экспрессия, эмоции итд

В принципе, при наличии текста переозвучивать сильно проще, если дикторов на входе не сильно много.

Но даже если бы и такой продукт и был готовый, со всей проработкой деталей под какую-то студию, его бы никто не стал выкладывать за просто так.

Если ваш интерес мотивированный, пишите в личку, я уточню ТЗи прикину сколько такое может стоить разработать.

А что означает ошибка:
RuntimeError: Unknown qengine

Для экономии места и скорости часть модели квантизована.

Квантизация работает на процессорах с AVX2 инструкциями. Таковых примерно 95%.

Иногда на старых процессорах помогают хаки отсюда - https://github.com/snakers4/silero-models/discussions/104

Вообще наверное мы когда поработаем еще с ударениями квантизацию уберем

Добавление torch.backends.quantized.engine = 'qnnpack'
Приводит к
[W NNPACK.cpp:51] Could not initialize NNPACK! Reason: Unsupported hardware.

И да проц без avx2 только с avx. А если проц без avx2, а например только с neon?

На ARM не пробовали запускать, но как вариант можно опубликовать модель совсем без квантизации в следующей версии, так как полностью ее квантизовать пока не получается.

Удалось решить? Столкнулся с такой же ошибкой на одноплатнике

В новой версии нет квантизации, я не совсем понимаю, почему такая ошибка вылазит, если вылазит в новой версии модели.

Так держать, а можно свой образец голоса вам записать? Часа два нужно?

Напишите в личку в телеграме

Окей, вот еще слежу за творчеством человека https://twitter.com/fifteenai, у него скоро апдейт движка и больше голосов будет на его сайте https://15.ai, он там команду уже сколотил вроде как

интересная тема, сколько лет вы ей занимаетесь?

Добрый день,

Где можно прочитать параметры полученных моделей:

1) тип сети число слоев,

2) число узлов(нейронов),

3) функции узлов,

4) скорость вычисления в узлах,

5) максимальное число входов узла

ну и т д, то что не секрет.

-----------------------------

Спасибо.

Подскажите, 6 секунд от запуска файла и до воспроизведения сгенериванного голоса из пары слов может быть связано со слабым железом? В данном случае orange pi на RK3399

Сам код сути стандартный из примера

print(1)
device = torch.device('cpu')
torch.set_num_threads(4)
local_file = 'v3_1_ru.pt'

print(2)
model = torch.package.PackageImporter(local_file).load_pickle("tts_models", "model")
print(3)

model.to(device)

example_text = 'Ниче не работает'
sample_rate = 48000
speaker='baya'
print(4)

audio_paths = model.save_wav(text=example_text,
speaker=speaker,
sample_rate=sample_rate)

print(5)
song = AudioSegment.from_wav("test.wav")

print(6)
play(song)

На метке 2 останавливается на 2 секунды и на метке 4 еще на 4 секунды

У моделей есть прогрев компилятора

Сколько грузится сама модель в память наверное без разницы

Важно скорее какая скорость будет после 50-60 фраз

Для ускорения SR можно понижать

Ещё иногда помогает эта строка

torch._C._jit_set_bailout_depth(1)

torch._C._jit_set_profiling_mode(False)

Ещё в 1.12 сам торч глючит с нашими моделями

Добавил строки, прогнал пару десятков раз, разницы не заметил. Попробовал тот же самый код на машине на райзене 5 5500u, до 4 метки без задержек, после 4 метки секунды 1,5, что уже приемлемо. Но на одноплатнике конечно 6 секунд - это слишком долго

Какая версия торча?

На 48к без этих строк прогрев занимал в районе 50-60 фраз.

На райзене сетки работают медленнее.

SR линейно меняет скорость.

Госпадя, спасибо вам огромное за столь реально быстрою интерграцию в собственный проект! Я так запарился со всеми остальными "недооблачными" сервисами синтеза, что уже опускались руки. Тут даже лайка мало, чтобы поблагодарить вас сколько времени и нервов я сэкономил.

Качество "человечности" синтезатора -- шикарное! :)

Добавлю немножко фидбека. Заметил странности с вопросительными предложениями. "Агент, у вас все еще есть портфель?" -- вообще игнорирует знак вопроса. А тестах с вопросами "Как вы себя чувствуете? " и "Хорошо?" через ssml_text появляются жесткие щелчки в конце, если они в таком формате:

ssml_sample = """

              <speak>

              <s>Как вы себя чувствуете?</s>

              <s>Хорошо?</s>

              <s>Вот и отлично</s>

              </speak>

              """

Если убрать "<s>Вот и отлично</s>", то предыдущий вопрос "Хорошо?" уже читается как утверждение.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории