Игорь Градов
Игорь Градов
8 мин
ai

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

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

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

Пауза перед первым словом. Между последним переданным чанком звука и началом проигрывания аватаром есть задержка. Если пользователь видит лицо, которое молчит полсекунды после вопроса, впечатление ломается. Решение: начинать отправку звука в аватар сразу, как приходит первый чанк от Яндекса, не дожидаясь конца фразы.

Мобильный Safari и autoplay. На iPhone Safari не разрешает автозапуск видео со звуком без жеста пользователя. Кнопка «позвонить» считается жестом, но между нажатием и реальным появлением видеопотока проходит время на получение токена и старт WebRTC. К моменту, когда видео готово, жест уже «протух». Обходной путь: создать видеоэлемент и вызвать play() сразу по клику, до получения токена, а поток назначить позже. Safari запоминает, что элемент запущен жестом.

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

Ева и фон

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

Фон генерировался отдельно и подкладывался под портрет до отправки в Anam. Сервис принимает изображение целиком: что нарисовано за пределами лица, он не трогает.

Итог

Айка получила лицо. Голосовой движок остался на Yandex Realtime, сервис аватара добавил картинку. Разговор начинается по клику, работает на iPhone, переживает слабый мобильный интернет. Код написан Claude Code, часть вариантов внешности генерировал Codex, но каждое решение проверялось вручную на живом телефоне.

Источник: авторский проект, задокументированный в процессе интеграции.


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

Почему это важно

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

До сих пор создание говорящего аватара обычно означало переход на платформу, которая берёт на себя весь конвейер: распознавание речи, генерацию текста, синтез голоса и анимацию. Автор пошёл другим путём. Yandex Realtime (сервис Яндекса, работающий в режиме «речь в речь» без отдельных этапов распознавания и синтеза) уже обслуживал разговоры через браузер. Задача свелась к одному звену: взять звук, который генерирует Яндекс, и передать его в сервис аватара, чтобы тот рисовал лицо с синхронизированными губами в реальном времени.

Что понадобится?

  • Работающий голосовой ИИ-ассистент с выходом звука в формате PCM16 (несжатый звук, где каждый отсчёт занимает 16 бит). В данном случае это Yandex Realtime, но подойдёт любой источник
  • Аккаунт в сервисе видеоаватаров: автор протестировал Simli и Anam
  • Сервер на FastAPI (Python-фреймворк для создания API), который уже обслуживает WebSocket-соединение (постоянный канал связи между браузером и сервером) с голосовым движком
  • Портретное фото или сгенерированное изображение для аватара
  • iPhone или Android-устройство для мобильного тестирования
  • Claude Code для написания интеграционного кода, Codex для генерации вариантов внешности (опционально)
  • Примерное время: от нескольких часов до пары дней на отладку, основное время уходит на мобильные нюансы

Пошаговая инструкция

  1. Определите, что отдаёт ваш голосовой движок. В данном проекте Yandex Realtime передаёт браузеру звук кусками (чанками) PCM16 на частоте 24 кГц через события pcm_chunk. Зафиксируйте формат и частоту: от этого зависит следующий шаг

  2. Пересчитайте частоту звука под требования сервиса аватара. Simli принимает 16 кГц, для Anam автор тоже использовал 16 кГц. Если ваш источник отдаёт 24 кГц, нужен ресемплер (пересчётчик частоты). Критически важно переносить дробную позицию и последний отсчёт между чанками, иначе на стыках кусков появятся щелчки. Пример ресемплера на JavaScript:

const AVATAR_RATE = 16000;
const resampler = {
  pos: 0, prev: 0,
  reset() { this.pos = 0; this.prev = 0; },
  run(int16, inRate) {
    const n = int16.length;
    if (!n) return new Int16Array(0);
    const step = inRate / AVATAR_RATE;
    const out = new Int16Array(Math.ceil((n - this.pos) / step) + 1);
    let p = this.pos, k = 0;
    while (p < n - 1) {
      const i = Math.floor(p), f = p - i;
      const a = i < 0 ? this.prev : int16[i];
      out[k++] = Math.round(a + (int16[i + 1] - a) * f);
      p += step;
    }
    this.pos = p - n;
    this.prev = int16[n - 1];
    return out.subarray(0, k);
  },
};
  1. Защитите ключ сервиса от утечки в браузер. Создайте на сервере эндпоинт (точку входа) для выдачи короткоживущих токенов сессии. В проекте это POST /voice/avatar-session. Сервер проверяет origin (источник запроса) и ограничивает выдачу: 6 токенов в час на один IP, 30 в час на все запросы

  2. Подключите SDK (набор инструментов разработчика) сервиса аватара. При использовании Anam обратите внимание: звук и картинка воспроизводятся одним элементом <video>, и его нельзя оставлять в режиме muted. Иначе лицо будет шевелить губами молча. Для повышения качества на старте добавьте параметр sessionOptions.videoQuality: "high", без него видео начинается с низкого разрешения и переключается на высокое только через несколько секунд

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

  4. Добавьте обработку перебивания. У Anam для этого есть две команды: interruptPersona() останавливает текущую речь аватара, endSequence() закрывает последовательность входного звука. Вызывайте обе при перебивании

  5. Решите проблему autoplay на iPhone. Safari не разрешает автозапуск видео со звуком без жеста пользователя. Между нажатием кнопки «позвонить» и реальным появлением видеопотока проходит время на токен и старт WebRTC (технология передачи аудио и видео в реальном времени). К этому моменту жест уже «протух» для браузера. Решение: создайте элемент <video> и вызовите play() сразу по клику, до получения токена, а поток назначьте позже. Safari запоминает, что элемент запущен жестом

  6. Добавьте фоллбэк (запасной режим). Если токен не получен за 8 секунд или SDK не запустился за 15, страница возвращается к обычному голосовому режиму. Лицо здесь украшение, а не условие разговора

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

Как это применить

Автор загрузил один и тот же портрет в Simli и в Anam, подключил оба к одной странице с одним голосом Yandex Realtime. У Simli лицо прошлого поколения двигало губами, но выглядело механически. У Anam (модель Cara-4) лицо выглядело живым: мимика менялась между фразами, взгляд не застывал. Второй персонаж, Ева, на белом фоне казался маской. После добавления размытого интерьера за спиной тот же портрет стал восприниматься как человек в комнате. Фон генерировался отдельно и подкладывался под портрет до отправки в сервис.

Частые ошибки

Немой аватар. Если у Anam оставить видеоэлемент в режиме muted, лицо будет говорить беззвучно. Звук идёт через тот же элемент <video>, отдельного <audio> нет.

Щелчки на стыках чанков. Если ресемплер не переносит дробную позицию между кусками звука, на границах появляются артефакты. Проверка: прогоните один и тот же сигнал целиком и нарезанным на куски случайной длины. Разница должна быть нулевой.

«Протухший» жест на iPhone. Safari требует, чтобы play() был вызван внутри обработчика клика. Если между кликом и запуском видео прошло время на сетевые запросы, браузер блокирует воспроизведение. Создавайте элемент и запускайте его сразу.

Лицо без фона. Портрет на белом фоне выглядит как вырезка. Даже простой размытый фон кардинально меняет восприятие.

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

Качество ресемплера. Перенос позиции между чанками решает проблему стыков, но не решает проблему качества: без фильтра перед понижением частоты составляющие выше 8 кГц могут создавать искажения. Для голоса это часто некритично, но учитывайте.

Что это даёт вам прямо сейчас?

Авторам Дзена и контент-мейкерам. Говорящий аватар на сайте или лендинге привлекает внимание и удерживает посетителя. Если вы уже используете голосового бота для консультаций по продуктам или курсам, лицо превращает «голос из динамика» в собеседника. Это не требует смены платформы.

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

Разработчикам и предпринимателям в РФ. Связка работает с Yandex Realtime, то есть голосовая часть остаётся на российском сервисе. Simli и Anam пока не имеют прямых аналогов в РФ. Если доступ к ним ограничен, сам принцип «голосовой движок отдельно, анимация лица отдельно» позволяет подключить любой будущий российский сервис видеоаватаров без переписывания голосовой логики.

Мнение редакции dzen.guru

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

По моим наблюдениям, качество анимации у Anam Cara-4 заметно живее, чем у прошлого поколения Simli. Но рынок видеоаватаров меняется быстро, и к моменту, когда вы это читаете, у обоих сервисов могут быть уже другие модели.

Честная оговорка: всё это работает, пока есть стабильный интернет и доступ к зарубежным API. На слабом мобильном канале WebRTC снижает качество картинки, но не обрывает разговор, и это разумный компромисс. Главный архитектурный принцип, лицо как украшение, а не условие работы, стоит сохранять: если видеосервис упал, пользователь всё равно разговаривает.

Попробуйте ИИ-инструменты dzen.guru

Узнайте, как нейросети помогают авторам Дзена создавать контент быстрее и качественнее

Перейти к инструментам

Автору Дзена, который думает о голосовом помощнике на своём сайте, стоит запомнить одну вещь из этого проекта: архитектура «голос отдельно, лицо отдельно» означает, что вы не привязаны ни к одному поставщику целиком, и если завтра появится сервис лучше, вы замените один модуль, а не всю систему.

Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Кибербезопасность 2026: трояны с ИИ-агентами и ботнеты на блокчейне уже в продаже
ai

Кибербезопасность 2026: трояны с ИИ-агентами и ботнеты на блокчейне уже в продаже

Кибербезопасность стала зоной, где искусственный интеллект работает по обе стороны баррикады: злоумышленники в первой половине 2026 года начали встраивать…

6 мин
Что такое ИИ-агент и как CLiF учит его на действиях реальных пользователей
ai

Что такое ИИ-агент и как CLiF учит его на действиях реальных пользователей

Почему это важно Впервые открытая платформа предлагает учить ИИ-агента не на рукописных тестах, а на реальных действиях пользователей продукта, и делает это…

5 мин
ai

Сгенерировал сервис: где его хостить и сколько это стоит, от 0 до 5 000 ₽

Сгенерировать сервис с помощью нейросети сегодня может даже человек без опыта в программировании, но запустить его так, чтобы им пользовались другие,…

7 мин