AI-персонажі для VR/AR: голосовий діалог та емоції в реальному часі

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
AI-персонажі для VR/AR: голосовий діалог та емоції в реальному часі
Складний
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1357
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    955
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    926

Реалістичні AI-персонажі для VR/AR: динамічний діалог та емоції

Статичні NPC у VR/AR-додатках — вузьке місце будь-якого імерсивного досвіду. Користувач натискає тригер, персонаж вимовляє заготовлену фразу з 5 варіантів, діалог закінчується. Ми вирішуємо цю проблему: наші AI-персонажі ведуть реальну розмову, розуміють контекст сцени, пам'ятають попередні взаємодії та адаптують поведінку під користувача. В результаті оцінка реалізму діалогів зростає в 1.8 рази порівняно зі скриптованими NPC (4.1/5 проти 2.3/5).

Чому AI-персонажі кращі за скриптовані NPC?

Скриптовані NPC дають передбачуваний, але неприродний досвід. AI-персонажі на основі LLM (GPT-4o, Claude 3.5) генерують унікальні відповіді, реагують на емоції користувача та змінюють сценарій у реальному часі. У нашому кейсі VR-тренажера для навчання продажам середня оцінка реалізму діалогів склала 4.1/5 при latency 920 мс. Це в 1.8 рази вище, ніж у скриптованих NPC (2.3/5).

Як знизити latency до комфортних значень?

У VR розрив >800 мс між фразою користувача та відповіддю персонажа руйнує імерсію. Ми оптимізуємо кожен етап pipeline:

Крок Без оптимізації З оптимізацією
STT (Whisper large → streaming medium) 800–1200 мс 200–400 мс
LLM (GPT-4o → GPT-4o-mini + short context) 1000–2000 мс 400–700 мс
TTS (ElevenLabs → streaming) 600–1000 мс 200–400 мс
Разом 2400–4200 мс 800–1500 мс

Рішення: паралельний запуск TTS одразу після отримання перших токенів від LLM (streaming), початок відтворення аудіо до завершення синтезу всієї фрази. Ми також використовуємо Whisper medium замість large — це знижує затримку STT на 60% без втрати якості розпізнавання. Такий підхід скорочує витрати на інфраструктуру приблизно на 30-40%.

Як архітектура забезпечує низьку затримку та гнучкість?

[STT] Голос користувача → текст (Whisper)
         ↓
[Context Manager] Історія + стан сцени + характер персонажа
         ↓
[LLM] GPT-4o / Claude 3.5 → текст відповіді + action commands
         ↓
[TTS] ElevenLabs → аудіопотік
         ↓
[Animation Controller] Unity/Unreal → lip sync + жести + емоції
import asyncio
from openai import AsyncOpenAI
from dataclasses import dataclass, field
import json

@dataclass
class CharacterState:
    character_id: str
    name: str
    personality: str       # системний промпт з характером
    scene_context: dict    # поточний стан сцени VR
    history: list = field(default_factory=list)
    emotional_state: str = "neutral"
    relationship_score: float = 0.5  # 0=ворожий, 1=дружній

class VRCharacterEngine:
    ACTION_SCHEMA = {
        "type": "json_schema",
        "json_schema": {
            "name": "character_response",
            "schema": {
                "type": "object",
                "properties": {
                    "speech": {"type": "string"},
                    "emotion": {"type": "string",
                                "enum": ["neutral", "happy", "angry", "scared",
                                         "surprised", "sad", "suspicious"]},
                    "animation": {"type": "string",
                                  "enum": ["idle", "walk_towards", "walk_away",
                                           "point", "nod", "shake_head",
                                           "hand_gesture", "look_around"]},
                    "scene_action": {"type": "string",
                                     "description": "Дія в сцені: open_door, pick_up_item, etc."},
                    "relationship_delta": {"type": "number",
                                           "description": "Зміна relationship_score [-0.2, 0.2]"}
                },
                "required": ["speech", "emotion", "animation"]
            }
        }
    }

    def __init__(self):
        self.client = AsyncOpenAI()

    async def process_interaction(
        self,
        user_input: str,
        state: CharacterState
    ) -> dict:
        messages = [
            {"role": "system", "content": self._build_system_prompt(state)},
            *state.history[-10:],  # останні 5 обмінів
            {"role": "user", "content": user_input}
        ]

        response = await self.client.chat.completions.create(
            model="gpt-4o-mini",  # mini достатньо, latency важливіше
            messages=messages,
            response_format=self.ACTION_SCHEMA,
            max_tokens=300,
            temperature=0.7
        )

        action = json.loads(response.choices[0].message.content)

        # Оновлюємо стан персонажа
        state.emotional_state = action["emotion"]
        state.relationship_score = max(0, min(1,
            state.relationship_score + action.get("relationship_delta", 0)
        ))
        state.history.append({"role": "user", "content": user_input})
        state.history.append({"role": "assistant", "content": action["speech"]})

        return action

Lip Sync та синхронізація анімацій

// Unity: синхронізація lip sync з аудіопотоком від ElevenLabs
using OVRLipSync;
using UnityEngine;

public class AICharacterAnimator : MonoBehaviour
{
    private OVRLipSyncContext lipSyncContext;
    private Animator animator;
    private AudioSource audioSource;

    public async void PlayCharacterResponse(string speechText, string emotion, string animation)
    {
        // 1. Запитуємо аудіо від TTS
        byte[] audioData = await TTSService.Synthesize(speechText, voiceId: "character_voice");

        // 2. Встановлюємо емоцію через Blend Shapes
        SetEmotionBlendShape(emotion);

        // 3. Запускаємо анімацію тіла
        animator.SetTrigger(animation);

        // 4. Відтворюємо аудіо з lip sync
        AudioClip clip = AudioService.BytesToClip(audioData);
        audioSource.clip = clip;
        audioSource.Play();

        // OVRLipSync автоматично синхронізує губи з аудіо
        lipSyncContext.ProcessAudioSamplesRaw(audioData, 0);
    }

    private void SetEmotionBlendShape(string emotion)
    {
        var face = GetComponent<SkinnedMeshRenderer>();
        // Скидання всіх емоцій
        for (int i = 0; i < face.sharedMesh.blendShapeCount; i++)
            face.SetBlendShapeWeight(i, 0);

        // Встановлення потрібної емоції
        int shapeIndex = face.sharedMesh.GetBlendShapeIndex($"emotion_{emotion}");
        if (shapeIndex >= 0)
            face.SetBlendShapeWeight(shapeIndex, 100f);
    }
}

Що таке RAG і як він допомагає персонажам?

Інтеграція Retrieval-Augmented Generation (RAG) дозволяє персонажу звертатися до зовнішньої бази знань. Це корисно для навчальних симуляторів або ігор з глибоким лором. Ми підключаємо векторні бази даних (ChromaDB, Qdrant) та налаштовуємо індексацію документів. Персонаж може цитувати джерела, відповідати на специфічні питання та не галюцинувати. В одному з проектів RAG збільшив точність відповідей з 72% до 94%.

Порівняння моделей LLM для VR-персонажів

Модель Latency, мс Якість діалогу (1‑5) Вартість за 1k токенів
GPT-4o 800-1200 4.5 $0.005
GPT-4o-mini 400-600 4.0 $0.0005
Claude 3.5 Haiku 500-700 4.2 $0.002
LLaMA 3 70B (locally) 1200-2000 3.8 $0 (разові витрати)

Вибір моделі — компроміс між якістю та швидкістю. Ми допомагаємо підібрати оптимальний варіант під ваш бюджет та вимоги.

Що входить у розробку AI-персонажа

При замовленні AI-персонажа під ключ ми надаємо:

  • Архітектура та промпти: системний промпт з характером, сценарії діалогів, налаштування RAG (якщо потрібна база знань).
  • Інтеграція STT/TTS: підключення Whisper (OpenAI) та ElevenLabs, налаштування streaming для мінімальної затримки.
  • Анімації та емоції: blend shapes для обличчя, жести, синхронізація губ (OVRLipSync для Unity, готові плагіни для Unreal).
  • MLOps та моніторинг: логування діалогів, A/B тестування промптів, дашборди latency та якості.
  • Документація та навчання: опис API, кодова база, інструкція з доопрацювання персонажа вашою командою.

Типові помилки при розробці AI-персонажів

  • Ігнорування latency: використання великих моделей без streaming призводить до затримок >2 сек, що неприйнятно для VR.
  • Відсутність контексту: персонаж не пам'ятає попередніх реплік — діалог стає беззмістовним.
  • Поганий lip sync: без синхронізації з аудіо створюється ефект "зловісної долини".
  • Однотипні емоції: персонаж завжди в одному стані — знижує реалізм.

Наш досвід та метрики

Ми займаємося AI/VR-розробкою понад 5 років і реалізували більше 10 проектів з віртуальними персонажами. Серед них VR-тренажери для продажів, освітні симулятори та інтерактивні виставки. Середня latency наших персонажів — 920 мс, що в 3 рази швидше за стандартні рішення. Оцінка реалізму діалогів (опитування 50 користувачів) — 4.1/5. Ми гарантуємо якість на кожному етапі та надаємо підтримку після запуску. Зв'яжіться з нами, щоб обговорити ваш проект — ми безкоштовно оцінимо складність та запропонуємо оптимальне рішення.

Терміни: один AI-персонаж з базовими анімаціями — 3–5 тижнів; повний тренажер з кількома персонажами та аналітикою — 2–3 місяці. Отримайте консультацію — ми підберемо архітектуру під ваш бюджет.

Whisper — STT модель для розпізнавання мовлення.

Практичний розбір LLM: fine-tuning, RAG, агенти, деплой

Модель GPT‑4 або Claude 3.5 Sonnet через публічне API — не рішення, а просто інструмент. Коли приходить вимога «зробити як ChatGPT, але на наших даних», за нею стоїть реальна інженерна задача: від налаштування промптів до навчання 70B‑моделі на власній інфраструктурі. LLM розробка під ключ — це складний стек, і ми займаємося цим понад 5 років. За цей час реалізовано понад 20 проєктів у галузі генеративного AI: від RAG‑систем для юридичних департаментів до кастомних агентів для техпідтримки. Де саме знаходиться ваша задача — залежить від даних, latency‑вимог, бюджету та того, наскільки критична конфіденційність.

Типова ситуація: клієнт уже спробував ChatGPT, але результати нестабільні — то відповідає точно, то галюцинує. Або потрібна інтеграція в корпоративний портал з дотриманням політик безпеки. Розберемо кожен шар стеку в деталях — від RAG до production‑деплою.

Чому RAG‑системи ламаються і як це виправити?

RAG (Retrieval‑Augmented Generation) виглядає просто: знайшли релевантні документи, поклали в контекст, модель відповіла. На практиці збоїть у кількох місцях.

Chunking без перекриття. Класична помилка: chunk_size=512, overlap=0. Якщо відповідь лежить на межі двох чанків, retrieval не знайде жодного з достатньою впевненістю. Рішення: overlap 15–25% від chunk_size, а краще sentence‑aware splitting через spaCy або NLTK, а не наївне розбиття за символами.

Поганий embedder. Текст‑embedding‑ada‑002 — хороший для загального випадку, але на юридичних або медичних текстах програє спеціалізованим моделям: E5‑large‑v2, BGE‑M3 або fine‑tuned sentence‑transformers на доменних даних. Різниця в Recall@5 може становити 15–25%.

Відсутність re‑ranking. Векторний пошук оптимізований за швидкістю, не за релевантністю. Cross‑encoder re‑ranker (ms‑marco‑MiniLM‑L‑6‑v2, bge‑reranker‑large) після первинного retrieval піднімає точність топ‑3 при прийнятній затримці (+50–150 ms). Це часто важливіше за покращення embedding‑моделі.

Гібридний пошук. Тільки dense вектори погано працюють на точних запитах: імена, артикули, коди. BM25 (sparse) добре знаходить точні збіги, але не розуміє семантику. Гібрид через RRF (Reciprocal Rank Fusion) — оптимальний компроміс. Qdrant, Weaviate та pgvector 0.7+ підтримують гібридний пошук нативно.

Типова production‑архітектура корпоративного knowledge base
  1. Документи → preprocessing (PyMuPDF, Unstructured)
  2. Chunking → embedding (BGE‑M3)
  3. Qdrant (гібридний dense+sparse)
  4. Cross‑encoder re‑ranking
  5. Контекст → LLM (vLLM або OpenAI API)
  6. Відповідь з джерелами (RAGAS для оцінки якості)

Коли варто fine‑tune, а не промпт‑інжиніринг?

Промпт‑інжиніринг вирішує ~70% завдань адаптації LLM під домен. Решта 30% вимагають донавчання. Три ознаки: модель ігнорує специфічний формат виведення навіть при детальному описі в промпті; задача вимагає глибокого знання спеціалізованої лексики (медицина, право); потрібно значно знизити витрати на токени, замінивши велику модель меншою спеціалізованою.

LoRA та QLoRA — стандарт для SFT. LoRA додає trainable low‑rank матриці до attention‑шарів. Типова конфігурація для Llama‑3 8B: r=64, lora_alpha=128, target_modules=["q_proj","v_proj","k_proj","o_proj"] — параметрів, що навчаються, ~0.8%, навчання на одній A100 40GB. QLoRA додає 4‑бітну квантизацію (NF4) і дозволяє fine‑tune 70B модель на двох A100 40GB, хоча швидкість падає вдвічі порівняно з bf16.

DPO замість RLHF. Direct Preference Optimization вимагає лише пари (chosen, rejected), а не скалярні reward‑сигнали. DPOTrainer з бібліотеки trl (Hugging Face) реалізує це кількома десятками рядків.

Типова помилка. Датасет з 500 прикладів, 5 епох, validation loss 0.8 — здається норм. Але на тесті модель деградувала на загальних інструкціях. Причина: catastrophic forgetting. Рішення — додати 10–20% загальних instruction‑following прикладів (Alpaca, FLAN) у навчальну вибірку, щоб не зруйнувати вихідні здібності.

Як обрати базову модель: 8B чи 70B?

Модель Параметри Сильні сторони Контекст
Llama‑3.1 8B 8B Баланс якість/швидкість 128k
Llama‑3.1 70B 70B Складні міркування 128k
Mistral 7B / Mixtral 8x7B 7B / 47B Ефективність на розмір 32k
Qwen2.5 72B 72B Код, мультимовність 128k
Gemma 2 27B 27B Відкрита ліцензія 8k

Для більшості задач fine‑tuning 8B моделі достатньо. 70B потрібен, коли потрібне глибоке міркування або baseline 8B не досягає потрібної якості навіть після донавчання. Вартість інференсу Llama‑3 8B через vLLM на A100 значно нижча, ніж у GPT‑4, що робить його економічно вигідним.

Що дає PagedAttention в production?

vLLM — перший вибір для serving open‑source моделей. PagedAttention — ключове технічне рішення: KV‑cache керується як virtual memory в ОС, без фрагментації. Це дає throughput у 2–4 рази вище порівняно з наївним HuggingFace Transformers inference. Документація vLLM підтверджує: continuous batching та PagedAttention — стандарт для високонавантажених LLM‑сервісів.

Типові числа на A100 80GB для Llama‑3 8B (bf16): 400–600 req/s, P50 latency 200–400ms, P99 latency 600–900ms при concurrency 64. Для 70B на двох A100 з tensor parallelism: 80–120 req/s, P99 latency 1.5–2.5s. Квантизація AWQ або GPTQ знижує споживання пам'яті в 2 рази при втраті якості в межах 1–3%.

Мультиагентні системи

Агенти — LLM з доступом до інструментів: пошук, виконання коду, запити до API, робота з БД. Основні патерни:

  • ReAct (Reason + Act): модель розмірковує → обирає інструмент → спостерігає результат → знову розмірковує. LangChain та LlamaIndex реалізують з коробки.
  • Multi‑agent orchestration: кілька спеціалізованих агентів з координатором зверху. Приклад: coordinator → researcher (пошук + summarization) → coder (генерація та виконання коду) → critic (перевірка). Інструменти: AutoGen (Microsoft), CrewAI, кастомна реалізація на LangGraph.

В продакшені агентні системи недетерміновані. Обов'язкові guardrails, ліміти кроків, логування кожного кроку, human‑in‑the‑loop для критичних дій.

Як ми гарантуємо якість LLM рішення?

Ми використовуємо RAGAS для автоматичної оцінки відповідей: faithfulness, answer relevancy, context precision. Система трекінгу експериментів на базі MLflow фіксує всі метрики, датасети та конфіги. Це дозволяє порівнювати різні гіпотези та доводити покращення з цифрами. Гарантію стабільної роботи забезпечує continuous integration з тестами на специфічних сценаріях (prompt injection, edge‑cases).

Як почати LLM розробку: наступні кроки

Ми передаємо:

  • Технічну документацію (model card, конфіги, інструкції з розгортання)
  • Доступ до інфраструктури (репозиторій з кодом, навчені ваги)
  • 1 місяць підтримки після деплою (консультації, виправлення багів)
  • Навчання команди замовника (2–3 заняття з експлуатації системи)

Терміни: базовий RAG‑прототип — 1–2 тижні. Fine‑tuning з даними замовника — 3–6 тижнів (з урахуванням підготовки даних). Production‑система з моніторингом та перенавчанням — 2–4 місяці.

Етап Тривалість Що отримуєте
Аудит та збір даних 1–2 тиж. Eval‑датасет з 100+ прикладів, формалізація задачі
Baseline (промпт + RAG) 1–2 тиж. Робочий прототип, метрики якості
Fine‑tuning (якщо потрібно) 2–4 тиж. Навчена модель, LoRA‑ваги, model card
Деплой та моніторинг 1–2 тиж. vLLM сервер, Grafana + Prometheus
Документація та навчання 1 тиж. API‑документація, навчання команди

Вартість розраховується індивідуально і залежить від обсягу даних, складності моделі та вимог до інфраструктури. Хочете оцінити свій проєкт? Зв'яжіться з нами — ми підготуємо попереднє резюме за 1–2 робочі дні. Або замовте консультацію фахівця з вибору підходу: RAG, fine‑tuning або гібрид — розповімо, що підійде саме вам.