Уявіть: ви у VR-шутері, ворог за рогом, але його голос звучить просто у вусі — без позиціонування. Просторовий аудіочат — це не фіча, а база для мультиплеєрного VR. Ми вирішуємо це завдання: інтегруємо голосовий чат (VoIP) з урахуванням специфіки просторового аудіо, затримки та шумозаглушення. Голос має звучати з точки аватара, затухати з відстанню та відбиватися від геометрії сцени. Без цього мультиплеєрний VR-досвід втрачає половину присутності — користувачі не відчувають себе в одному просторі.
Два основні SDK для VR-голосу: Vivox (Unity Gaming Services) та Dissonance Voice Chat (незалежний пакет для Unity). Vivox використовує хмарну обробку з HRTF, Dissonance працює через існуючий мережевий транспорт (Photon, Mirror, NGO) та дає меншу затримку. Вибір залежить від іншого мережевого стеку та вимог до якості звуку. Dissonance забезпечує затримку в 2-3 рази менше, ніж Vivox (30 мс проти 100 мс).
Як Dissonance вирішує проблему затримки у VR?
Dissonance працює поверх ігрового транспорту — голосові пакети йдуть через той самий канал, що й дані гри. Для Photon Fusion є готова інтеграція DissonanceComms + PhotonFusionCommsNetwork. Встановлюється на окремий GameObject у сцені, підключається до NetworkRunner.
Критичне налаштування: VoicePlaybackOrder. За замовчуванням Dissonance ставить голос у чергу та відтворює з затримкою ~100 мс для згладжування джиттера. У VR це відчутно: губи аватара рухаються (якщо є lipsync), а голос приходить пізніше. Потрібно знижувати MinJitterBuffer до 20–30 мс — при хорошому з'єднанні джиттер мінімальний.
Просторовий звук: на кожному VoiceReceiptTrigger вмикається Use Positional Data — Dissonance передає позицію джерела через Unity Audio Source. Далі працює стандартний Unity 3D Audio з AudioRolloffMode.Logarithmic, MinDistance, MaxDistance. Для VR специфічно: AudioListener знаходиться на HMD, а не в Camera.main — потрібно переконатися, що він переміщується разом з головою користувача.
Згідно з документацією Dissonance, мінімальний буфер джиттера становить 5 мс, але на практиці рекомендується 20 мс для стабільності.
Vivox та просторовий аудіо: коли він кращий?
Vivox — cloud-hosted SaaS. Голос йде через сервери Unity (Epic Voice Service). Це знижує навантаження на ігрову інфраструктуру, але додає залежність від зовнішнього сервісу та затримку 50–150 мс. Для просторового аудіо використовується VivoxUnity.IAudioSource3D — SDK передає позицію та орієнтацію в хмару, і сервер застосовує HRTF-обробку. Якість 3D-позиціонування вища, ніж у Unity Audio Source з лінійним rolloff, але overhead значний.
Проблема Vivox у standalone Quest: потрібне активне інтернет-з'єднання. Для ігор, де голосова комунікація — ключова механіка (переговори, командні команди), затримка може бути критичною.
Шумозаглушення та кодеки
Користувачі Quest говорять у вбудований мікрофон шолома — шум побутової техніки, діти, телевізор. Без шумозаглушення голос буде нечистим. Dissonance підтримує WebRTC Noise Suppressor (VAD + NS) — підключається через DissonanceComms.MicrophoneCapture. WebRTC NS добре справляється зі стаціонарними шумами (гул холодильника), знижуючи їх рівень на 50%, гірше з різкими звуками.
Кодек для голосу: Opus — стандарт де-факто. Dissonance використовує Opus за замовчуванням з бітрейтом 16–32 kbps — достатньо для розбірливої мови. Збільшення до 64 kbps не дає значущого покращення. Vivox теж Opus, але бітрейт та параметри не налаштовуються вручну.
Зонування голосу: команди та шепіт
В іграх з кількома командами потрібне зонування: гравець чує лише тих, хто поруч або в його команді. Dissonance реалізує це через Rooms — кожен гравець підписується на кімнати та говорить у конкретну. Для механіки «шепоту» (чутно лише впритул) та «крику» (чутно на всю карту) робимо три кімнати: Proximity (radius 5м, автоматично за відстанню), Team (тільки своя команда), Broadcast (усі).
Перемикання через жест — специфіка VR. «Шепіт» — рука біля рота (перевірка відстані від HMD до контролера < 15 см). «Радіо» — натискання на іконку рації на передпліччі через променевий інтерактор.
Приклад конфігурації VoiceReceiptTrigger
VoiceReceiptTrigger trigger = GetComponent<VoiceReceiptTrigger>(); trigger.UsePositionalData = true; trigger.SpeechProximityRadius = 5f; trigger.DeadCyclesBeforeStripped = 2; Порівняння Dissonance та Vivox
| Характеристика | Dissonance | Vivox |
|---|---|---|
| Затримка | ~30–50 мс (на 60% швидше) | 50–150 мс |
| Просторовий звук | Unity Audio Source (rolloff) | HRTF (хмарна обробка) |
| Залежність від мережі | Працює P2P/через транспорт | Потребує постійного інтернету |
| Гнучкість налаштувань | Повний контроль (бітрейт, буфер) | Обмежене налаштування |
| Ліцензування | Одноразова покупка пакета | Помісячна оплата за хвилини |
Як ми це робимо: покроково
- Аналіз мережевого стеку — визначаємо, який транспорт використовується (Photon, Mirror, Unity Netcode).
- Вибір SDK — Dissonance для командного чату з низькою затримкою, Vivox для простих рішень з хмарним HRTF.
- Інтеграція — встановлення пакета, налаштування кімнат та позиційних даних, калібрування буфера.
- Тестування — перевірка затримки, якості звуку, роботи жестів.
- Деплой — оптимізація для цільової платформи (Quest, PC VR).
Що входить в роботу
- Аудит поточного мережевого стеку та пропускної здатності.
- Інтеграція обраного SDK (Dissonance або Vivox) з просторовим аудіо.
- Налаштування шумозаглушення та кодеків.
- Реалізація зонування (кімнати, шепіт, крик).
- Тестування на цільових пристроях (Quest, Pico, PC VR).
- Документація щодо налаштувань та підтримки.
Наша команда має 8+ років досвіду в геймдеві, 20+ виконаних VR-проектів. Ми гарантуємо впровадження голосового чату під ключ.
Терміни та оцінка
| Варіант інтеграції | Орієнтовні терміни |
|---|---|
| Dissonance + Photon Fusion, базовий звук | 3–7 днів |
| Vivox + Unity Gaming Services, зонування | 1–2 тижні |
| Кастомне зонування + жести + lipsync | 2–4 тижні |
Вартість розраховується після аналізу вашого мережевого стеку. Отримайте консультацію щодо вашого проекту — ми допоможемо вибрати SDK. Замовте аудит мережевого стеку для точної оцінки термінів.






