Comments 39
Репозиторий проекта - https://github.com/snakers4/silero-stress;
В ссылку тихо закралась точка с запятой...
Ого! Вы крутые!!
Я сначала даже не понял, что за предложение "Я из готов". Мозг воспринял гОтов как готОв. Думал это специально какую-то нерусскую конструкцию подсунули.
И как оно решит фразу
"скоро мы все передохнем"
ск+оро м+ы вс+ё перед+охнем.
ск+оро м+ы вс+ё хорош+о передохн+ём.
ск+оро м+ы вс+ё хорош+о передохн+ём +и пойд+ём оп+ять раб+отать.
ск+оро м+ы вс+ё перед+охнем +и н+аши тел+а забер+ёт земл+я.
Ну норм имхо, базу выдаёт
а где вариант "все" без ё?
Это шутка или вы не заметили Ё в "всё"?
Заметили. Метрики у нас хоть и хорошие, но не идеальные. Учитывая, что каждое слово формально - это отдельная задача классификации, метрики отдельно взятых слов могут отличаться заметно (см. гистограмму в разделе Метрики качества).
Конкретно в кейсе именно со словосочетанием "мы все", модель действительно в большинстве случаев ставит "мы всё". Хотя в целом метрики пары "все/всё" неплохие.
В будущих релизах мы этот кейс (как и другие, до которых дотянемся) постараемся исправить.
Омографы также можно разделить на смысловые, пресловутый "замок" и морфологические — скалы, краю. С последними неплохо справляются морф-таггеры — например Natasha (быстрая) и ее исторический предок DeepPavlov (точнее, но медленно). Не сравнивали с ними? А еще есть сложнейшая задач классификации (не)совершенных глаголов — узнаю, признаюсь; и чуть попроще, но кмк ненамного, изъявительные/повелительные — цените, служите. Не проверяли качество отдельно по таким группам?
В связи с вышесказанным, есть ли возможность разрешать неоднозначности только у указанных пользователем омографов? Естественно среди списка вами поддерживаемых. Чтобы появилась возможность использовать сильные стороны там, где справляется лучше, и отказаться от использования в областях, где не устроит.
С последними неплохо справляются морф-таггеры — например Natasha (быстрая) и ее исторический предок DeepPavlov (точнее, но медленно). Не сравнивали с ними?
Не сравнивали, но использовали сигнал от них для дистилляции знаний. Но конкретно бить омографы на типы с точки зрения лингвистики для снятия метрик руки не дошли. Это хорошая идея, так как разобрать 5-6к слов из итогового списка на типы будет несложно. И будет такой стресс тест, способ нарезать данные перпендикулярно, когда будем катить новую модель.
Чисто на правах наброса первое что в голову пришло:
+Я узн+аю ег+о лиц+о +из т+ысячи.
+Я н+е узна+ю ничег+о н+ового!
Но тут оно довольно шаткое на таких кейсах. Шаг влево шаг вправо.
В связи с вышесказанным, есть ли возможность разрешать неоднозначности только у указанных пользователем омографов? Естественно среди списка вами поддерживаемых. Чтобы появилась возможность использовать сильные стороны там, где справляется лучше, и отказаться от использования в областях, где не устроит.
Ну есть два способа:
Не подавать такие предложения;
Подавать, но самому поставить ударение заранее как надо:
sample_sent = "пр+изнаюсь, я кот!"
print(accentor(sample_sent))
пр+изнаюсь, +я к+от!
И там, где проставлено, оно оставляет как было.
Ну есть два способа:
Вообще, есть третий, мб кому-то удобнее покажется.
accentor = torch.hub.load(repo_or_dir='snakers4/silero-stress)
homodict = accentor.homosolver.homodict
Можно просто фильтрануть homodict
, убрав из него ненужные слова. Поиск по нему как раз идёт.
Опережая возможный вопрос - туда можно добавить свои. Но когда мы тестили, генерализация по омографам не из трейна была в районе 60%, то есть смысла в этом около нуля. Чисто на случай слов по типу "звонишь" / "творог", если хочется получать рандомное ударение, а не фиксированное.
С обычными ударениями понятно. Нет — поставим, есть — пропустим. Но не помешают ли расставленные плюсы деомо-модели? sent = "Я с легкостью узнаю их л+ица ", если морфологию рд.ед/им.мн решил доверить другой библиотеке.
Еще, предложу не ставить ударения в словах с одной гласной. Зачем "+я к+от"?
В целом, отличное решение для "ленивых", просто и достаточно качественно. Намного лучше чем голый текст и другие простые решения. Но если подготовка текста для создания аудиокниг (для личного прослушивания) требует чуть больше перфекционизма, будут проблемы.
Например немало омографов имен собственных. Начиная с явных Ангара́ и Саха́ра, которые вы наверное отслеживаете, заканчивая более специфичными Ба́совым, Бережно́го и даже среди имен встречается омография — бере(ё)зина, Бере́зина (фамилия), Березина́ (река). У меня таких более 400. Бывает надо поработать с аббревиатурами — КГБешник=кэгэбэ́шник или со словосочетаниями "под руку=по́друку", "не с кем=не́скем" (200 правил).
Все это делается в программах словарной коррекции, на стадии после омографии, чтобы не помешать ей, но до расстановки ударений. То есть, как минимум, нужна возможность по отдельности снять омографию и проставить ударения.
Но не помешают ли расставленные плюсы деомо-модели? sent = "Я с легкостью узнаю их л+ица ", если морфологию рд.ед/им.мн решил доверить другой библиотеке.
Нашей - не помешают. Другой - не могу сказать.
Еще, предложу не ставить ударения в словах с одной гласной. Зачем "+я к+от"?
Ну убрать плюсик тут довольно рудиментарная операция, имхо.
Например немало омографов имен собственных. Начиная с явных Ангара́ и Саха́ра, которые вы наверное отслеживаете, заканчивая более специфичными Ба́совым, Бережно́го и даже среди имен встречается омография — бере(ё)зина, Бере́зина (фамилия), Березина́ (река). У меня таких более 400. Бывает надо поработать с аббревиатурами — КГБешник=кэгэбэ́шник или со словосочетаниями "под руку=по́друку", "не с кем=не́скем" (200 правил).
Ну тут по идее всё вписывается в вышеописанную логику, меняете на "правильное" прочтение, ставите ударение, библиотека игнорирует. Или правите сами пост-фактум.
То есть, как минимум, нужна возможность по отдельности снять омографию и проставить ударения.
Ну по логике можно конечно будет добавить флаги на включение / выключение правки буквы, омографов и простых ударений отдельно. Но вообще решаемых омографов буквально 5000 слов, тут имхо гораздо проще просто поверх менять в них ударение на нужное. Если у вас своё кастомное решение, то у вас уже настроена санация текста, и это по идее буквально пара абзацев кода будет на замену ударения в конкретных словах.
Ну убрать плюсик тут довольно рудиментарная операция, имхо.
Сразу уточню для чего это. Некоторые синтезаторы, вроде даже Google TTS в Android, не любят такие ударения. А библиотека будет использоваться не только с вашим синтезатором.
В коде убрать, точнее, найти слова с одной гласной несложно, но для словарной коррекции, это достаточно нетривиально — таких одногласных слов довольно много, в том числе при неожиданном авторском словообразовании. Так может сразу убрать или не ставить в вашем коде? Это может даже на капельку увеличит скорость.
Аналогично с "поверх менять в них ударение на нужное" при словарной коррекции. Нужно иметь две версии словаря или по два правила — для чистого текста и для неправильного ударения. Усложняется пайплайн. Впрочем, если плюсы вам не мешают, то библиотеку можно поставить в конец цепочки. Что не отменяет влияния правил меняющих сам текст ( "не с кем=не́скем" ).
Нашей - не помешают. Другой - не могу сказать.
Коллега, а вы меня обманули.
Я взял еду на пикник -> Я взял ед+у на пикник
Я вз+ял еду на пикник -> Я взял +еду на пикник
То есть коррекция до деомографии недопустима.

Скорее это баг в коде с этим конкретным словом (не в моделях), скорее всего ударение в начале слова,
Я хотел показать влияние модификации контекста плюсами на распознавание формы. Раз наткнулся в отношении "еду", то и в любом другом омографе можно будет словить. Считать это багом или штатным поведением — на ваше усмотрение. Я скорее отношу к штатному. А вот удвоение ударений +ед+у это действительно баг.
Также посмотрите, не ставите ли сами себе подножки. Не может ли собственная предыдущая коррекция, попасть в окно оценки следующих за ней омографов. Предыдущий оутпут попадает в инпут следующего. Такое может как помочь ("берегу озера", если контекст указал на "бе́регу", то "о́зера", если на "берегу́", то "озёра"), так и помешать. Сам стараюсь избегать такого seq2seq, но вы там лучше в языках разбираетесь.
То есть коррекция до деомографии недопустима.
Ну в какой-то степени сейчас так, да. Можно корректировать сами омографы, но не другие слова. Например, как вы писали выше, "доверить морфологию другой библиотеке". В таком случае, "перезаписывать" ударения в омографах наша не будет.
В остальных случаях сейчас да, результат может измениться.
В идеале пайплайн сейчас такой для вашего юзкейса, если я правильно понял:
- корректируете ударения в омографах, если хочется;
- запускаете наш классификатор омографов;
- делаете свою коррекцию текста;
- запускаете нашу расстановку обычных ударений.
Если будет запрос, в следующих обновлениях мы постараемся сделать предикты более стабильными. Сейчас действительно шальная пунктуация чаще влияет на результат, чем хотелось бы. Заодно флаг для 1-сложных слов прокинем.
Спасибо, особенно за маленький размер. Перевел один проект и освободил 3гига gpu
Эту модель можно крутить и на CPU. Для 1-2 омографов на 1 предложение разница не прямо существенна.
о, круто. а как этим управлять через silero_stress?
посмотрел, не хватает таких настроек:
# CPU
model = load_accentor(device='cpu')
# GPU (первая видеокарта)
model = load_accentor(device='cuda')
# или
model = load_accentor(device='cuda:0')
# Вторая видеокарта (если есть)
model = load_accentor(device='cuda:1')
# Автоматический выбор (GPU если доступен, иначе CPU)
model = load_accentor(device='auto')
Примеры:
тв+орог
/твор+ог
,щ+авель
/щав+ель
,зв+онишь
/звон+ишь
(да простят нас учителя русского языка, но с точки зрения реальности, в которой мы живём, это допустимые варианты);
Филологи отмечают, что в русском ударение сейчас потихоньку смещается к началу слова:
-звони́т -> зво́нит
-подключён -> подклю́чен
-новорождённый -> новоро́жденный
-сбоёв -> сбо́ев
-творо́г -> тво́рог
Учителя русского знают, что язык живой и меняется. В этих словах тоже победят варианты с ударением на первую гласную.
Тут открытый вопрос конечно, как с точки зрения акцентора расставлять ударения / ё в таких словах. Конкретных правил, насколько мне известно, на этот счёт нет (если ошибаюсь - буду рад узнать).
На данный момент мы остановились на том, что просто в таких словах ставим одно фиксированное ударение. Был ещё вариант ставить случайным образом, но мы от него по итогу отказались. А по текстовому контексту определить конкретный вариант произношения в таких словах задачка вряд ли в принципе выполнимая. За исключением быть может конкретных случаев, где реплики нарочито с "говором" прописаны.
В русском ещё есть пара (+1) слов, которые пишутся одинаково, но могут звучать по разному - "теста" и "Питер" (+стен). Замечаю, что в русском идёт переход с Е на Э где оно так звучит, поэтому они со временем должны исчезнуть, став "тестом/тэстом" и "Питером/Питэром". А "стен" считается устаревшим и пропадёт сам собой.
Ох, тут есть ещё бездонная бездна иностранных слов, которые читаются не по правилам, типа шинель / панель / Нинель, мы в нее пока только заглядывали, но пока контакт не наладили. Это скорее имеет отношение уже к синтезу, но в каком-то смысле это похоже на постановку буквы ё.
Возможно вы неправильно поняли. Дело не в измененной, а в контекстно измененной фонетике. Взвесьте килограмм теста и После тэста по математике. Утром придет Стэн и Даже у стен есть уши.
А вечером Питэр посмотрит на Питер.
Да не, я в всё понял, по сути вы просто привели пример ещё более экзотического "омографа", но у вас от смысла меняется звучание, а не ударение (хотя это близкие понятие). Есть нечто похожее в обычных омографах, это слова Один и одИн. Тоже разные языки как бы.
Просто ваш пример мне напомнил про более частотный кейс с шинелями. Я к тому, что на самом деле бездна всего такого, что учесть крайне сложно.
Спасибо огромное. Добавил в свою Читалку книг в голос. Стало прямо намного лучше.
Я осознанно использую там предыдущую генерацию публичных моделей (третью), т.к. на слух реально слышу обрезанность четвёртой. И раньше имел только одну претензию - очень битые ударения. Сейчас всё ещё иногда бьёт, но реально стало прямо намного лучше. Silero-stress прям спаситель в данной ситуации.
И отдельное спасибо за фокус на производительность. У меня читалка бежит на слабеньком NAS-хранилище. О большом процессоре или крутой видеокарте там и не мечтается. А читалку с Silero оставляю на ночь, а утром получаю книгу, начитанную приятным голосом. Xenia лучшая :-)
Когда мы делали релиз 4й версии, мы увидели, что нашу говорилку используют мошенники при звонках, поэтому скрутили звучание.
В ближайшее время мы планируем сделать релиз 5й версии, там будет ускорение синтеза ещё в несколько раз, повышение качества, и упаковка модели омографов прямо в модель синтеза речи.
Мы решили задачу омографов и ударений в русском языке