Перейти к контенту

AI-аватар: как добавить лицо голосовому помощнику и избежать подводных камней

7 мин чтения
Dr. Sam «DeepFake King» Markov
ai видеоai-аватарanamfastapisimliweb rtcyandex realtimeголосовой помощникинтеграция aiнейросети
AI-аватар: как добавить лицо голосовому помощнику и избежать подводных камней — illustration 1

Интеграция AI-аватара в существующий голосовой ИИ-администратор Айка — это не просто добавление лица, а целая цепочка технических вызовов. Мы стремились сохранить текущую архитектуру на Yandex Realtime, чтобы новый сервис лишь анимировал губы под уже сгенерированный звук. В процессе тестирования Simli и Anam выявились нюансы с паузами перед ответом, запуском видео на iPhone и стабильностью мобильного интернета. А при создании второго персонажа, Евы, стало очевидно, что убедительность нейронки зависит не только от самого лица, но и от контекста.

Наш голосовой движок уже функционировал, поэтому задача заключалась исключительно в анимации лица. Айка общается с посетителями сайта напрямую в браузере через WebSocket, который подключен к нашему серверу на FastAPI, а тот, в свою очередь, держит сессию с Yandex Realtime. Это обеспечивает режим «речь в речь», исключая необходимость в отдельных цепочках распознавания, текстовой модели и синтеза.

Сервер передает браузеру несжатый звук в формате PCM16 на 24 кГц частями (pcm_chunk), и именно под этот поток требовалось синхронизировать мимику аватара.

Выбор платформы для AI-аватара: Simli vs Anam

Оба протестированных сервиса — Simli и Anam — предлагают режим, где пользователь предоставляет свой аудиопоток, а сервис генерирует видео с анимированным лицом, синхронизированным со звуком, возвращая медиа по WebRTC. Таким образом, Яндекс продолжает генерировать речь, а сервис аватара отвечает за визуальную составляющую.

Технические аспекты интеграции звука

  • Частота дискретизации: Яндекс выдает звук на 24 кГц. Simli требует 16 кГц, Anam также был настроен на 16 кГц, хотя поддерживает и другие форматы.
  • Обработка аудио-чанков: Звук поступает кусками. Чтобы избежать артефактов на стыках, дробная позиция и последний сэмпл переносятся в следующий чанк. Это обеспечивает плавность анимации, хотя качество пересчета частоты без полноценного фильтра еще требует улучшения.

Безопасность и управление сессиями

Ключ сервиса не попадает в браузер. Страница запрашивает у нашего сервера кратковременный токен сессии через POST /voice/avatar-session. Сервер проверяет origin и ограничивает выдачу токенов: 6 в час на IP и 30 в час всего.

Если токен не получен или видео не запускается, страница переключается в обычный голосовой режим. На запрос токена отводится 8 секунд, на запуск SDK — 15. Важно, что успешный запуск SDK не гарантирует немедленное появление первого кадра; лицо здесь — дополнение, а не критическая функция.

Управление состоянием аватара в Anam

Anam предоставляет две ключевые команды:

  • endSequence(): вызывается после отправки последнего аудиофрагмента реплики.
  • interruptPersona(): останавливает текущую речь аватара при перебивании, после чего также вызывается endSequence().

Сравнение Simli (старое поколение) и Anam Cara-4

Мы сравнивали доступные нам версии: Simli прошлого поколения и Anam Cara-4. Это не исчерпывающее сравнение всех возможностей, а выбор под конкретную задачу.

Параметр Simli (прошлое поколение) Anam Cara-4
Мимика Губы двигаются, остальная мимика ограничена Моргает, улыбается, видны зубы, наклоняет голову
Создание лица Из фото через API прошлого поколения Из одного фото, доступно пробное видео

Субъективно, Anam показал более живую и естественную мимику. Для нас это стало решающим фактором. Далее мы столкнулись с рядом специфических проблем.

Особенности воспроизведения медиа

  • Звук: В Simli звук воспроизводился через отдельный аудиоэлемент, в Anam — через тот же видеоэлемент. Это означает, что видеоэлемент Anam нельзя оставлять muted, иначе аватар будет «говорить» беззвучно.
  • Разрешение: Видео часто начиналось с низкого разрешения (384×576) и лишь через несколько секунд переключалось на высокое (768×1152). Опция sessionOptions.videoQuality: "high" помогала, но не гарантировала старт с высокого качества.
  • Задержка генерации кадров: Anam требуется получить 0.8 секунды аудио, прежде чем начать генерацию кадров. Это не всегда равно 0.8 секунды ожидания в реальном времени, так как звук может поступать быстрее, чем проигрывается.

Управление микрофоном и сессиями

  • Подавление эха: На телефоне, пока Айка говорит, микрофон отключается, чтобы избежать захвата её голоса из динамика. На ПК микрофон активен, и при начале речи пользователя (событие barge_in от Yandex Realtime) аватар останавливает текущую речь.
  • Занятый слот сессии: На бесплатном тарифе доступна одна одновременная сессия. При падении браузера слот мог оставаться занятым. Запрос GET /v1/sessions/concurrency помогает диагностировать занятость слотов.
  • Отмена подключения: Если пользователь нажимает «стоп» во время подключения видео, необходимо корректно завершить асинхронные операции, чтобы не оставить ненужную сессию. Для этого введен счетчик поколений videoGen.

Проблемы с Safari на iPhone

На iPhone в Safari видео не запускалось. Гипотеза связана с правилами автовоспроизведения. Предварительный вызов play() на видеоэлементе с временной подачей потока с canvas и снятием muted помог в тестовом прогоне, но не является универсальным решением.

Оптимизация паузы перед ответом

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

Мы перенесли логику телефонного моста на сайт: в обычном разговоре порог 1500 мс, при диктовке — 2200 мс. Это позволяет динамически регулировать чувствительность VAD. Настройки применяются через session.update без переподключения.

AI-аватар: как добавить лицо голосовому помощнику и избежать подводных камней — illustration 2

Создание второго персонажа: Ева

Для администратора студии Евы мы столкнулись с проблемой «стоковой блондинки» на пустом фоне. Переломный момент наступил, когда за спиной появился интерьер: тёплые лампы, полки, растения, размытый дальний план. Это сделало образ гораздо убедительнее, превратив «каталог» в «человека на рабочем месте».

Детали создания фона и портрета

  • Фон: Использовали готовый интерьер в нашей стилистике, убрав людей генератором.
  • Вырезание персонажа: Еву вырезали средствами macOS Vision (VNGeneratePersonSegmentationRequest с уровнем .accurate). Край маски сужали и смягчали для устранения ореола.
  • Масштаб: Важно соблюдать масштаб предметов на фоне, чтобы избежать комичных ситуаций (например, гигантская кружка за спиной). Фон брали только выше столешницы и размывали под портретный объектив.
  • Разрешение: Для Cara-4 рекомендован квадратный исходник от 1152×1152. Чистое увеличение Real-ESRGAN ×4 делало кожу слишком гладкой. Лучше выглядела комбинация нейросетевого увеличения с обычным масштабированием, повышением резкости и добавлением зерна.

Озвучка Евы

Для Евы выбирали голос из семейства LiveTTS Яндекса. В SpeechKit API v3 модель выбирается через "model": "livetts", а голос и амплуа передаются через hints. Для длинных текстов текст разбивался на предложения и синтезировался отдельно.

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

Запись видеороликов с аватаром

Ролик Евы записывали через тот же движок анимации, что и живой звонок, используя MediaRecorder прямо с video.srcObject (видео и звук вместе, WebM с VP9 и Opus). Для корректного старта записи поток предварительно «будили» секундой тишины, чтобы ролик не начинался с черного экрана.

Часто задаваемые вопросы

Что такое AI-аватар и как он работает?

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

Можно ли использовать свой голос для AI-аватара?

Да, большинство платформ, таких как Anam и Simli, позволяют использовать собственный голосовой движок или предварительно записанный звук. Аватар будет анимировать лицо под этот аудиопоток, сохраняя узнаваемость вашего бренда или персоны.

Какие основные сложности при интеграции AI-аватара?

Среди основных сложностей — синхронизация аудио и видео, обработка аудио-чанков, оптимизация задержек, обеспечение стабильной работы на различных устройствах (особенно мобильных), а также создание убедительного визуального образа, который соответствует контексту и бренду.

Как фон влияет на восприятие AI-аватара?

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

Сколько стоит создание AI-аватара?

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

Заключение

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

Если вы хотите масштабировать ваш контент и создать AI видео для рекламы, рассмотрите возможности нейро-продакшена по подписке. Это позволяет генерировать сотни роликов, будь то AI UGC для криптопроекта или фабрика ИИ роликов для e-commerce. Мы готовы помочь вам в этом! Свяжитесь с нами, чтобы узнать, как AI контент продакшн может трансформировать ваш бизнес.


← Назад к блогу