All streams
Search
Write a publication
Pull to refresh

Comments 39

Я сначала даже не понял, что за предложение "Я из готов". Мозг воспринял гОтов как готОв. Думал это специально какую-то нерусскую конструкцию подсунули.

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

Ну то есть решать грамматические омографы сильно проще, чем смысловые.

ск+оро м+ы вс+ё перед+охнем.

ск+оро м+ы вс+ё хорош+о передохн+ём.

ск+оро м+ы вс+ё хорош+о передохн+ём +и пойд+ём оп+ять раб+отать.

ск+оро м+ы вс+ё перед+охнем +и н+аши тел+а забер+ёт земл+я.

Ну норм имхо, базу выдаёт

а где вариант "все" без ё?

Это шутка или вы не заметили Ё в "всё"?

Заметили. Метрики у нас хоть и хорошие, но не идеальные. Учитывая, что каждое слово формально - это отдельная задача классификации, метрики отдельно взятых слов могут отличаться заметно (см. гистограмму в разделе Метрики качества).

Конкретно в кейсе именно со словосочетанием "мы все", модель действительно в большинстве случаев ставит "мы всё". Хотя в целом метрики пары "все/всё" неплохие.

В будущих релизах мы этот кейс (как и другие, до которых дотянемся) постараемся исправить.

Омографы также можно разделить на смысловые, пресловутый "замок" и морфологические — скалы, краю. С последними неплохо справляются морф-таггеры — например 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?

Например, так. Добавим в документацию, забыли.

accentor = load_accentor()
accentor.to('cuda:0')
accentor.to('cpu')

В идеале, конечно, оно должно принимать torch.device, но для начала думаю и стринга пойдёт.

посмотрел, не хватает таких настроек:

# 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й версии, там будет ускорение синтеза ещё в несколько раз, повышение качества, и упаковка модели омографов прямо в модель синтеза речи.

Sign up to leave a comment.

Articles