Озвучить статьи на vc.ru
Менеджер по продукту «Комитета» рассказывает, чего это стоило.
Аудиоверсию этой статьи можно включить, нажав на кнопку «Слушать» в начале статьи.
Филипп Концаренко, менеджер по продукту в «Комитете»
Как устроены наши сайты
Наши сайты — vc.ru, DTF и TJ — работают на одной платформе. Мы называем её «Основа». Единая платформа удобна с точки зрения разработки — наша команда работает над кодом одновременно для всех проектов. Кроме того, эксклюзивное решение под vc.ru можно быстро масштабировать на остальные площадки. К примеру, раздел «Вакансии» мы разрабатывали сначала на vc.ru, а потом за пару дней запустили его ещё и на DTF.
«Основа» — это набор модулей. Каждый из них независим и решает конкретную задачу: в одном можно создавать и редактировать статьи, а другой отвечает за их отображение. Все модули постоянно «общаются» между собой.
Такая структура «Основы» позволяет нам периодически проводить эксперименты. Мы можем спокойно проверить новую функцию в текущем или новом модуле, не переживая за работоспособность всей платформы.
Изобретаем механизм озвучки
Одним из таких экспериментов стала интеграция с «Яндекс.Облаком». Компания объявила об открытии API для озвучки текста (SpeechKit), и мы решили его попробовать на статьях.
Эта задача не потребовала сложной разработки: мы довольно быстро выстроили несколько процессов в логическую цепочку и выделили их в новый модуль.
Почему отдельный модуль? Во-первых, чтобы распределить нагрузку. Конвертация текста в аудио происходит в фоне, когда для этого есть свободные ресурсы сервера. Модуль получает запрос на озвучку, обрабатывает его и через какое-то время отправляет ответ со звуковой дорожкой.
Во-вторых, отдельный модуль — это универсальное решение, которым может пользоваться любой другой модуль «Основы». Если нужно озвучить ленту новостей или лучшие комментарии — это можно сделать простой отправкой запроса от модуля «Комментарии» или «Статья». При желании даже «Вакансии» могут запросить аудиоверсию объявлений.
У SpeechKit «Яндекса» опубликовано подробное описание API, поэтому всё подключение обошлось без общения с техподдержкой: прочитали, разработали, протестировали, оплатили, подключили. Первую рабочую версию получили уже через три дня.
А теперь подробнее про то, как мы озвучиваем статьи при помощи «Яндекс.Облака».
Из символа в звук: процесс изнутри
1. Формируем список статей для озвучки
Каждые 30 минут специальный алгоритм «Основы» собирает список из десяти наиболее популярных на текущий момент статей на vc.ru, TJ и DTF. Он учитывает множество параметров: на популярность влияет и количество прочтений, и оценки, и комментарии. Ещё мы смотрим на статус статьи: вносились ли в неё изменения и озвучивалась ли она раньше — это помогает в случаях, когда автор дополнил текст уже после озвучки.
2. Для каждой статьи из списка выбираем только текст
Справиться с этой задачей помогает модуль «Редактор», который отвечает за написание статей. Он сохраняет каждую заметку на vc.ru, TJ или DTF не как HTML-код, а как набор текстовых и медийных блоков, в которых содержание отделено от технических атрибутов.
Проще говоря, статья выглядит примерно так: в первом блоке — текст, во втором блоке — ссылка на картинку и подпись к ней. Достаточно попросить скрипт отфильтровать и выгрузить только текстовые блоки, и мы получим основное содержание материала.
3. Собираем все данные в «Гутенберг»
Полученные тексты отправляем на специальный внутренний сервис — мы называем этот модуль «Гутенбергом».
Он собирает все запросы на озвучку текстов с наших сайтов в единый поток, разбивает его на небольшие куски — по 5 тысяч символов, как этого требует API, добавляет параметр — озвучивать женским голосом или мужским и с какой скоростью. Далее выстраивается очередь из запросов для отправки в «Яндекс.Облако».
4. Отправляем запрос в «Яндекс.Облако»
В ответ «Яндекс.Облако» присылает нам файлы в формате OGG. Каждый из них — это озвучка фрагмента длиной не более 5 тысяч символов.
Таким образом, если статья состоит из двух тысяч символов, мы получим один OGG-файл. Для лонгрида в 24 тысячи символов — пять OGG-файлов.
5. Создаём MP3-файл и загружаем его на сервер
Для длинных статей «Гутенберг» сначала соединяет несколько OGG-файлов в один и генерирует на его основе MP3. Все популярные статьи получают свой MP3-файл.
Он загружается на наш сервер, а в параметр статьи добавляется дата его генерации и ссылка. Когда пользователь откроет статью, «Основа» увидит ссылку на аудиоверсию и отобразит иконку с наушниками.
Дата файла нужна для того, чтобы можно было переозвучить статью, если её автор обнаружит опечатку или добавит дополнение. Алгоритм, который используется на первом шаге, сравнит дату изменения и дату генерации аудиоверсии. Если статья была обновлена после создания аудиоверсии, то статья снова попадёт в очередь на озвучку.
Что получилось
Мы рассматривали новую функцию как удобный инструмент для потребления контента и не ставили каких-либо продуктовых метрик.
Но результат приятно удивил. Выросла лояльность пользователей приложения. Заметно выросло количество положительных отзывов в App Store и Google Play — читатели благодарили за появившуюся возможность прослушивать статьи.
Кроме того, мы начали приучать читателей к новому каналу получения информации, который из года в год становится популярнее и качественнее.
Никита Ткачёв, менеджер по развитию бизнеса в «Яндекс.Облаке»
Самый популярный сценарий использования SpeechKit — это голосовые роботы в телефонии. Но мы с интересом смотрим и за развитием других вариантов. К примеру, владельцы колл-центров строят на базе речевых технологий тренажёры для своих операторов, либо просто распознают их диалоги для проверки. Кто-то р��спознаёт речь в видео и быстро понимает, о чём оно. А стримеры озвучивают зрительские послания, чтобы во время трансляций не отвлекаться на текст.
Что касается озвучки статей, то мы с этим сталкивались — наш сервис существует достаточно давно, и мы уже наблюдали эксперименты других изданий. Но, на мой взгляд, vc.ru первыми довели этот процесс до ума.
Самый популярный из наших голосов — Оксана. Традиционно считалось, что женский голос работает эффективнее, но сейчас выбор делают в зависимости от сферы деятельности.
Правда, среди доступных голосов нет Алисы, голосового ассистента «Яндекса»: её голос — эксклюзив для наших сервисов, хотя она тоже работает на базе SpeechKit. Но если попросить её озвучить актуальные новости, то она передаст слово своим коллегам — Джейн, Захару и другим голосам, которые можно подключить.
Сейчас главное направление нашей работы — «очеловечить» речь, на данный момент она легко отличима от живой. На это есть несколько причин: холодная механическая подача, ровный ритм, монотонные паузы. Рецепт один: улучшить разметку датасета — материала для работы нейросети.
Чем больше метрик мы будем использовать для дикторских записей, тем качественнее робот будет подражать человеческой речи. Если раньше мы выделяли фонемы и паузы, то теперь мы переходим к работе с достаточно тонкими материями — показываем роботу, где диктор говорит вдохновлённо, где его голос идёт «на повышение», ускоряется, становится мрачным или весёлым.
Мы поставили эксперимент: дали партнёрам возможность менять эмоциональную окраску голоса на раздражённую или радостную, и он оказался удачным.
Сейчас мы обкатываем синтез на принципиально новой архитектуре и результаты нас очень радуют: синтезированная речь стала более приятной на слух — модель учится имитировать человеческое дыхание и паузы.
Из существующих недостатков синтеза речи, можно выделить классическую контекстную ловушку: иногда робот не понимает, речь идёт о зАмке или замкЕ — и здесь ему нужна помощь проставленным ударением.
Партнёру нужно следить за данными, которые он отдаёт на обработку. Если в текст попадёт кусочек кода, то робот, как ни в чём не бывало, попробует его озвучить, будто это вставка на другом языке. По соглашениям конфиденциальности мы не имеем права сохранять и переиспользовать данные, которые отдают партнёры — иногда это сильно раздражает наших разработчиков.
С другой стороны, клиент может разрешить нам сбор этих данных или отправить проблемные записи в службу поддержки. Тогда мы включаемся в работу и помогаем ему настроить исключения или правильные произношения.
В этом помогают специальные теги внутри текста (SSML) — единственные кусочки кода, которые робот не станет произносить. С их помощью можно даже вручную управлять стилем речи — менять произношение, удлинять паузы или расшифровывать аббревиатуры. К примеру, произность vc.ru как «ви-си-ру».
Пример тега, который добавляет паузу в одну секунду:
Разработчикам и продуктовым командам, как правило, не составляет труда разобраться с API самостоятельно. Бизнесу это сложнее, поэтому мы работаем с партнёрами, которые берут эти заботы на себя — к примеру, с командой Speechkit, которая поставила озвучку контента на поток.
К нам часто приходят запросы на запись индивидуального голоса. Пока мы не берём такие проекты — слишком большие накладные расходы на запись диктора, обработку датасета и контроль качества. Но в этом направлении есть сдвиги, и вскоре мы сможем реализовывать такие проекты за разумные деньги.
1 рубль 71 копейка