Русский
Русский
English
Статистика
Реклама

Синтез речи

Как слепой разработчик в одиночку создала синтезатор речи

16.07.2020 14:23:13 | Автор: admin

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

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

Называется от RhVoice и упоминался в нескольких публикациях на Хабре. Но знаете-ли вы, что многие считают его лучшим бесплатным синтезатором русской (и не только) речи, а написан он в одиночку полностью слепым разработчиком Ольгой Яковлевой?

Сегодня восстанавливаем историческую справедливость и немного узнаем про сам синтезатор вообще, и Ольгу в частности.

Сразу раскроем все карты: гитхаб синтезатора

Код синтезатора распространяется бесплатно по GPL, а значит его может встроить в свой продукт любой желающий. Доступен на трех платформах: Windows, Linux и Android. Ведет разработку Ольга одна и работает в Linux. Лучшим (из опенсорсных) синтезатором русской речи, его считают сами пользователи и это не только люди с плохим зрением. В своей работе синтезатор использует статистический параметрический синтез и был основан на наработках уже существующих проектов, таких как HTS, и опубликованных научных исследованиях. Это гибридная глубокая нейронная сеть, работающая со скрытой марковской моделью. Задача таких сетей, это разгадка неизвестных параметров на основе наблюдаемых. Можно считать, что это простейшая Байесовская сеть. Сам HTS был основан на наработках другого проекта HTK. Но нас тут больше всего интересует, что часть наработок была опубликована для свободного использования, включая описание алгоритмов и примененных техник.

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

Ольга начала свой проект почти 10 лет назад, когда стала изучать Linux и не нашла там удобного для себя синтезатора. Пишет весь код она сама, используя для этого специальный Брайлевский дисплей. Это специальное устройство предназначенное для отображения текстовой информации в виде шести точечных символов азбуки Брайля. Также в работе использует JAWS, программу для чтения с экрана, которая ведет свою историю со времен DOS и тоже созданную при активном участии слепого.

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

Что же такое синтезатор речи и что в него входит?


Традиционно принято считать, что любой синтезатор состоит из двух частей: языковой компонент и компонент генерации речевого сигнала. Языковой компонент анализирует текст, получаемый от чтеца экрана. Его задача разбить текст на предложения, предложения на фразы, слова и слоги. В конце строится транскрипция всех слов и по ней создается карта звуков (как всем известно, не всегда как пишется, так и говорится). Разбор этот можно делать с разной глубиной проработки. У RhVoice, например, нет ресурсов для сложных операций вроде определения роли в предложении или части речи. Но в любом случае в конце разбора у нас получается набор звуков, которые должен собрать компонент генерации речевого сигнала, используя базу пред записанных звуков. Немного позже мы подробнее остановимся на каждом из компонентов.


Демонстрация работы с синтезатором

История Ольги


Ольга живет в Чебоксарах, закончила математический факультет Чувашского государственного университета и работает программистом. Как и все незрячие люди, она училась в специализированных школах. Сначала были 6 классов в школе Нижнего Новгорода, потому что на тот момент в Чебоксарах не было мест, куда бы принимали полностью слепых детей. Но спустя шесть лет все же получилось вернуться в родной город, и доучилась Ольга уже в Чебоксарах. Там же в школе, Ольга полюбила математику, что в дальнейшем позволило ей поступить на математический факультет. В какой-то момент она думала о поступлении на ИВТ, но тут свою роль сыграла неуверенность в собственных силах. Да и среди выпускников математического факультета было несколько незрячих, а на вступительном собеседовании декан сказал, что у них программистов готовят даже лучше, чем на ИВТ.

Первый опыт работы с компьютерами Ольга получила не в школе, а в университете, в библиотеку которого закупили специальные компьютеры, оборудованные для использования слепыми, с установленной программой JAWS (программа для чтения с экрана, ведущая свою историю аж с 1989 года). Там она изучала знаменитый учебник по Windows 95 от Сары Морли. Скорее всего, вы сейчас удивитесь, ибо что за такой знаменитый учебник, про который вы и не слышали ни разу? Ответ кроется в его названии: Windows 95 для незрячих и слабовидящих. Основное отличие подобных учебников от знакомых всем нам, это акцент на описании различных объектов и вариантах управления ими. Так как незрячему человеку инструкция вида щелкните мышкой на ниспадающий список и выберите нужный пункт меню несколько бесполезна. Они не видят ни экран, ни курсор мышки и даже больше не знает, как выглядит окно и ниспадающий список. Кстати, из-за этого возникает еще один неочевидный нюанс незрячие люди могут оказаться заложниками битности используемого синтезатора. Так, лет пять назад, при переходе на Windows 8 многие столкнулись с отсутствием поддержки 64 bit приложений со стороны синтезаторов речи и перешли на RhVoice, где эта поддержка уже была реализована.

Но вернемся во времена, когда Ольга только начинала изучение новой для себя области. Синтезатором речи тогда выступала программа Digalo с голосом Nikolay. Это настолько каноничная связка, что результаты ее работы слышал абсолютно любой человек, выходивший в сеть. Его голос можно считать синонимом термина робовойс, настолько плотно он вошел в интернет культуру и был использован в бесконечном количестве видео на ютубе. Вероятно, поэтому абсолютное большинств уверено, что Дигало это фамилия Николая.


Digalo Nikolay во всей красе

Начало работы над собственным проектом


Путешествие в мир синтезаторов началось для Ольги примерно в 2010 году с разработки драйвера NVDA (NonVisual Desktop Access) для синтезатора Festival. NVDA, это бесплатная программа экранного доступа, позволяющая слабовидящим и незрячим полноценно работать с компьютером. Подобный класс программ включает в себя синтезатор речи и возможность вывода на брайлевский дисплей.

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

Поэтому первые свои эксперименты на основе трудов более опытных коллег, Ольга делала вокруг все того же Festival. Это академический синтезатор речи, созданный в 1995 году группой ученых во главе с Аланом Блэком. Они разрабатывали методы синтеза и на основе своих исследований сделали собственный синтезатор, который изначально был просто демонстрацией результатов их работы. Со временем к нему добавился не менее важный проект FestVox, позволяющие генерировать новые искусственные голоса, а сверху это было приправлено довольно неплохой документацией. В то время в Festival уже был русский голос Alexander с довольно неплохой речевой базой.

Что такое речевая база: в случае RhVoice это более тысячи специальных предложений, начитанных диктором с четким и безэмоциональным произношением. Предложения эти должны быть подобраны таким образом, чтобы в них содержались все дифоны, то есть все комбинации из двух фонем. И хорошо бы, чтобы по несколько раз каждая для большей вариативности. По воспоминаниям в первых версиях использовалось около 600 фраз. В дальнейшем, синтезатор из этих фонем может сформировать любое слово. По-английски этот метод называется unit selection, а у нас он известен как метод выбора речевых единиц. Да, не самый модный и молодежный, однако работающий надежно как утюг. Каждое предложение заносится в базу и анализируется: определяются звуки, их позиции в слогах, в словах, в предложениях. Классифицируются отдельные фонемы, их расположение относительно друг друга и так далее. Во время обратной операции, то есть синтеза речи, для каждой фонемы, полученной из транскрипции, вы просто выбираете наиболее подходящий (читай: близкий) пример из базы. Иногда удается найти строгое соответствие, иногда приходится довольствоваться максимально похожим. В мире филологов это называется теоретической и практической фонетикой и придумано было далеко не вчера. Поэтому заниматься синтезаторами речи без чтения учебников по фонетике нельзя. К слову, особенно хорошие учебники выходили в свое время у МГУ.

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

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

Голоса в синтезаторах речи


Начинается все с анализа языка, который заключается в создании базы данных, где формально описывается фонетическая система этого языка. Такие базы могут быть уже сделаны кем-то и продаваться на рынке (за весьма хорошие деньги). В противном же случае приходится заниматься этим самостоятельно. Для анализа каждого языка разрабатывается отдельная программа и это может занимать до полутора лет работы, в зависимости от сложности языка. Например, итальянский язык очень прост, с точки зрения синтеза речи, а такие языки, как арабский и китайский крайне сложны. Но в среднем анализатор языка создается за год. После его готовности пишется уже голос. На это уходит уже около трех месяцев. Непосредственно запись самого диктора и прочая работа в студии занимает две-три недели. Это связано с тем, что качественно и красиво диктор может говорить примерно четыре часа в день. Дальше он устает и уже не звучит достаточно чисто. Если вы думаете, что это пижонство, то нет к качеству этих записей предъявляются очень серьезные требования. Коммерческие компании проводят целые кастинги, отбирая не только по субъективной красоте голоса, но и по возможности использовать конкретный голос для конкретного языка в своем синтезаторе.

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

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

А вы не замечали, что у большинства синтезаторов сначала появляются женские голоса? Это не из-за предпочтений авторов, а из-за сложности разработки именно женского голоса. Женский голос более высокий по своей природе, а высокие частоты обрабатывать сложнее, чем низкие. И если удается создать женский голос, то мужской уж точно получится. А вот наоборот, не факт.

Мотивация к созданию своего синтезатора речи


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

И для понимания порядка цен: разработка нового голоса, у частных компаний стоит примерно от десяти до сорока тысяч евро, в зависимости от сложности языка. Разработка модуля анализатора стоит в разы больше. Касательно RhVoice, тут у Ольги позиция принципиальная ее проект будет бесплатным всегда. Тогда откуда тогда берутся деньги на дикторов? На начальных этапах находились добровольцы, предложившие помощь. У них была своя студия и они предложили оплатить диктора, так что Ольге оставалось только прислать список предложений для озвучания. Так в RhVoice появилось несколько новых языков. Потом к ней уже стали обращаться с конкретными запросами.

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

А как можно создать синтезатор, если ты совсем не знаешь язык? Условно ты знаешь русский и английский, а просят разработать арабский? Технических ограничений нет, главное, найти в интернете какие-то статьи и материалы о языке, о его структурах или даже проконсультироваться с филологом. Этого может хватить для разработки первоначального синтезатора речи. Ведь по большому счету, объем стартовой информации стандартен: список фонем, правила транскрипции от буквенного представления к произношению, детали о вспомогательных частях речи и т.д. Главная проблема будет в том, что разработчику никак не проверить результаты своей работы без участия носителя языка. А носителю языка надо дать не просто отзыв понятно/непонятно говорит, но и объяснить все тонкости и нюансы мест, где что-то пошло не по плану. В случае с RhVoice таким сложным языком стал татарский. С ним Ольге очень помогли филологи, с которыми ее связали представители Казанской библиотеки для слепых и слабовидящих, которые и инициировали эти работы. В ходе работы над синтезатором был даже составлен отдельный словарь корректного произношения заимствованных из русского языка слов. Чтобы заимствования звучали именно по правилам татарского языка, я не русского. И это хорошо, что такой словарь был составлен профессиональными филологами. Вот, например, для Киргизского такой словарь отсутствует и там очень много проблемных мест, пути разрешения которых пока не найдены просто технически.

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

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

Сейчас Ольга надеется, что появятся готовые компоненты для нейронных сетей, написанные на низкоуровневых языках С-подобных языках, которые смогут обеспечить достаточное быстродействие на мобильных устройствах. А если заведется на мобилках, значит и на остальных платформах будет работать. Подобные проекты уже разрабатываются, и тогда она сможет переработать свой синтезатор. Другая важная проблема, которую предстоит решить в RhVoice нет простого и понятного способа добавить свой язык и голос. Есть люди, которые готовы оплачивать эту работу, но проблема el classico: запросов много, Ольга одна, а как и в большинстве for fun проектов, кодовая база представляет собой настолько волшебный лес, что разобраться в ней кому-то, кроме создателя, задача гиблая. В большинстве подобных проектов разработчики предоставляют желающим набор инструментов и документацию, по которой, зная фонетику языка и обладая остальными знаниями, можно создавать свой модуль языка. Пока у Ольги нет ни того, ни другого. Но есть планы это сделать.

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

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

Подробнее..

Open Source синтез речи SOVA

18.11.2020 00:09:51 | Автор: admin

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



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


Введение в задачу синтеза


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


Терминология

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


Аллофон вариация фонемы в зависимости от окружения. В отличие от фонемы, является не абстрактным понятием, а конкретным речевым звуком. Например, фонема <а> имеет следующие аллофоны: (а) в слове пат, (а) в слове мать, (а) в слове пятый и т.д.


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


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


  1. Конкатенативный синтез (unit selection) заранее готовится база дифонов и полуфонов, которые потом склеиваются между собой. Недавнно на хабре как раз вышла статья о самом известном подобном синтезаторе на русском языке;
  2. Параметрический вычисление на основе текста набора акустических признаков, по которым генерируется аудио сигнал. Естественно, что самым популярным представителем параметрического метода являются нейронные сети.

Итак, для создания нашего синтеза было решено использовать параметрический подход, а значит, перед нами встал вопрос, какую архитектуру использовать. После непродолжительных поисков выбор был сделан в пользу Tacotron 2 по ряду причин:


  1. Популярная архитектура, хорошо справляющаяся со своей задачей. Её рекомендацией являлись, как минимум, её использование банком Тинькофф для своего чат-бота Олега (см. статью выше), а также неявные намёки на её использование у Яндекса.
  2. Конечно же ещё одной немаловажной причиной стало то, что NVIDIA любезно предоставила свою реализацию Tacotron 2 (репозиторий) с её же вокодером Waveglow (статья, репозиторий), и всё это на pytorch (мы симпатизируем ему больше, чем tensorflow и keras).

Начало экспериментов


Так как сперва нашей задачей было обучение синтеза для русского языка, и собственным набором данных мы ещё не обзавелись, естественно, что для начала работы мы взяли единственный (на тот момент) приемлемый датасет для обучения синтеза на русском языке RUSLAN (прим. автора: есть подозрение, что это не имя диктора, а акроним от RUSsian LANguage).


Какие проблемы сразу же бросаются в глаза (в уши) при синтезе после обучения на оригинальном датасете с помощью кода NVIDIA:


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


Текст

Многие члены моей семьи любили ходить в зоопарк и наблюдать за тем, как едят слоны.


Также попадается озвучка графем, а не фонем (синтез вместо синтэз)



Текст

Синтез речи это увлекательно


  • Нестабильность механизма внимания (который занимается, грубо говоря, выявлением соответствия символов входного текста и фреймов мел-спектрограммы), особенно на длинных входных текстах. Такая нестабильность, а другими словами, разрыв линии внимания, как на картинке:


приводит к появлению различных артефактов в речи



Текст

В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!


  • Нестабильность срабатывания гейт слоя, генерирующего сигнал об окончании генерации


Текст

В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!


  • Все предыдущие моменты касались движка синтеза (так мы называем Tacotron 2 у себя), а что касается самого датасета, то там можно отметить плохие условия записи диктора слышите это эхо?


Разберём, как мы боролись с каждым из этих пунктов.


Работы по улучшению


Случайная простановка ударений и озвучка графем


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


Данные


Вот тут-то нам и пригодился наш отдел разметчиков: чтобы проставить ударения, над текстом трудились 5 разметчиков в течение двух недель. Результат полностью размеченный ударениями датасет Руслан (ссылку см. ниже), который мы предоставляем сообществу для экспериментов. Но это касается только обучения, а что с инференсом? Тут всё просто: мы нашли словарь ударений (сначала аналог CMU dict для русского языка, а потом полную акцентуированную парадигму по А.А. Зализняку). Дальше нужно было подготовить код для использования этого словаря, и вуаля получаем контроль ударений для нашей системы синтеза.


Что касается более естественного озвучивания с помощью фонем, то мы рассматривали два репозитория для решения этой задачи: RusPhonetizer и russian_g2p. В итоге, первый не завёлся, второй оказался слишком медленным (0.24 секунды на предложение из 100 символов), а тут ещё и CMU словарь содержит не только ударения, но и фонетические записи слов, так что решили использовать его. Честно сказать, из-за отсутствия чёткого понимания, какие же всё-таки фонемы нужны, работа с этим словарём вылилась в обычную транслитерацию текста с периодически встречающейся редуцированной "о". Сейчас мы экспериментируем с фонетизатором на основе фонем из russian_g2p.


NLP-препроцессор


Для работы со словарями и конвертацией текста в фонемный вид пакет text из оригинального репозитория такотрона уже не подходил, так что был заведён отдельный репозиторий для преподготовки текста. Опуская все подробности его разработки, резюмируем, каким функционалом он обладает на сегодняшний день:


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

Документация к репозиторию пока что находится в разработке.


Примеры


Контроль ударений:



Текст

Мн+огие чл+ены мо+ей семь+и люб+или ход+ить в зооп+арк и наблюд+ать за тем, как ед+ят слон+ы.



Текст

Тв+орог или твор+ог, к+озлы или козл+ы, з+амок или зам+ок.


Фонемы вместо графем:


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




Заодно приведём ещё пару синтезированных на open source модели примеров:



Текст

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



Текст

Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.



Текст

В чащах юга жил бы цитрус? Да, но фальш+ивый экземпляр!


Нестабильность механизма внимания


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


  1. Diagonal guided attention (DGA) здесь идея простая: так как в синтезе, в отличие от машинного перевода, соответствие выходов энкодера и декодера последовательное, то есть система воспроизводит звуки по мере их появления в тексте, то давайте штрафовать матрицу внимания тем больше, чем больше она отступает от диагонального вида. Можно, конечно, возразить, а что если звук тянется и на линии внимания появляется полка, но мы решили не рассматривать подобные экстремальные случаи. В качестве бонуса получаем ускорение процесса схождения матрицы внимания;
  2. Pre-alignment guided attention в этой статье изложен более сложный подход: требуется с помощью стороннего инструмента (например, Montreal-Forced-Aligner) получить временные метки каждой фонемы на аудиозаписи и составить из них матрицу внимания, которая будет являться для системы целевой;
  3. Maximizing Mutual Information for Tacotron авторы статьи утверждают, что подобные артефакты в матрице внимания возникают из-за недостаточной связи декодера с текстом. Для укрепления этой связи вводится модуль примитивного предсказания текста из итоговой мел-спектрограммы (эдакая asr в миниатюре) и расчёт ошибки с помощью CTC. Также ускоряет сходимость матрицы внимания.

После проведённых экспериментов можем сказать, что первый вариант определённо выигрывает по соотношению (положительный эффект/затраченные усилия). В качестве доказательства приведём запись, синтезированную моделью, обученной с DGA, из текста длиной 560 символов (без учёта токенов ударения) без его разбиения:



Текст

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


Как видите, на протяжении всей записи движок уверенно держал своё внимание: фраза не "разваливается", не возникает артефактов и мычания.


Нестабильность срабатывания гейт слоя


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


Эта проблема решается несколькими небольшими уловками:


  • Символ EOS вводится для каждого предложения, даже если у него в конце уже проставлен знак препинания из набора [., !, ?];
  • В конце каждой аудиозаписи добавляется небольшой участок тишины;
  • При расчёте функции потерь для гейт слоя нужно увеличить вес его положительных выходов, чтобы они играли бОльшую роль.

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


Некачественный датасет


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




Также стоит отметить, что в датасете немного почищена пунктуация, так как движок реагирует на неё весьма чувствительно.


Дополнительные эксперименты


После решения всех насущных вопросов встала задача улучшить и разнообразить звучание, придать ему изюминки. Любой знакомый с темой скажет Ок, посмотрите в сторону GST и VAE [ссылка раз, ссылка два], и мы посмотрели.


Введение в пайплайн GST, на субъективный слух автора, не давало каких-то особых запоминающихся изменений, пока мы не попробовали подход, описанный в Text predicted GST предлагается модели самой подбирать комбинацию стилистических токенов, чтобы добиться лучшего звучания для текущего текста. Для демонстрации работы этого модуля приведём аудио, полученные моделью, которая обучалась на датасете реплик персонажей из популярных зарубежных сериалов (актриса озвучки Екатерина). Уточним, что датасет изначально не предназначался для синтеза.




В общем, как и в жизни: главное найти подход к человеку.


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


Сложности VAE

Проблема posterior collapse (KL loss vanishing), характерная для вариационных моделей в сочетании с авторегрессионным декодером.


В начале обучения, декодер может отставать от вариацинного энкодера и научиться игнорировать неосмысленные латентные переменные, что приводит к почти нулевой ошибке KL для VAE (расстояние КульбакаЛейблера). Апостериорная оценка латентной переменной p(z|x) ослабевает и становится неотличимой от априорного Гауссовского шума p(z) ~ N(0, 1). Как следствие, вариационный энкодер не моделирует значимые свойства аудио и модель не предоставляет контроль над стилем и эмоцями речи.


Для борьбы с posterior collapse были опробованы уменьшение веса ошибки KL с его монотонным увеличение в процессе обучения, а также не учёт ошибки в начале обучения, равносильный игнорированию вариационных свойств модели и обучению стандартного автоэнкодера. Оба способа, в теории, позволяют декодеру сначала научиться синтезу речи и замедляют обучение вариационного автоэнкодера, повышая общую стабильность модели.


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


SOVA


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


  • sova-tts-engine движок на базе Tacotron 2 от NVIDIA. Всё вышеперечисленное, за исключением text predicted GST и VAE, было опубликовано в этом репозитории, плюс проведён избирательный рефакторинг кода;
  • sova-tts-tps тот самый nlp-препроцессор;
  • sova-tts-vocoder практически не изменённый вокодер от NVIDIA, но всё-таки с отличиями;
  • sova-tts-binding пакет для связывания nlp-препроцессора, движка и вокодера в единый инференс-пайплайн. Реализован с прицелом на добавление новых движков и вокодеров;
  • sova-tts упакованный в докер стенд синтеза с простеньким GUI интерфейсом;
  • Почищенный датасет и веса Руслана (This work, "SOVA Dataset (TTS RUSLAN)", is a derivative of "RUSLAN: Russian Spoken Language Corpus For Speech Synthesis" by Lenar Gabdrakhmanov, Rustem Garaev, Evgenii Razinkov, used under CC BY-NC-SA 4.0. "SOVA Dataset (TTS RUSLAN)" is licensed under CC BY-NC-SA 4.0 by Virtual Assistant, LLC)
  • Датасет и веса Наталии ("SOVA Dataset (TTS Natasha)" is licensed under CC BY 4.0 by Virtual Assistant, LLC)

Наш SOVA TTS (весь код + модель и датасет Наталии) вы можете свободно использовать для коммерческих задач бесплатно.


Планы


Планы у нас грандиозные, а именно:


  1. Полноценный нормализатор текста для раскрытия чисел, аббревиатур и сокращений;
  2. Модуль для решения неоднозначностей в ударениях и словах с буквой ё;
  3. Добавление поддержки ssml;
  4. Дальнейшие эксперименты с VAE, получение контроля над отдельными словами и фонемами;
  5. Подготовка эмоционального синтеза, по возможности с контролем уровня эмоции;
  6. Мультидикторный синтез на одной модели;
  7. Новые голоса;
  8. Клонирование голоса;
  9. Возможный переход на более современные архитектуры типа Flowtron или FastSpeech2;
  10. Эксперименты с вокодерами: дообучение Waveglow, обучение LPCNet, тестирование MelGAN;
  11. Оптимизация архитектуры для работы в реальном времени на CPU.

На текущий момент мы продолжаем двигаться в сторону улучшения качества синтеза речи. Если то, что мы делаем, вам интересно пишите, можем посотрудничать. Как на коммерческих проектах, так и в Open Source.


Все наши наработки доступны тут: наш GitHub
Распознавание речи: SOVA ASR
Синтез речи: SOVA TTS


Спасибо за внимание, впереди еще много интересного!

Подробнее..

Мы Опубликовали Качественный, Простой, Доступный и Быстрый Синтез Речи

30.03.2021 08:23:00 | Автор: admin

fiona


Вокруг темы синтеза речи сейчас много движения: на рынке есть огромное число тулкитов для синтеза, большое число закрытых коммерческих решений за АПИ (как на современных технологиях, так и на более старых, т.е. "говорилки") от условных GAFA компаний, большое количество американских стартапов, пытающихся сделать очередные аудио дипфейки (voice transfer).


Но мы не видели открытых решений, которые бы удовлетворяли одновременно следующим критериям:


  • Приемлемый уровень естественности речи;
  • Большая библиотека готовых голосов на разных языках;
  • Поддержка синтеза как в 16kHz так и в 8kHz из коробки;
  • Наличие своих собственных голосов у авторов решения, не нарушающих чужие права и лицензии;
  • Высокая скорость работы на "слабом" железе. Достаточная скорость работы на 1 потоке / ядре процессора;
  • Не требует GPU, команды ML инженеров или какой-либо дополнительной тренировки или для использования;
  • Минимализм и отсутствие зависимостей / использование в 1 строчку / не надо ничего собирать или чинить;
  • Позиционируется именно как готовое решение, а не очередной фреймворк / компиляция чужих скриптов / тулкитов для сбора плюсиков;
  • Решение никак не связано и не аффилировано с закрытыми экосистемами и продуктами Гугла / Сбера / Яндекса / вставить нужное;

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


Краткий Обзор Решений


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


  • Конкатенативные модели (появившиеся до DL бума). Из того, что хоть как-то поддерживается и живо и можно запустить "as-is" без археологических раскопок, я нашел только rhvoice (я глубоко не копал, но есть целые форумы, посвященные использованию голосов из Windows, но вряд ли это можно назвать поддерживаемым решением). На момент, когда я пользовался проектом ради интереса, он по сути был заброшен, но потом у него появился новый "хозяин". К плюсам такого рода решений можно отнести их скорость и нетребовательность к ресурсам (исключая ресурсы, чтобы заставить это работать). Очевидный и основной минус звучит как говорилка. Менее очевидный минус довольно тяжело оценить стоимость обладания. Качество звучания: 3+ по пятибалльной шкале;


  • DL-based модели в основном разделяют end-to-end TTS задачу на подзадачи: текст -> фичи и фичи -> речь (вокодинг). Практически повсеместно для первой подзадачи используется Tacotron2. Выделим следующие сочетания моделей в соответствии с их эффективностью и простотой использования:


    • Tacotron2 + WaveNet (оригинальный WaveNet принимал на вход лингвофичи, но для такотрона поменяли на более удобные мелспектрограммы). Основная проблема очень медленный инференс ввиду авторегрессионности модели и необходимость запретительно большого количества ресурсов и времени. Качество звучания: 4+;


    • Tacotron2 + WaveRNN (тоже с переходом от лингвофичей к спектрограммам). Вокодер заметно быстрее предыдущего: при использовании всех хаков можно получить даже риалтайм синтез без GPU, правда естественность звука несколько просядет. Качество звучания: 3.5-4;


    • Tacotron2 + Parallel WaveNet. Упомянутый выше медленный вокодер был использован в качестве учителя для получения новой довольно быстрой параллельной модели вокодера: с ней стал возможен синтез быстрее риалтайма, но все еще на мощных GPU. Из недостатков дистилляция требует качественную учительскую модель и соответствующую схему обучения. Качество звучания: 4+;


    • Tacotron2 + multi-band WaveRNN. Тоже развитие предыдущих идей, тоже распараллеливание в некотором смысле здесь доступен синтез быстрее риалтайма уже на CPU. Однако, не слишком популярная работа, меньше имплементаций и поддержки, хотя некоторые подходы хороши и были успешно использованы в более поздних моделях; Качество звучания: 3.5-4+;


    • Tacotron2 + LPCNet. Интересная идея про сочетание DL и классических алгоритмов, что может дать буст по скорости до подходящего для продакшена уровня и на CPU, но требует вдумчивого допиливания для качественных результатов. Качество звучания: 3.5-4+;


    • Многочисленные решения на базе Tacotron2 + Waveglow от Nvidia как нынешний стандарт для задачи синтеза речи. Никто не пишет про свой "секретный соус" (например как 15.ai делает голос по 15 минутам и сколько там моделей в цепочке). Есть много имплементаций и репозиториев, которые "копируют" чужой код. Может звучать на cherry-picked примерах неотличимо от живых людей, но когда смотришь реальные модели от комьюнити, качество заметно варьируется, а детали улучшенных решений не раскрываются. Архитектурно к такотрону и его аналогам по скорости и цене обладания претензий нет, но Waveglow очень прожорлив к ресурсам как на тренировке, так и в продакшене, что делает его использование по сути нецелесообразным. Качество звучания: 3.5-4+;


    • Замена Tacotron2 => FastSpeech / FastSpeech 2 / FastPitch, то есть уход к более простой сетке (на базе forced-align от такотрона и миллион более хитрых и сложных вариантов). Из полезного дает контроль темпа речи и высоты голоса, что неплохо, вообще упрощает и делает более модульной конечную архитектуру. Немаловажно, что сетка перестает быть рекуррентной, что открывает просторы для оптимизаций по скорости. Качество звучания: 3.5-4+;




Оценки Качества и Примеры Аудио


Чтобы не вдаваться в дебри, мы поступили максимально просто: синтезировали аудио из валидационной выборки датасетов (~200 файлов на спикера), смешали с оригинальными аудио этой же выборки и дали группе из 24 людей для оценки качества звучания по пятибалльной шкале. Для 8kHz и 16kHz оценки собирали раздельно, градация оценок [1, 2, 3, 4-, 4, 4+, 5-, 5] с большей детализацией для более качественного звука.


Всего было поставлено 37,403 оценок. 12 человек сделали оценку полностью. Еще 12 людей успели проставить только от 10% до 75% оценок. Дальше для каждого спикера мы просто посчитали среднее (в скобочках приведено стандартное отклонение). Расчет среднего от медиан по каждому аудио завышает средние оценки на 0.1 0.2 балла, но не влияет на отношения. Показательны естественно скорее отношения средних баллов друг к другу. Дисперсия довольно высокая, но оценки пользователей отличались сильно и мы решили не выбрасывать никакие, т.к. оценки одного пользователя были консистентными друг с другом. По ряду соображений мы провели такую оценку только на своих уникальных голосах:


Спикер Оригинал Синтез Отношение Примеры
aidar_8khz 4.67 (.45) 4.52 (.55) 96.8% link
baya_8khz 4.52 (.57) 4.25 (.76) 94.0% link
kseniya_8khz 4.80 (.40) 4.54 (.60) 94.5% link
aidar_16khz 4.72 (.43) 4.53 (.55) 95.9% link
baya_16khz 4.59 (.55) 4.18 (.76) 91.1% link
kseniya_16khz 4.84 (.37) 4.54 (.59) 93.9% link

Мы просили людей в первую очередь оценивать естественность звучания речи (а не качество звука). Нас удивило, что по расспросам обычные люди на своих ежедневных дивайсах не особо слышат разницу между 8 kHz и 16 kHz (что подтверждается оценками)! Самые низкие абсолютные оценки и самое низкое отношение у Байи. Самые высокие абсолютные оценки у Ксении, а относительные у Айдара. Тут важно отметить, что у Байи меньше поставлен голос, но поэтому он звучит более по-человечески за счет этого. У Байи также выше дисперсия оценок.


Ручной просмотр аудио с большими расхождениями показывает ошибки спикеров, ошибки такотрона, ошибки такотрона (паузы), имена собственные и сложные слова, которые вообще непонятно как читать. Естественно 75% таких расхождений в синтезе (а не оригинале) и частота дискретизации особо не влияет.


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


Сравнение Хуже Одинаково Лучше
16k против 8k, оригинал 957 4811 1512
16k против 8k, синтез 1668 4061 1551
Оригинал против синтеза, 8k 816 3697 2767
Оригинал против синтеза, 16k 674 3462 3144

Тут напрашивается несколько выводов:


  • В 66% случаев люди не слышат разницы между 8k и 16k;
  • В синтезе, 8k немного помогает скрыть ошибки;
  • Примерно в 60% случаев люди считают, что синтез не хуже оригнала по естественности;
  • Показательно, что два последних вывода не особо зависят от частоты дискретизации (8k имеет небольшое преимущество);

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


Если вы не дружите с колабом или глаза разбегаются от количества файлов в папках с примерами, то вот несколько случайных аудио:


Айдар:





Байя:





Ксения:





Еще раз обращаю внимание, что это не cherry-picked примеры, а реальное звучание синтеза.


Бенчмарки по Скорости


После качества скорость является следующим определяющим свойством модели, для измерения скорости синтеза мы используем следующие простые метрики:


  • RTF (Real Time Factor) какую долю длительности аудио занимает синтез этого аудио;
  • RTS = 1 / RTF (Real Time Speed) насколько синтез "быстрее" риалтайма;

Метрики мы снимали на двух устройствах с помощью встроенных в PyTorch 1.8 утилит:


  • CPU Intel i7-6800K CPU @ 3.40GHz;
  • GPU 1080 Ti;
  • При снятии метрик на CPU мы также ограничивали число используемых потоков;

Для моделей 16 kHz получаются такие показатели:


Батч Устройство RTF RTS
1 CPU 1 thread 0.7 1.4
1 CPU 2 threads 0.4 2.3
1 CPU 4 threads 0.3 3.1
4 CPU 1 thread 0.5 2.0
4 CPU 2 threads 0.3 3.2
4 CPU 4 threads 0.2 4.9
--- ----------- --- ---
1 GPU 0.06 16.9
4 GPU 0.02 51.7
8 GPU 0.01 79.4
16 GPU 0.008 122.9
32 GPU 0.006 161.2
--- ----------- --- ---

Для моделей 8 kHz получаются такие показатели:


Батч Устройство RTF RTS
1 CPU 1 thread 0.5 1.9
1 CPU 2 threads 0.3 3.0
1 CPU 4 threads 0.2 4.2
4 CPU 1 thread 0.4 2.8
4 CPU 1 threads 0.2 4.4
4 CPU 4 threads 0.1 6.6
--- ----------- --- ---
1 GPU 0.06 17.5
4 GPU 0.02 55.0
8 GPU 0.01 92.1
16 GPU 0.007 147.7
32 GPU 0.004 227.5
--- ----------- --- ---

Также при расчетах скорости мы были удивлены ряду вещей:


  • Процессоры AMD показали себя сильно хуже;
  • Удивительно, но бутылочным горлышком в нашем случае оказался именно такотрон а не вокодер (то еще остается существенный потенциал ускорения всей системы в 3-4 раза, а может даже и в 10 раз, если получится квантизация и дополнительное сжатие);
  • Более чем 4 потока CPU не помогают, равно как и батч больше 4;

Список Доступных моделей и Ссылки на Датасеты


Для просты мы решили опубликовать все наши модели в рамках проекта silero-models. Список актуальных моделей всегда можно найти в этом yaml файле.


На момент написания этой статьи доступны следующие голоса (доступны _16khz и _8khz версии голосов):


Спикер Пол Язык Источник Лицензия Датасета Примеры Colab
aidar m ru Silero Private 8000 / 16000 Open In Colab
baya f ru Silero Private 8000 / 16000 Open In Colab
ksenia f ru Silero Private 8000 / 16000 Open In Colab
irina f ru Private contribution TBD 8000 / 16000 Open In Colab
natasha f ru source CC BY 4.0 8000 / 16000 Open In Colab
ruslan m ru source CC BY-NC-SA 4.0 8000 / 16000 Open In Colab
lj f en source Public Domain 8000 / 16000 Open In Colab
thorsten m de source Creative Commons Zero v1.0 Universal 8000 / 16000 Open In Colab
gilles m fr source Public Domain 8000 / 16000 Open In Colab
tux m es source Public Domain 8000 / 16000 Open In Colab

Как Попробовать


Все модели опубликованы в репозитории silero-models, там также есть примеры запуска синтеза в colab. Для полноты приведем минималистичный пример (да, это действительно так просто):


import torchlanguage = 'ru'speaker = 'kseniya_16khz'device = torch.device('cpu')(model, symbols, sample_rate, example_text, apply_tts) = torch.hub.load(repo_or_dir='snakers4/silero-models',                                          model='silero_tts',                                          language=language,                                          speaker=speaker)model = model.to(device)  # gpu or cpuaudio = apply_tts(texts=[example_text],                  model=model,                  sample_rate=sample_rate,                  symbols=symbols,                  device=device)

На данный момент поддерживаются следующие спец-символы: !\'(),.:;?. Кроме того, для большинства спикеров русского языка в тексте для озвучивания были использованы метки ударения (символ + перед ударной гласной, при тестировании таких моделей пока еще нужно ставить ударение вручную):


Спикер С ударением
aidar да
baya да
ksenia да
irina да
natasha да
ruslan да
lj нет
thorsten нет
gilles нет
tux нет

В будущем мы планируем перевести все модели на более простой и унифицированный формат, не требующий ударений. Чтобы не запутаться, в yml файле, который описывает все наши модели, явно указан набор токенов для каждой модели и пример фразы для генерации.


Философия, Лицензия и Мотивация


Как авторы моделей, мы считаем следующие правила использования моделей справедливыми:


  • Голоса из внешних источников приведены исключительно в целях демонстрации и будут удалены;
  • Любые из описанных выше моделей нельзя использовать в коммерческих продуктах;
  • Репозиторий silero-models опубликован под лицензией GNU A-GPL 3.0. Де-юре это не запрещает коммерческое использование, но по факту мы еще не встречали коммерческие решения с полностью открытым кодом, чего требует эта лицензия;
  • Если вы ставите своей целью некоммерческое использование наших моделей во благо общества мы будем рады помочь вам с интеграцией моделей в ваше решение;
  • Если вы планируете использование наших моделей в личных целях (по фану или для озвучки каких-то текстов), то делитесь результатами своих экспериментов в репозитории;
  • Если вы планируете использование наших моделей в некоммерческих продуктах для людей с нарушениями речи или зрения обращайтесь, мы поможем с интеграцией, чем умеем;

Делая этот проект мы ставили своей целью ценой многочисленных компромиссов показать, что современный TTS, удовлетворяющий описанным выше критериям, возможен. И для этого не нужно заложником закрытых экосистем корпораций.


Дальнейшая Работа


Мы планируем постоянно развивать и улучшать свое решение, в частности:


  • Рано или поздно добавить поддержку изменения скорости и высоты голоса;
  • Продолжать работать над качеством и естественностью звучания и расширять библиотеку голосов;
  • Мы оцениваем, что есть еще запас ускорения всего пайплайна в целом примерно в 3-4 раза (возможно даже до 10 раз, если повезет);
  • Маловероятно но не исключено, что рано или поздно мы сможем добавить мульти-спикерную модель или voice-transfer;

Скороговорки


И в качестве бонуса, немного скороговорок.


Русский язык:






Другие языки:





Подробнее..

Мы сделали наш публичный синтез речи еще лучше

18.06.2021 14:19:30 | Автор: admin

6cc6e0011d4d26aeded6f052080b1890


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


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


Если коротко:


  • Мы сделали наш вокодер в 4 раза быстрее;
  • Мы сделали пакетирование моделей более удобным;
  • Мы сделали мультиспикерную / мультязычную модель и "заставили" спикеров говорить на "чужих" языках;
  • Мы добавили в наши русские модели возможность автопростановки ударений и буквы ё с некоторыми ограничениями;
  • Теперь мы можем сделать голос с нормальным качеством на 15 минутах 1 часе (с теплого старта в принципе заводилось даже на 3-7 минутах) или на 5 часах аудио (с холодного старта). Но тут все очень сильно зависит от качества самого аудио и ряда деталей;
  • Мы привлекли коммьюнити к работе, и нам помогли сделать удобный интерфейс для записи. Мы начали работу над голосами на языках народностей СНГ (украинский, татарский, башкирский, узбекский, таджикский). Если вы хотите увидеть свой язык в числе спикеров пишите нам;
  • Мы продолжаем собирать обратную связь по применимости нашей системы для экранных интерфейсов чтения, и пока кажется, что нужно где-то еще всё ускорить в 5-10 раз, чтобы наши модели закрывали и этот кейс;

Справедливая критика


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


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


Хотя мы вроде явно написали про это и даже сделали warning в коде про то, что модель принимает только предложения (а не целые тексты или книги), все равно основной поток комментариев был именно про это. Также мало кто обратил внимание на раздел статьи про скорость работы моделей и батчи (если вы не видели его, прочитайте).


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


  • Сначала текст надо разбить на предложения оптимальным способом для вашего домена;
  • Потом надо проставить ударения (новые модели русского языка автоматически проставляют ударение и там, где его нет, и букву ё, но можно поставить и руками);
  • Далее надо кормить модель батчами в соответствии с оптимальным сайзингом (например на 2 ядрах процессора оптимальнее всего использовать батч-сайз 1-2);

Упрощаем запуск


Вспоминая опыт с silero-vad, чтобы не множить сущности, мы опубликовали наш синтез в нашем репозитории silero-models. Это имело очевидные плюсы, но и ряд минусов:


  • Если запускать модель через интерфейс с torch.hub, то нахождение в одном репозитории с моделями распознавания речи требовало установки двух библиотек (omegaconf для парсинга yaml-конфига и torchaudio для чтения аудио). Сам синтез не имеет внешних зависимостей кроме стандартной библиотеки питона и PyTorch. Но, если судить только по гневным комментариям и сообщениям в личку, это оказалось слишком сложным даже если дисконтировать радикальные мнения (мне всерьез писали в личку люди, c энтузиазмом стремящиеся доказать что "питон говно"). Люди в итоге не обращали внимание как на интерактивное демо в colab, так и на standalone примеры. По этой причине через какое-то время я добавил пример # Minimal Example to Run Locally;
  • Вообще конечно в идеале для полностью независимого оффлайнового запуска нужно было просто скачать модель, взять этот скрипт загрузки модели, дополнить его своими функциями и убрать лишнее. Но это тоже оказалось слишком сложным и неочевидным;

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


Если вызов через torch.hub по сути особо и не изменился:


import torchlanguage = 'ru'speaker = 'kseniya_v2'sample_rate = 16000device = torch.device('cpu')model, example_text = torch.hub.load(repo_or_dir='snakers4/silero-models',                                     model='silero_tts',                                     language=language,                                     speaker=speaker)model.to(device)  # gpu or cpuaudio = model.apply_tts(texts=[example_text],                        sample_rate=sample_rate)

То полностью standalone вызов стал сильно проще:


import osimport torchdevice = torch.device('cpu')torch.set_num_threads(4)local_file = 'model.pt'if not os.path.isfile(local_file):    torch.hub.download_url_to_file('https://models.silero.ai/models/tts/ru/v2_kseniya.pt',                                   local_file)  model = torch.package.PackageImporter(local_file).load_pickle("tts_models", "model")model.to(device)example_batch = ['В недрах тундры выдры в г+етрах т+ырят в вёдра ядра кедров.',                 'Котики - это жидкость!',                 'М+ама М+илу м+ыла с м+ылом.']sample_rate = 16000audio_paths = model.save_wav(texts=example_batch,                             sample_rate=sample_rate)

Снижение требований по количеству часов и расширение базы голосов


Не секрет, что записывать 15 20 часов аудио это тяжелая и кропотливая работа. Мы проверили некоторые исследования, чтобы понять, сколько часов нужно реально для того, чтобы сделать адекватный голос. Например системы синтеза прошлого поколения требуют около 2-3 часов аудио.


У нас получились такие результаты:


Количество аудио Тип старта Результат
15 20 часов с холодного модели в репозитории
5-6 часов с холодного заводится, нормальное качество, примеры ниже
3 часа с холодного заводится, но речь уже не очень членораздельна
1 час с холодного не заводится совсем
-------------------------- ------------------------ ---------------------------------------------------------
5-6 часов с теплого, похожий голос заводится чуть быстрее, нормальное качество, примеры ниже
5-6 часов с теплого, другой пол заводится, нормальное качество, примеры ниже
5-6 часов с теплого старта с теплого, другой язык заводится, нормальное качество, примеры ниже
3 часа с теплого, похожий голос заводится, качество чуть хуже, примеры ниже
1 час с теплого, похожий голос заводится, качество чуть хуже, примеры ниже
3 15 минут с теплого, похожий голос заводится, на 3 минутах уже сильно проседает качество

С холодного старта, 6 часов:




С теплого старта, 6 часов:



С холодного старта, 3 часа:


Тут уже понятно, что для холодного старта 3 часов маловато.



С теплого старта, 3 часа:



С холодного старта, 1 час:


На холодном старте 1 час вообще уже не работает и генерирует хрип вместо голоса.



С теплого старта, 1 час:


На 1 часу с теплого старта продолжает работать.



С теплого старта, 3 15 минут:


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





На моем голосе из голосового чата:


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


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


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



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


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


Немного усложним задачу:


Давайте теперь попробуем теплый старт на немецком языке, с непохожего голоса другого пола и с непохожего голоса с другого языка:





Хм, все работает с некими оговорками.


Прочие эксперименты:


Ну и напоследок попробуем заставить Ксению говорить по-немецки. Например, вот эту фразу: Mein Knig, das Fichtenbaum, Bundesausbildungsfrderungsgesetz, die Ubng..



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


Чтобы не разбегались мысли подведем некоторый итог:


  • Для более менее качественного синтеза точно достаточно 5-6 часов качественного аудио (особенно, если новый язык сильно не похож на имеющиеся);
  • Если записи очень качественные и язык похож на имеющиеся, то в принципе можно опускаться и ниже, вплоть до 15 минут 1 часа;
  • Естественно интонации и эмоции модель выучивает из записанного корпуса, искусственно управлять интонациями мы пока не научились;
  • Именно качество аудиозаписей является критическим моментом для качества синтеза;
  • Мы пока не понимаем как добиться качества и интонаций сравнимых с Алисой, но есть подозрение, что дело в количестве часов (40 100 часов) и чистоте аудио;

Мультиязычная модель


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


У этой модели несколько хуже качество, но мы все равно опубликовали ее ради прикола.













Записываем голоса языков народностей СНГ


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


photo_2021-05-17_18-05-35


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


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


Ускорение модели


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


В текущей итерации у нас получилось ускорить вокодер примерно в 4 раза почти без потери качества (на глаз потеря 0.1 0.2 MOS в среднем) и достичь примерно таких цифр:


Модель 8 kHz 16 kHz
v1 только вокодер, 1 поток 18 8
v2 только вокодер, 1 поток 70 35

Это великолепный результат, но теперь осталось подтянуть все остальное. Но тут уже технически нам не хватает ресурсов, чтобы все 10 вещей делать одновременно. В релизе v2 также немного пришлось пожертвовать качеством отдельных моделей в силу ограниченности ресурсов.


Автоматическая простановка ударений


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


Основные проблемы:


  • Слов в русских и украинских языках реально много. Словарь может весить 100 200 мегабайт. Нужно не только добиться приемлемого качества и скорости работы моделей но и высокой степени сжатия моделей по сравнению со словарем;
  • В отличие от словаря, модели обладают хоть какой-то генерализацией;
  • У слов в языке сильно отличается частотность и надо соблюсти баланс между размером всей системы, точностью на всех когортах и стоимостью обладания системой;

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


  • Для самых популярных слов и словоформ (их примерно 130 тысяч), мы ставим ударение с точностью 99.9%;
  • Для слов со средней популярностью (их примерно 540 тысяч), мы ставим ударение с точностью 99.9%;
  • Примерно 1,300 слов мы включаем в словарь исключений (ошибки на остальных словах из этих когорт);
  • Для слов с низкой популярностью (длинный хвост, примерно 2 миллиона), мы ставим ударение с точностью 99%;
  • В каждой из этих категорий есть примерно 3% слов-омографов, которые мы пока не можем обработать (например зАмок замОк, хлОпок хлопОк). Такие слова наша модель специально пропускает, тем самым перенося бремя по простановке усредненного ударения на нашу модель синтеза;

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


Задача простановки буквы ё была также решена с некоторыми оговорками:


  • Омографы, связанные с буквой ё (например все всё, колеса колёса), не пропускаются, как в случае с ударениями. Выбрать подобные омографы из корпуса оказалось нетривиальной задачей (часто буква ё на письме игнорируется, поэтому отделить омограф от hard negative сложно без специально размеченных данных);
  • На словаре буквы ё мы ставим её с точностью 99% (как для hard positive, так и для hard negative слов);
  • Модель немного генерализовалась на слова, которых она не видела при обучении. Но всё-таки общее поведение на незнакомых словах не ставить ё;
  • Случается, что модель предсказывает ударение и букву ё на разные позиции. В таких ситуациях буква ё не будет проставлена;

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


Несправедливая критика


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


Если перечислить самые популярные претензии:


  • Нет middleware под конкретный домен или платформу;
  • Нет приложения / интеграции в какое-то другое существующее приложение под какую-то платформу;
  • Слишком сложно, невозможно разобраться;
  • Алиса звучит лучше;

На первые ответ довольно простой middleware делаются на заказ как часть коммерческого продукта. Если вы хотите поддерживаемый клиент / интеграцию под какую-то платформу, то цена вопроса цена на поиск + зарплата команды разработки (1-2 человека), умноженная на требуемый срок поддержки.


Насчет Алисы вы сами выбираете дарить ли свои персональные данные корпорациям. Практика показывает, что де-факто никакой защиты от их недобросовестного поведения нет кроме сил конкуренции. Как говорится: "Если подписал не удивляйся". Также мы примерно приценивались к "звездным" голосам, там только бюджет на запись голоса уже в разы больше бюджета на весь некоммерческий релиз целиком (нам называли оценки в районе 0.25 0.5 миллиона долларов только за запись голоса).


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


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


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


Дальнейшие планы


Текущий релиз:


  • Ускорение вокодера в 4 раза;
  • Многоязычная мультиспикерная модель (и возможность говорить на другом языке с акцентом);
  • Снижено количество файлов и упрощено пакетирование;
  • Добавление автоматической простановки ударений и простановки буквы ё;
  • Снижение требований по количеству данных и начало работы над голосами народностей СНГ;

Следующие релизы:


  • Высота голоса и скорость;
  • Радикальное ускорение моделей (10+ раз);
  • Эмоции, управление интонацией;
  • Еще большее снижение требований по данным;
  • Добавление новых голосов по мере появления открытых голосов на других языках;
  • Добавление малых языков и языков народностей России и СНГ по мере сбора датасетов;
Подробнее..

LINKa смотри. Система выбора карточек при помощи айтрекера и не только

14.07.2020 18:11:56 | Автор: admin


Вспомним кто я?


Привет, хабр. Я Иван Бакаидов. Много лет назад я писал про свой школьный проект программы, которая позволяет печатать одной кнопкой людям с тяжелой физической инвалидностью. Вот та статья.

С того момента много что изменилось, умерла девочка, для которой я написал эту программу, проект стал называться LINKa. Я сделал много программ для других форм двигательного поражения. Понял, что потерял волну волонтеров, возникшую при прошлом хаброхайпе, так как Open source проекты надо мейнтейнить.

Но тему разработки программ для коммуникации я не оставил. И на деньги из гранта Дудя разработал новый коммуникатор, который позволяет выбирать карточки взглядом. И мне нужна помощь дописать несколько фич. Стек: C#, WPF.

Взглядом? o_O! Как это? У тебя же голова дергается?


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

С 2016 года фирма Tobii (aka. Apple от мира айтрекинга) начала разработку дешевых устройств для рынка геймеров. Эти устройства дешевле в 10 раз девайсов для инвалидов (закон наклейки Special device). За пару лет они дошли до прекрасной модели Tobii 4с, которую можно купить в обычном гипермаркете электроники и воткнуть в USB 2.0.



Мне один из фондов закинул этот девайс со словами Попробуй, парень. Я положил на полку со словами Айтрекинг и ДЦП не заработает, потом как-нибудь посмотрю. Он еще работает только с Windows, а у меня Mac. Но фонды это такие прекрасные организации, которые требуют отчеты.

Bootcamp, поставил, настроил и понял, что айтрекеры этого поколения научились отслеживать положение головы, а уже от него положение глаз. На очень большой частоте. И всё работает, тряси головой сколько влезет.

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

Открывается простор для создания интерфейсов, управляемых глазами. Такие интерфейсы устроены предельно просто: они состоят из сетки кнопок. При удержании взгляда на кнопке происходит клик. И тут многие уже отличились. В самой Windows 10 встроена клавиатура и эмулятор мыши для айтрекера (Правда там в локализации нет букв Х и Б. Не попросить даже Хлеба!).


Никак!

Есть довольно толковая клавиатура BB2K, о ней писал разработчик на хабре. Мне лично очень нравится Optikey, это хорошо локализованная клавиатура от британского разработчика. Имеет несколько вариантов, в том числе с пиктограммами для непишущих детей.



Ну так если уже есть оптикей, зачем писать свое?


Закономерный вопрос. Как вы помните из прошлых статей, специалистам, которые работают с людьми из речи, очень важно иметь возможность создавать самим контент выбираемый подопечным, а не работать с готовым кирпичом, в который вшиты даже очень хорошие карточки. Это происходит из-за того, что зачастую людей без речи только предстоит научить еще писать, или просто понимать что рисунок кружки обозначает ту самую чашку на кухне из которой его поят. А в тот же Оптикей создавать набор карточек нужно через PowerPoint.

Именно поэтому в основу Линка смотри легла идея, которую я хорошо усвоил учась в школе для детей с инвалидностью Всё должно быть настраиваемым. Исходя из идеи, встала очень простая задачка: Сделать сетку карточек, из которой карточки можно будет выбирать глазами, но при этом способ выбора, карточки и сетка должна легко настраиваться. Я оформил всё это в ТЗ и нашел C# программиста, который понимал в WPF (лучше меня). В это время еще Юра Дудь перевел денег и вообще всё сложилось.

Что в итоге получилось?




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



Программа содержит в себе редактор файлов .linka.

Скачать можно отсюда бесплатно: linka.su/looks

Так, а что доделать надо?


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

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

  • Доработать синтезатор речи, сделать выбор голосов Яндекс и добавить фоллбек чтоб при отсутствии интернет соединения.

    Для озвучивания наборов в линке используется API Yandex TTS. Линка смотри спроектирована так, что озвучка карточек задается во время создания набора. Создавая карточку вы можете или использовать озвучку Яндекс или выбрать файл с компьютера. То есть озвученный заранее набор может работать оффлайн. Но линка смотри поддерживает наборы, состоящие не из целых слов, а к примеру из букв, и в таком случае программа читает текст из поля вывода с помощью Яндекса в реалтайме. И я бы хотел, чтоб когда нет интернета программа использовала говеный виндовый синтезатор. Еще б хорошо добавить выбор из голосов яндекса.
  • Сделать систему выбора карточек одной кнопкой.

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

Также я буду рад если вы просто потестите программу и напишите свои идеи.

GitHub
Patreon

Спасибо!
Подробнее..

Как из четырёх минут речи мы воссоздали голос молодого Леонида Куравлёва

02.12.2020 12:23:30 | Автор: admin
Всем привет! Меня зовут Олег Петров, я руковожу группой R&D в Центре речевых технологий. Мы давно работаем не только над распознаванием речи, но и умеем синтезировать голоса. Самый простой пример, для чего это нужно бизнесу: чтобы для каждого нового сценария, которому обучают голосовых роботов, не нужно было организовывать новую запись с человеком, который его когда-то озвучил. Ещё мы решаем задачи биометрической авторизации или аналитики по голосовым данным. В общем, работаем над серьёзными и сложными задачами для разного бизнеса.



Но недавно к нам пришли коллеги из Сбера с предложением поучаствовать в развлекательной истории озвучить героя Леонида Куравлёва в новом ролике. Для него лицо Куравлева было воссоздано по кадрам из фильма Иван Васильевич меняет профессию и наложено на лицо другого актера с помощью технологии Deepfake. Чтобы мы смогли не только увидеть, но и услышать в 2020 году Жоржа Милославского, мы решили помочь коллегам. Ведь с годами голос у всех нас меняется и даже если бы Леонид Вячеславович озвучил героя, эффект был бы не тот.

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

Иван Васильевич меняет профессию вышел в прокат в 1973 году. В это десятилетие Леонид Куравлёв успел сняться в паре десятков полнометражных фильмов. Тем не менее это никак не упрощало нам задачу:

  1. У персонажей могло быть мало длинных монологов;
  2. В художественных фильмах на речь накладываются акустические эффекты, фоновая музыка и пр.;
  3. Сам по себе звук старых фильмов 70-х годов, пусть даже оцифрованных, содержит дефекты;
  4. Актер всегда подстраивает манеру речи под персонажа, отыгрывает различные эмоции, а было необходимо повторить манеру речи именно персонажа Жоржа Милославского.

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

Сбор данных для обучения TTS


TTS (Text-to-speech) это технология перевода печатного текста в звучащую речь. В настоящее время она реализуется, как правило, на стеке методов глубинного обучения, что позволяет добиться высокого качества звучания синтезированного голоса по сравнению с другими подходами. Например, используя возможности суперкомпьютера Кристофари модель для этого можно обучить всего за пару часов.

Основным источником речевого материала послужили фрагменты аудио из кинофильмов с участием Леонида Куравлева Глубокие родственники, Не может быть, Иван Васильевич меняет профессию, Суета суёт. Далеко не все эпизоды появления героя фильма являются подходящими для цели обучения системы TTS. Необходимо минимизировать наличие фоновой музыки и шумов, речи других актёров, различных неречевых проявлений. После кропотливого поиска подходящих фрагментов у нас набралось от силы 7 минут речи, довольно экспрессивной и разнообразно звучащей в зависимости от характера персонажа, которого играл Леонид. Кроме того, в каждом фильме была своя акустическая картина, что также сильно влияет на восприятие и усложняет задачу.

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

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

Очистка данных


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

Для того, чтобы исправить это мы воспользовались двумя open-source проектами: моделью для улучшения качества речи, работающей непосредственно на сыром аудиосигнале, а также алгоритмом для разделения музыкальной композиции на партии: голос, барабаны, басы и остальное. Нам было необходимо получить чистые записи голоса диктора с максимальным качеством звука (для нашей системы TTS 22050 Гц). Любые артефакты непременно просачиваются в нейронную модель голоса диктора, особенно когда речь идет о столь малой обучающей выборке. Благодаря перечисленным проектам удалось полностью отделить музыку от голоса без существенной потери качества примерно для половины собранных примеров.

В итоге, после всех манипуляций у нас осталось равно 4 минуты и 12 секунд чистой речи голоса Леонид Вячеславовича Куравлева. Стало понятно, что наша боевая архитектура TTS, которую, к слову, вы можете послушать в облаке), не подходит для такого случая. Однако, как нельзя кстати под рукой была относительно свежая необычная модель TTS от NVidia под названием Flowtron, основанная на методе обратных авторегрессионных потоков (Inverse Autoregressive Flow, IAF).

Главной особенностью модели Flowtron является то, что с её помощью можно синтезировать различные варианты произношения одного и того же текста, с большим разнообразием интонаций и стиля речи. Но это свойство палка о двух концах, так как генерируемые моделью примеры получаются далеко не всегда адекватными с точки зрения восприятия. Интонации могут меняться очень резко и неестественно, частота основного тона (высота голоса) может изменяться в широких пределах, порождая забавное, но не требуемое звучание. Чем больше исходных данных для обучения, тем естественнее и стабильнее получается генерировать речь. Но даже при малом количестве материала иногда получается синтезировать хорошие примеры. Их мы и решили получить.

Для начала нужно было уже имеющуюся модель, обученную на большом экспрессивном наборе данных, обучить говорить новым голосом. Если просто взять и скормить ей все 4 минуты 12 секунд данных то, в зависимости от параметра, регулирующего чувствительность обучения, модель либо сразу переобучится (будет говорить очень плохо), либо обучится очень-очень плохо (тоже говорить новым голосом не будет). И ловить оптимальное значение параметра можно долго и увлеченно. Хорошей практикой является замешивание новых данных со старыми в удобной пропорции (например, один к десяти). Тогда до начала процесса переобучения, новые данные успеют неплохо усвоиться. Так и поступили, но сначала нарезали примеры по паузам с перекрытием, что легким движением пальцев по клавиатуре превращает 4 минуты речи в 23.

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

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

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

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

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



Прочитав все это, вы наверняка подумали, что такие технологические возможности ставят под сомнение надежность биометрических систем, ведь голос любого публичного человека, видеоблогера или обычного пользователя соцсетей, который публикует любительские видеоролики, легко подделать. Но спешу вас успокоить: несмотря на то, что на слух синтезированный голос Леонида Куравлева неотличим от реального, это все-таки синтез. Мощная система детектирования спуфинг-атак без труда выявит массу характеристик звука, указывающих на то, что голос не является живым. Антиспуфингу, защите от хакеров, часто посвящают специальные научные конкурсы, в том числе мировые, где наша команда не раз побеждала. Мы в ЦРТ считаем, что разработчики всегда должны быть на шаг впереди, и не только создавать новые технологии и продукты на их основе, но и постоянно искать новые средства защиты, не останавливаясь на достигнутом.
Подробнее..

Лаборатория Тинькофф как студенты разрабатывают визуального робота

22.09.2020 20:11:13 | Автор: admin

image


В Тинькофф есть образовательный проект Лаборатория Финансовые технологии. Мы отбираем студентов и магистров московских технических вузов, которые хотят работать с ИТ-проектами банка. Оформляем их на работу в штат на 20, 30 или 40 часов в неделю, даем задачи, ментора и помогаем расти профессионально. Мы работаем в партнерстве с МФТИ: преподаватели и старшекурсники вуза выступают менторами для студентов.


Лаборант может выбрать, в какой из пяти команд работать:


  • Computer Vision;
  • Speech-to-Tech;
  • Аналитика;
  • Обработка естественного языка;
  • Рекомендательные системы.

У каждой команды свои задачи и специфика. Но принцип общий: учим решать сложные академические задачи на реальных кейсах.


Рассказываем о внутренней кухне Лаборатории на примере работы команды Computer Vision весной-летом 2020 года.


Проект команды Computer Vision: Говорящие головы


Куратор проекта: Константин Осминин, Тинькофф
Ментор: Аркадий Ильин, Лаборатория гибридных интеллектуальных систем МФТИ
Лаборанты: Кирилл Рыжиков (2 курс) и Дмитрий Гадецкий (1 курс магистратуры)


В Лаборатории мы решаем наукоемкие задачи, которые в перспективе можно применить на практике в работе банка. В команде Computer Vision в этом году работали над задачей audio-to-video. Это генерация реалистичного видео с человеком на основе его речи на русском языке.
Изначально тут был не только бизнес, но в значительной степени исследовательский интерес. Если кратко: нужно было обучить компьютерную модель генерировать видеоизображение на основе только фото человека и аудиодорожки. То есть мы даем модели аудио и картинку, а на выходе получаем видео с говорящим человеком.


Такая технология впервые появилась в Китае, а в России представлена сервисом по генерации виртуальных ведущих в Мейл.ру. У Сбербанка робот-ведущий Елена читает 30-секундные новости.


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


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

Задача: разработать говорящую голову


У нас было два этапа работы. Первый провести исследование в области Neural Voice Puppetry, выяснить, что уже сделано другими исследователями и разработчиками. Потом реализация.
Работа над ней делилась на два больших блока:


  • создание правдоподобной мимики лица на основе аудио (сгенерировать движение глаз, губ, бровей);
  • рендеринг видео.

Первый челлендж: исследовать чужие наработки


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


image
Пример статьи c arxiv.org


Это не научный журнал, а агрегатор статей в открытом доступе. Поэтому каждую статью и все, что там написано, нужно проверять. То есть посмотреть, насколько рабочий код приложен в статье.
Обычно код к статьям выкладывают на Гитхабе. Если авторы не выложили код, команда искала имплементации на том же Гитхабе, но уже от простых пользователей-энтузиастов.


image
Пример неофициальной имплементации архитектуры генератора говорящих голов из статьи Few-Shot Adversarial Learning of Realistic Neural Talking Head Models (Egor Zakharov et al.)


Дмитрий Гадецкий, лаборант Тинькофф, студент 1 курса магистратуры
В первый месяц мы почти все время читали статьи на Arxiv и проверяли разные подходы. По опыту скажу: чтобы разобраться в вопросе, нужно вдумчиво изучить около десяти статей и проверить их код на работоспособность. Только когда понимаешь архитектуру кода, появляется возможность применить описанные принципы к конкретным задачам.
У нас был случай, когда мы проверяли подход к генерации из статьи китайских коллег. Мы не могли запустить код несколько дней. Пришлось писать авторам статьи с просьбой о помощи. В итоге они ответили, дописали код, чтобы все заработало.

Второй челлендж: датасет, лэндмарки и моргание


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


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


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


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


Нужно было собрать свой датасет:


  • видео на русском языке;
  • где четко видно лицо;
  • без шумов.

Изначально для парсинга мы выбрали лекции на Курсере. У них есть API, которая позволяет скачивать видео. Мы скачали видео с ресурса и приступили к его обработке.


Для этого написали программный модуль: он нарезал видео на отдельные кусочки, проверял, что на этом кусочке речь одного человека. Еще он искал в кадре того человека, кто говорил. Вырезанные куски с головой говорящего человека в кадре складывали в датасет.


С Курсеры мы собрали 20 часов видео. Но качество видео этого датасета было не очень. Лицо получалось в плохом разрешении. Поэтому нам пришлось собирать второй датасет уже с Ютуба. Оттуда скачали видео, которые больше соответствовали нашим требованиям: лицо говорящего человека занимало не меньше 40% экрана, смотрело в камеру. Этот датасет был в 60 часов.


image
Параметры датасета


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


image
Сеть извлекает на каждом кадре видео эти точки и переводит их вот в такое представление:


image


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


На этих данных о ключевых точках обучался пререндер, построенный и обученный нами с оглядкой на архитектуру, предложенную Захаровым (a.k.a. Samsung)). Ему подавалась входная аудиодорожка, а он должен был сгенерировать видео. Сначала модуль генерировал абсолютное положение точек, но модель на таком подходе генерировала неправдоподобное изображение.


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


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

Третий челлендж: пререндеринг и рендеринг


Когда мы обучили сеть генерить правдоподобную мимику, пришла очередь работать над пререндером и рендером, то есть переводом данных в видео. Лаборанты использовали технологии First Order Modu и Samsung. После двух-трех этапов рендера получилось сгенерировать более проработанную мимику, более качественное изображение и приятную текстуру лица.


В качестве пострендера использовали LipGAN, чтобы уточнить движение губ.



Где готовый продукт


Ребята показали результат в июле этого года. На общей презентации было 60 сотрудников Тинькофф, что необычно для Лаборатории. Как правило, проекты защищаются перед меньшей аудиторией.


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


Готовый результат ждем к концу этого года. Скорее всего, это будет 3D-модель, как тут:



Встречались вживую только один раз


Лаборанты с ментором и куратором встречались вживую только один раз, на собеседовании. Остальное время общались в Телеграме и Зуме. Это принцип Лаборатории: удаленная работа в удобное участникам время.


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

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


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


image
Обычный рабочий созвон с обсуждением найденной архитектуры генератора мимики


Лаборанты готовые R&D-специалисты


Так как работа в Лаборатории идет на стыке науки и практики, ее результаты публикуют и в академических кругах. Например, первые результаты работы в проекте Говорящие головы ментор и студенты готовят для доклада на 63-ю научную конференцию в МФТИ в ноябре этого года.


Аркадий Ильин, ментор
То, что делаем мы, мало кто делает в бизнес-сообществе. Поэтому хотим донести результаты и до академической среды.

До 27 сентября открыт прием заявок в лабораторию, подробнее об открытых проектах и сроках

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru