Перейти до вмісту
sp1le.tech
EN
Онлайн 2026 Реалтайм-гра в браузері

Voice Duel

Зʼявляється питання; хто першим промовить правильну відповідь уголос, той бʼє суперника. Скінчилося здоровʼя - бій завершено. Тут є акаунти, друзі, приватні кімнати з кодами, публічне лобі та бот для дуже поширеного випадку, коли людина прийшла сама. Усе це - один процес Node з єдиною рантайм-залежністю.

Node · WebSocket · Web Speech API Відкрити · sp1le.tech/voiceduel

Обмеження

Розпізнавання мовлення, підбір суперника і опонент для тих, хто прийшов сам - на бюджеті хобі, без жодного API-ключа з боку гравця і без того, щоб аудіо покидало його браузер.

Рішення

  • 4 записи
  • кожен - із ціною

Журнал рішень

Звичайний веб і власний Web Speech API браузера

Замість
Unity WebGL
Тому що
Розпізнавання вже є в браузері: безкоштовно, без ключів, без завантаження аудіо, затримка в сотні мілісекунд. Збірка WebGL ходила б до того самого API через JS-міст і брала б за цю честь багатомегабайтне завантаження.
Ціна рішення
Підтримка Web Speech різна в різних браузерах, тож клієнт несе власний шлях відновлення на випадок, коли розпізнавання вмирає посеред раунду.

Одна рантайм-залежність: ws

Замість
Фреймворк, ORM, тестраннер
Тому що
У Node вже є HTTP-сервер, драйвер SQLite і тестраннер. Кожна залежність, від якої я відмовився, - це та, яку не доведеться патчити опівночі на сервері, який я тримаю сам.
Ціна рішення
Роутинг, сесії та робота зі схемою написані мною і простіші за бібліотеки, від яких я відмовився.

Один парсер відповіді, який імпортують і клієнт, і сервер

Замість
Порівнювати розпізнаний текст з очікуваним рядком
Тому що
Мовлення віддає «двадцять один», «21» і «двадцять-один» як одну відповідь. Якщо правило правильності існує у двох місцях, гравці рано чи пізно побачать, як суддя суперечить сам собі - і це вбиває гру надійніше за будь-який баг.
Ціна рішення
Цей файл не має права розійтися, тому лежить у shared/ і покритий тестами щільніше за все інше в проєкті.

Бот-суперник як розподіл часу реакції

Замість
Тільки підбір живих суперників
Тому що
Майже кожен, хто відкриває гру-хобі, приходить сам. Порожнє лобі - це не менший досвід, це кінець сесії.
Ціна рішення
Його складність - підкручена вручну думка, а не виміряна на живих гравцях величина.

Цифри

  • заміряно, не округлено

Масштаб

2 401
рядків JavaScript
1
рантайм-залежність
4
набори тестів, без фреймворку
0
байтів аудіо покидають браузер

Стек

  • Node.js
  • ws
  • node:sqlite
  • node:test
  • Web Speech API
  • Vertex AI
  • nginx

Ретро

  • написано після, не до

Що змінив би

Парсер відповіді лежить у shared/, бо альтернатива - два парсери, що збігаються випадково, - це той баг, який виявляється тільки перед гравцями, коли мовчати вже пізно. А ще гра живе на підшляху, а не на піддомені, тож усередині не може зʼявитися жодного абсолютного шляху - обмеження, яке тепер треба памʼятати вічно, замість того щоб один раз налаштувати.

Далі

Контакти

  • Інженер-програміст повного циклу

Почнімо розмову

Напишіть, що ви будуєте і що заважає. Відповідаю особисто, зазвичай того ж дня.

stasyukdmitriy2602@gmail.com Telegram @decimal128 LinkedIn github.com/sp1le