искусственный интеллект · голосовые интерфейсы · аватары · webRTC · javascript · аналитика · Яндекс17 октября в 11:03 · 5 мин

Добавление лица голосовому ИИ на Яндексе: опыт интеграции Simli и Anam

Разработчик голосового бота Айка решил придать своему ИИ-администратору визуальное воплощение, не нарушая работу существующего голосового движка. В статье описывается техническая реализация: выбор между сервисами Simli и Anam, обработка аудио в реальном времени, проблемы с мобильными браузерами и тонкости настройки анимации губ под синтезированный звук.

# Как я добавил лицо голосовому ИИ на Яндексе: сравнение Simli и Anam

Мой голосовой ИИ-администратор Айка уже мог вести диалоги с посетителями сайта, используя сервис Yandex Realtime. У неё был голос, сценарий и работающий интерфейс «речь в речь», но отсутствовало визуальное сопровождение. Задача заключалась в добавлении аватара без переноса всего конвейера на новую языковую модель или движок синтеза.

*«Мне не нужен был новый конвейер из распознавания, языковой модели и синтеза. Нужна была только анимация лица»*.

Выбор технологии и подготовка аудио

Существующая архитектура опирается на WebSocket между браузером и сервером на FastAPI, который, в свою очередь, взаимодействует с Yandex Realtime. Сервер передаёт браузеру голос в виде несжатых чанков PCM16 со скоростью 24 кГц.

Для оживления лица использовались два сервиса: Simli (поколение прошлого типа) и Anam (модель Cara-4). Оба сервиса работают по принципу WebRTC: принимая готовый звук, они генерируют видео с синхронизированной мимикой и возвращают результат в реальном времени.

Главная техническая сложность заключалась в ресемплинге. Поскольку Яндекс выдавал звук на 24 кГц, а сервисы требовали 16 кГц, был написан кастомный код для плавного пересчёта частоты. Важно было учесть границы аудио-чанков: если пересчёт начинается с нуля для каждого фрагмента, на стыках могут появляться артефакты. Реализовано решение с сохранением позиций и сэмплов между кусками, что обеспечило бесшовную передачу сигнала при любой длине передаваемого фрагмента.

Термины

PCM16 (Pulse Code Modulation 16-bit) — несжатый цифровой формат аудиосигнала, в котором каждый отсчёт звуковой волны занимает 16 бит. Это обеспечивает высокое качество звучания, но требует больше данных по сравнению со сжатыми форматами.

WebRTC (Web Real-Time Communication) — открытое стандартное решение для обеспечения передачи голоса и видеоданных в браузере через протокол HTTP. Позволяет создавать видеозвонки и стриминг без необходимости использовать отдельные плеерные движки.

Сравнение Simli и Anam

Оба сервиса были протестированы на одном портрете и одном голосовом потоке для объективности.

* Simli (предыдущее поколение): Первый кадр появлялся через 11 секунд после начала соединения. Анимация была функциональной: губы двигались под звук, но мимика остальных частей лица (брови, глаза) практически отсутствовала. Вид выглядел более механическим. * Anam (модель Cara-4): Статус подключения сменился быстрее (через 0,9 секунды), и первый кадр поступил в журнал уже через 2,7 секунды. Лицо демонстрировало живую мимику: моргание, улыбку, наклон головы и видимые зубы, что придавало общению большей естественности.

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

Проблемы мобильной платформы и браузера

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

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

Синхронизация и настройки диалога

Для создания реалистичности анимации требовалось 0,8 секунды аудио перед началом генерации кадров. Важно понимать, что звук мог приходить в браузер быстрее, чем он проигрывался пользователю (до 1,73 секунды задержки на расшифровке пользователя). Логика управления должна была учитывать не только текущее состояние плеера, но и расчётную очередь сэмплов, чтобы микрофон не фиксировал обратную связь с динамика во время речи аватара.

Особое внимание уделено настройке пауз. Изначально длинная пауза после окончания речи пользователя (ожидание VAD — Voice Activity Detection) нарушала естественность диалога. Было внедрено динамическое управление порогом: 2,2 секунды при диктовке номера телефона и 1,5 секунды в обычном режиме. Настройки передавались через событие session.update без необходимости перезапуска сессии.

Термины

VAD (Voice Activity Detection) — система обнаружения речи, которая определяет моменты начала и конца разговора. Используется для пауз перед ответом ИИ и управления потоком передачи звука.

Гонка состояний (Race condition) — ошибка программирования, возникающая, когда порядок выполнения операций зависит от относительного времени их поступления. В данном случае: если остановить стриминг перед созданием клиента соединения, последующий запрос может создать новый клиент, игнорируя команду «Стоп».

Влияние фона на восприятие аватара

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

Решение пришло с добавлением контекста: интерьер с тёплым светом, полками и размытым дальним планом. Для создания финального изображения использовалась комбинация нейросетевой генерации и ручного монтажа. Генератор иногда добавлял лишних объектов (небоскрёбы, гигантскую кружку), поэтому применялось выделение человека с помощью VNGeneratePersonSegmentationRequest и наложение на подготовленный фон. Масштабирование изображения проводилось через смесь нейросетевого увеличения (Real-ESRGAN) и обычного повышения резкости, чтобы избежать эффекта «пластиковой» кожи.

Заключение

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

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

Первоисточники

Habr AI ↗
← Вернуться в эфир