
Салют, Хабр!
А мы кота завели. Для детей. В интеллектуальных колонках Sber появился новый помощник СберКот, который ранее обитал внутри детского банковского приложения СберKids. Умный помощник знает ответы на детские «почему» и говорит с детьми на одном языке. Он появится, если сказать колонке:
— Салют, позови СберКота!
В этой статье рассказываем, как выстроили многоуровневую систему безопасности, синтезировали голос СберКота и обучили колонку понимать особенности детской речи.
Как сделать общение с колонкой безопасным и интересным
По нашему внутреннему исследованию, пользователи (то есть родители) хотели бы занять ребёнка с пользой для него и вместе с тем оградить от нежелательного контента.
Нашей задачей было полностью отсечь ребёнка от sensitive-тем и запросов, которые подпадают под ограничение 18+, а для этого — выстроить многоплановую систему, которая обеспечит безопасность помощника для детей. Это так называемый GigaFilter — каскад фильтров, которые отсекают все небезопасные запросы и ответы. Сейчас схема обработки запроса выглядит примерно так:

Рассказываем о фильтрах, которые составляют GigaFilter, подробнее.
Блэклист
Это список заблокированных запросов, на которые колонка не должна отвечать. В него входят, например:
мат и ругательства;
названия алкогольных напитков, табачных изделий и наркотических веществ, в том числе жаргонные и научные;
сексуальные темы и всё, что с ними связано;
названия опасных веб-ресурсов для детей;
азартные игры.
Последний запрос маленького пользователя в рамках сессии мэтчится с блэклистом с помощью регулярных выражений. Если запрос не прошёл блэклист, то СберКот озвучит ребёнку один из ответов-«заглушек» — например, «Я совсем не хочу говорить на эту тему». Фильтрацию по тому же блэклисту проходит и ответ модели.
Блэклисты регулярно пополняются. Вместе с тем необходимо, чтобы все навыки колонки продолжали работать. Поэтому перед тем, как добавить в блэклист новую регулярку, команда оценивает на потоке количество запросов, которые она потенциально заблокирует. Все замеченные конфликты между «опасным» запросом и вполне безопасным навыком решаем с помощью грамматик — добавляем их в классификатор на грамматиках, который входит в часть перед GigaNLP — Intent Recognizer. По сути грамматики позволяют точечно перенаправлять запросы. Так, запрос пользователя «поставь песню поставь лайк» благодаря грамматикам уйдёт в навык музыки, а не в GNLP.
Нейрофильтр
Ещё одна часть GigaFilter — нейросетевой контекстный фильтр. Он с учётом предыдущего диалога проставляет запросу скор и сравнивает его с пороговым значением, которое подобрано аналитическим путём с помощью прогонов через модель двух датасетов. Первый — датасет для измерения false-positive rate, FPR. Он содержит абсолютно невинные запросы к колонкам, схожие с «опасными», и должен показать, не блокирует ли помощник вопрос необоснованно. Второй — детская валидационная корзина с «опасными» запросами. По сути пороговое значение представляет собой сбалансированный показатель, при котором блокируется максимум «плохих» запросов и не блокируется максимум «хороших».
Если скор выше порогового значения, запрос блокируется, а ребёнку умная колонка озвучивает реплику-«заглушку». Когда скор ниже, запрос отправляется к GigaChat.
Модель нейрофильтра для СберКота была специально дообучена на детских диалогах. Изредка, но бывает, что нейрофильтр ошибочно блокирует безопасный запрос. Мы отдельно отслеживаем такие кейсы, чтобы оперативно исправлять недостатки в трейне модели — добавлять туда же безопасные примеры, похожие на диалог с ошибкой.
Интересный факт: кроме каскада фильтров, у помощника для детей есть ещё один уровень защиты — сама модель. СберКот способен уклоняться от рискованных запросов. Дело в том, что в SFT для дообучения модели содержались не только обычные вопросы и ответы, но и пары «опасный запрос — безопасный ответ» + «похожий на опасный запрос — безопасный ответ». Соответственно, СберКот охраняет способность быть безопасным даже без оглядки на многоуровневую систему. Он не только увернётся от ответа, но и умело переведёт разговор на другую тему.
Когда появляется новая версия SFT, после переобучения моделей мы перед каждым релизом вновь убеждаемся в безопасности СберКота для детей: прогоняем детские валидационные корзины через модель, размечаем ответы и отправляем валидаторам, которые подтверждают, что всё ОК.


Одновременно с этим для СберКота колонку дообучили методом supervised fine-tuning на материалах, ориентированных на детскую аудиторию. Как уже упоминалось выше, этот датасет содержал как безопасные диалоги, так и пары «опасный запрос — безопасный ответ»/ безопасный, но схожий с опасным, запрос — безопасный ответ», которые позволили научить СберКота твёрдо отвечать на такие запросы и филигранно переводить диалог на другую тему, если запрос кажется сомнительным.
По запросу продуктовой команды в датасете появились ответы по конкретным тематикам: безопасность, эмпатия и эмоциональная поддержка, проактивность, понятность ответов, игровые механики. С помощью сервиса для разметки данных TagMe мы собрали и разметили новые диалоги, затем провели их валидацию. Дополнительно команда прогнала новые диалоги через другую модель со специальным промптом для подтверждения, что все ответы соответствуют как требованиям к ответам СберКота, так и самому его промпту. Например, промпт задаёт проактивность помощника для детей — он не только отвечает на вопросы, но и спрашивает сам, поддерживая диалог. Мы подготовили соответствующие диалоги, но при вычитке заметили, что иногда в конце ответа модель задаёт сразу два-три вопроса. Это неудачное решение — ребёнок может растеряться. Поэтому многочисленные вопросы в конце ответов заменили на один. Кроме того, в датасет вошли характерные словечки персонажа и корзины популярных диалогов по конкретным темам.
Как научить колонку говорить и слышать
СберКот обладает собственным характером и своей манерой общения. Он эмоционален, иногда повышает и растягивает фразы. Разумеется, у такого характерного кота должен быть голос с характером. Одной из наших задач стал синтез голоса для помощника.
В целом задача синтеза речи далеко не нова для команды. Ранее мы использовали q-Tacotron — усовершенствованную нами архитектуру нейросети Tacotron. Мы улучшили её с разных сторон: усовершенствовали архитектуру, данные, добавили ML-фишечки и оптимизации — контроль скорости, громкости ключевых слов, интонаций и так далее. Затем применили наши наработки к новой end-to-end архитектуре VITS — получился наш qVits, который с нами уже три года. А совсем скоро покажем кое-что совершенно новое.
Для голоса СберКота необходим был совсем небольшой датасет — благодаря возможностям мультиспикерной модели это не снижает качество и естественность голоса, а даже наоборот. В общей сложности диктор записал несколько часов материала: базовые фразы, которые подобрали под специфику персонажа, кое-что из детской энциклопедии, даже фрагмент из «Дживса и Вустера», эмоциональные и яркие реплики. Процесс записи контролировал войс-коуч (как и рассказывали в статье о q-Tacotron).
Также у модели есть дополнительный эмбеддинг, который кодирует собственно эмоцию — мы записали несколько спикеров с эмоциями и шёпотом, а затем сделали трансфер этой возможности на другие голоса. Ещё мы расширили SSML кастомными SSML-тэгами, чтобы контролировать сочетания эмоций и силу их выражения в голосе. Например, можно комбинировать в одной реплике несколько эмоций. Вот пример такой разметки:
<speak><voice mode="sad">наушники потерялись</voice><voice mode="annoyed">да где же они</voice><voice mode="happy">нашла</voice></speak>
На тестировании выяснилось, что наши основные пользователи — дети — иногда чуть не успевают за речью СберКота, поэтому её дополнительно замедлили. Чтобы подкрепить гипотезу цифрами, измерили так называемую метрику Side-By-Side, сравнив два варианта голоса. Набор текстов озвучили обоими голосами, затем участники сравнения выбрали варианты, которые им больше нравятся. Оказалось, что замедленный голос действительно воспринимается чуть лучше.
Общение ребёнка с колонкой — это диалог. Поэтому параллельно с задачей голоса СберКота мы совершенствовали уже действующее в умных колонках распознавание детского голоса. Дело в том, что в среднем помощник рассчитан на детей до 12 лет. Их речи свойственна определённая специфика. Например:
Голосовые связки короче, чем у взрослых, поэтому выше частота основного тона: у детей она колеблется в диапазоне от 250 до 400 Гц, у подростков — от 120 до 150 Гц (для сравнения, у мужчин — 85-150 Гц, у женщин — 180-250 Гц).
В среднем дети говорят тише взрослых, но с резкими скачками амплитуд (например, с криком, с внезапными акцентами). Речь может быть более фрагментированной — с паузами внутри слова.
Резонансные частоты детского голоса также расположены выше, чем у взрослых. Это влияет на акустическое сходство разных фонем и затрудняет различение гласных.
У детей чаще встречаются особенности речи — картавость, шепелявость, замена звуков, непривычно медленный или быстрый темп речи.
Модель для распознавания детской речи обучена методом supervised learning. К уже имевшимся в обучении данным детских голосов мы дополнительно собрали несколько тысяч часов данных, также использовали аугментации для лучшего обобщения модели во время обучения. Часть разметили на TagMe, для какой-то сделали псевдоразметку. Чтобы оценить качество модели при обучении, использовали метрику WER — word error rate, или доля неправильно распознанных слов. Модель срабатывает, как только аудиосигнал после споттерного слова начинает передаваться в сервер для его обработки. Распознавание детского голоса — одна из важнейших фич умной колонки.
К четырём споттерным словам умной колонки Sber прибавилось пятое — СберКот. Оно, как и остальные, работает по принципу классификатора: по аудио «бежит» окошко для предсказания, содержит ли речь споттерное слово или нет.
Для обучения модели в любых условиях распознавать слово «СберКот» нам вновь потребовалось множество записей для данных. Эти данные собраны из двух источников:
студия с умными устройствами Sber, где взрослые и дети наговаривают слова. Для датасета мы не только контролируем фразы, но и варьируем внешние условия плюс особенности произношения — записываем в тишине, с внешним шумом, при играющей музыку колонке, быстро, слитно... Как уже упоминалось, дети — сложный домен для обработки речи, особенно маленькие. Например, они зачастую говорят «Сбейкот».
внутренняя бета-группа наших сотрудников. Здесь тоже участвуют и взрослые, и дети — ведь взрослые могут тоже активировать СберКота.
Данные размечаем на нашей внутренней платформе TagMe и получаем лейблы с временными метками по границам хотворда (споттерного слова). Их разбивают на несколько корзинок — для обучения, валидации и замера метрик. На выходе модель способна оценить вероятность произнесения споттерного слова; если она превышает определённый порог, СберКот активируется.
В целом распознавание всегда балансирует между двумя метриками: FRR (false rejection rate) показывает, для скольки случаев умная колонка не активировалась, хотя споттерное слово произнесли, а FA/h (false activation per hour) — количество ложных срабатываний. Обе метрики зависимы друг от друга, и этот баланс выработан годами.
А что ещё?
Чтобы добавить в умные колонки Sber помощника для ребёнка, потребовалось много времени и сил — это большой кросс-функциональный проект с множеством команд. Вместе с тем работа над совершенствованием колонок для детей не ограничилась появлением СберКота. Например, команда навыков музыки на колонке сделала доработку по распознаванию детского голоса: если включить соответствующий тоггл в приложении, колонка не будет включать expicit-треки по запросу ребёнка (даже если на колонке не включён СберКот).
Мы видим будущее в помощниках для детей (в том числе с опорой на собственный опыт родительства). Родители не всегда могут обеспечить ребёнку внимание 24/7 и понятные ответы на все «Почему?». Тут и поможет умная колонка с AI — креативный и проактивный компаньон.
В подготовке статьи участвовали
Ксения Вороная, Андрей Евлампиев, Олег Горбунов, Антон Воробьев, Павел Мольков, Григорий Стерлинг, Дмитрий Болотов, Александра Сендерович, Анна Зуева, Михаил Голобоков
alpaca
Очень здорово. Спасибо, что заботитесь о детях. Хочется, чтобы у кота была своя цифровая аватарка.