Как стать автором
Обновить
346.02
TINKOFF
IT’s Tinkoff — просто о сложном

Как мы научили «AI да Пушкин» создавать стихи и какие еще технологии использовали

Время на прочтение7 мин
Количество просмотров8.6K

Привет! Недавно мы представили проект «AI да Пушкин». Благодаря нейросетям поэт генерирует четверостишия по первым словам, которые предлагает пользователь. А затем читает вслух то, что получилось. Увидеть и услышать, как это происходит, можно на сайте проекта. А мы расскажем, как решили проблему отсутствия рифмы с помощью контролируемой генерации текста и какие технологии использовали, чтобы сделать проект более эффектным.

Как устроен продукт

«AI да Пушкин» — экспериментальный проект. Мы хотели показать пользователям и рынку, как работают ИИ-технологии в Тинькофф. И заодно протестировать две новые технологии на большой аудитории. Сейчас сервис работает так: пользователь придумывает начало стихотворения, а нейропоэт выдает четверостишие с ритмом и рифмой, учитывая заданный контекст. Получившееся стихотворение «AI да Пушкин» может озвучить. При этом пользователь на всех этапах видит анимацию лица поэта.

Так выглядит десктопная версия
Так выглядит десктопная версия

Все это происходит благодаря трем технологиям Тинькофф. За создание четверостиший отвечает генеративная стихотворная модель, за их озвучивание — технология VoiceKit, а за оживление портрета поэта — технология синтеза мимики и оживления портрета Thara. Нашей главной задачей было объединить технологии NLP и Thara и получить полноценного персонажа с хорошим синтезом речи и качественной анимацией. В этом тексте мы подробно расскажем о генерации стихов. А затем немного поговорим о том, как работали VoiceKit и Thara.

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

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

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

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

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

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

я сяду в кабриолет и улечу.
Куда? Не знаю. Знаю одно:
Что буду там, где меня никто не ждет.
И это место называется раем.

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

Подход первый. Подробнее о подходе можно узнать из статьи Recipes for building an open-domain chatbot. Его придумали, чтобы улучшить качество разговорных ботов. Изначально подход использовали, чтобы научить бота не выпадать из контекста диалога с пользователем и отвечать более информативными и полезными репликами. Мы решили модифицировать подход, чтобы наша модель поняла, что такое рифма, и создавала рифмующиеся строчки. Заранее скажем, что в обоих подходах мы использовали нейросеть GPT-2.

Мы разделили строки стихотворений на токены и начали специально показывать модели рифмы. В начале каждой строки мы вставляли в 20% случаев слово, которое стоит в конце предыдущей строки. А в 80% случаев — слово, которое рифмуется с последним. Таким образом модель выучила, что последнее слово должно рифмоваться с первым. В процессе инференса мы сами искали рифмы и тем самым помогали модели. Ниже — примеры стихотворений с подсказками.

Буря мглою небо кроет,
Вихри снежные крутя;
[Моет] То, как зверь, она завоет
Буря мглою небо кроет,
Вихри снежные крутя;
[Завоет] То, как зверь, она завоет,

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

Подход второй. В рамках этого подхода мы с помощью GPT-2 обучили модель предсказывать следующее слово и подавали информацию о номере строки в таком формате: @LINE_11@@ буря мглою небо кроет @LINE_22@@.

Затем мы перешли к проблеме рифмы. Мы знали, что если генерировать только одну строку, вероятность получить рифму составит около 50%. А если сгенерировать десять строк, то вероятность, что появится рифма, стремится к 100%. Поэтому решили генерировать много строк и выбирать из них лучшую — ту, в которой рифма есть.

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

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

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

VoiceKit и Thara: откуда у нашего нейропоэта голос и «живой» портрет

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

Команда VoiceKit подарила нейропоэту голос. VoiceKit — это технологии распознавания и синтеза речи Тинькофф. Подробнее о них можно узнать на сайте. Мы прошли такой же путь, как и любой внешний клиент: выбрали голос, который, как нам показалось, подходит поэту, а затем начали отдавать на платформу тексты. Для «AI да Пушкин» мы использовали готовые решения, поэтому не будем подробно описывать принципы их работы в этой статье. О том, как работают технологии синтеза речи в Тинькофф, можно узнать из этого видео. Если у вас останутся вопросы, поделитесь ими в комментариях, и мы постараемся ответить на них в следующих статьях.

Thara — технология, благодаря которой «ожила» внешность поэта. Это относительно молодая технология для Тинькофф. Ее создала одноименная команда экспериментальных продуктов, поэтому о технологиях «под капотом» мы пока рассказать не можем. Но примерный процесс создания анимации опишем.

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

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

Отдельной задачей стала выразительная мимика губ. Для нас было важно, чтобы поэт говорил именно то, что сгенерировала стихотворная модель. Так мы добивались максимальной синхронизации всех составляющих проекта: это был отличный продуктовый вызов для команд. Мы использовали модель, которая решает задачу LipSync, а именно доработанную версию сети wav2lip, функционирующую быстрее обычной. Нам нужно было, чтобы она работала с минимумом артефактов в области губ и зубов: без искажения формы, цвета губ и текстуры кожи. Для этого мы провели большую работу по правильной отрисовке губ и зубов на портрете Пушкина, который подаем модели на вход. Теперь процесс выглядит так: сначала мы снимаем с реального человека движения головы и глаз и перекладываем на портрет нашего Пушкина с помощью модели First Order Motion Model. Затем с модифицированной версией wav2lip накладываем на видео анимированные под проговариваемую речь губы, а сверху дорабатываем текстуру и общий стиль видео с модифицированной версией модели GPEN.

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

Одна из эмоций
Одна из эмоций

Все это происходит быстро, скорость анимации — 20—25 FPS (frames per second, кадров в секунду). Сейчас «AI да Пушкин» работает в HD-разрешении, не занимая при этом много места на GPU.

Заключение

В итоге у нас получился технологически интересный продукт, над которым работали около 30 человек из разных команд. С помощью «AI да Пушкин» сочинили стихотворения сотни тысяч пользователей: в среднем каждый из них сгенерировал 3,7 стихотворения. А всего получилось более 800 тысяч стихотворений. Что интересно, пользователи предпочитали вводить собственный текст в качестве начала стихотворения, а не использовать наши подсказки. Сгенерировав стихотворение, они присылали друзьям ссылку на проект и скриншоты с результатами. Это стало главным каналом привлечения новых пользователей. Из этого мы сделали вывод, что проект понравился аудитории.

Сейчас мы готовимся внедрять технологии, примененные при создании «AI да Пушкин», в другие сервисы и продукты Тинькофф. Например, контролируемая генерация, о которой мы подробно рассказали в этой статье, поможет улучшить качество ответов финансового ассистента Олега. А о применении остальных технологий и их устройстве мы постараемся подробнее рассказать в блоге в будущем.

Теги:
Хабы:
Всего голосов 8: ↑7 и ↓1+6
Комментарии12

Публикации

Информация

Сайт
www.tinkoff.ru
Дата регистрации
Дата основания
Численность
свыше 10 000 человек
Местоположение
Россия