{"id":14268,"url":"\/distributions\/14268\/click?bit=1&hash=1e3309842e8b07895e75261917827295839cd5d4d57d48f0ca524f3f535a7946","title":"\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c \u0438\u0433\u0440\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e?","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"f71e1caf-7964-5525-98be-104bb436cb54"}

Озвучить статьи на 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 — читатели благодарили за появившуюся возможность прослушивать статьи.

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

А ещё мы делаем подкасты на «Яндекс.Музыке» из RSS-ленты с озвученными статьями.

Никита Ткачёв, менеджер по развитию бизнеса в «Яндекс.Облаке»

Самый популярный сценарий использования SpeechKit — это голосовые роботы в телефонии. Но мы с интересом смотрим и за развитием других вариантов. К примеру, владельцы колл-центров строят на базе речевых технологий тренажёры для своих операторов, либо просто распознают их диалоги для проверки. Кто-то распознаёт речь в видео и быстро понимает, о чём оно. А стримеры озвучивают зрительские послания, чтобы во время трансляций не отвлекаться на текст.

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

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

Правда, среди доступных голосов нет Алисы, голосового ассистента «Яндекса»: её голос — эксклюзив для наших сервисов, хотя она тоже работает на базе SpeechKit. Но если попросить её озвучить актуальные новости, то она передаст слово своим коллегам — Джейн, Захару и другим голосам, которые можно подключить.

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

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

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

Сейчас мы обкатываем синтез на принципиально новой архитектуре и результаты нас очень радуют: синтезированная речь стала более приятной на слух — модель учится имитировать человеческое дыхание и паузы.

Из существующих недостатков синтеза речи, можно выделить классическую контекстную ловушку: иногда робот не понимает, речь идёт о зАмке или замкЕ — и здесь ему нужна помощь проставленным ударением.

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

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

В этом помогают специальные теги внутри текста (SSML) — единственные кусочки кода, которые робот не станет произносить. С их помощью можно даже вручную управлять стилем речи — менять произношение, удлинять паузы или расшифровывать аббревиатуры. К примеру, произность vc.ru как «ви-си-ру».

Пример тега, который добавляет паузу в одну секунду:

<speak>Эй, секундочку<break time="1s"/> Что вы делаете?</speak>

Разработчикам и продуктовым командам, как правило, не составляет труда разобраться с API самостоятельно. Бизнесу это сложнее, поэтому мы работаем с партнёрами, которые берут эти заботы на себя — к примеру, с командой Speechkit, которая поставила озвучку контента на поток.

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

1 рубль 71 копейка
Стоимость озвучки этой статьи — в ней 9360 символов
0
27 комментариев
Написать комментарий...
Andrey Uglev

молодцы, но слушать это конечно же невозможно

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Зеленый и громкий

Твердыйзнак твердыйзнак твердыйзнак ц ц ц ц ц ц ц ц ц

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Yandex Cloud
Автор

Да не будет оправданий. Сегодня технология позволяет ударение легко исправить, а завтра и ошибки не будет.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Юрий Б.

Это по следам дубляжа Дискавери: крепИм, кашИца, битОй и недавно я пополнил коллекцию словом соплО.

Ответить
Развернуть ветку
Юрий Крупин

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

Ответить
Развернуть ветку
Yandex Cloud
Автор

Да, это уже широкое поле для кастомизации - темп, паузы и т.д

Ответить
Развернуть ветку
Daler Fatykhov

надо добавить сколько времени на прослушивание/чтение как медиуме

Ответить
Развернуть ветку
Андрей Дымов

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

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Юлия Лисс

А как к вам на озвучку устроиться? 😁 Очень интересный опыт был бы, и для практики бы пошло))

Ответить
Развернуть ветку
Валентин Остапенко

Назовите вашу цену

Ответить
Развернуть ветку
Юлия Лисс

:DD Зарплата мечты

Ответить
Развернуть ветку
JhaoDa

Всё время спотыкается на «Яндекс.Облако», считает точку окончанием предложения. Иногда «е» звучит как «ё». SpeechKit иногда звучит как «СпичКыт». TJ как «ТИ». MP3 иногда как «эмпэтрё».

Но в целом согласен — результат приятно удивил.

Ответить
Развернуть ветку
JhaoDa

Ну и, конечно, что-то из этого можно решить через <sub> и <phoneme> на стороне VC.

Ответить
Развернуть ветку
Евгений Рожнов

эм пэ трёх :)

Ответить
Развернуть ветку
Евгений Рожнов

Если все статьи на vc будут прослушиваться, то как же реклама? Будет аудио реклама? Только в начале или через каждый абзац?

Ответить
Развернуть ветку
Danil Khasanshin

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

Ответить
Развернуть ветку
Andrius Kai

не работает. айпад про ios 13.1 beta

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Александр Тютюнников

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

Ответить
Развернуть ветку
Alexander Burtsev

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

Ответить
Развернуть ветку
Мсье Риддлер

нельзя было сразу в статье написать "ЗП разрабам - 600к за 3 недели работы, аренда серверов - 15к, затраты в сумме - 764050р 54коп, а то какие-то выводы, подробности. Времени читать нет!

Ответить
Развернуть ветку
Julia Valebnaya

1:56 - "...у спич кЫт..." :D

 и другие интересные интонационные колебания

Яботы много :) Но все это очень интересно.

Ответить
Развернуть ветку
24 комментария
Раскрывать всегда