javascript

Сделал для Twitch “Детектор смеха”, где ИИ считывает эмоции. Рассказываю, как оно устроено внутри и…

  • воскресенье, 4 октября 2026 г. в 00:00:05
https://habr.com/ru/articles/1089960/

Решил сделать для друзей игру, где нельзя смеяться, чтобы ИИ распознавал эмоции и определял, кто засмеялся первым.

Пример того, как работает «Детектор смеха»
Пример того, как работает «Детектор смеха»

Я не программист, по профессии маркетолог. Всё это написано с ИИ‑агентами примерно за шесть недель: сейчас в проекте больше пятисот коммитов. Как выглядит такая работа изнутри и что агент ломал по дороге, расскажу отдельно и честно. А в этой статье — карта: из каких частей состоит шоу и какие задачи в каждой из них оказались неожиданно сложными.

Как всё началось

Я уволился и решил повайбкодить. Начать хотел с чего‑то весёлого. У меня есть друзья, которые живут в разных странах, и я захотел сделать для нас игру. Сам формат не новый — игра вроде «Большого шоу» или японского Hitoshi Matsumoto Presents Documental: разные раунды, но единое правило — нельзя смеяться.

Сначала я попробовал посмотреть рилсы через демонстрацию экрана в Zoom, но видео приходило с опозданием: один уже смеётся, у другого ещё середина.

Когда решил эту проблему (расскажу позже как), надо было понять, кто засмеялся первым и что считать смехом. Нужно было как‑то судить. Попробовали классику с водой во рту — судит она идеально, но с водой во рту нельзя разговаривать, а часто смешны не сами видео, а разговоры и взаимодействие. Плюс, кроме просмотра видео, есть и другие раунды.

Тогда решил поискать, как можно отлавливать смех в реальном времени: камера же всё равно включена.

Из чего состоит шоу

Общая схема логики шоу.
Общая схема логики шоу.

1. Видео стартует у всех одновременно

Главное решение проекта: по сети не передаётся видео. Каждый участник заранее скачивает ролик, а сервер присылает только одно — в какой момент его нулевая секунда. Дальше у каждого свои часы, сверенные с серверными, и своя подстройка скорости, чтобы не разъехаться. Расхождение между участниками — меньше одного кадра.

Чтобы не делать полотно, подробности про каждую большую фичу расскажу в следующих статьях. Если коротко: синхронизацию я сделал сам (общие часы и WebSocket), а камеры и голос участников идут через LiveKit — там тоже было много нюансов.

2. Нейросеть ловит смех

Лицо распознаёт модель прямо в браузере у каждого игрока — видео с камеры никуда не уходит, на сервер летят только числа. Из 52 «мышечных» признаков лица собираются смех, злость и страх, а сервер решает, засмеялся ли человек.

Первая игра с друзьями
Первая игра с друзьями

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

Про калибровку тоже расскажу в отдельной статье. Потом проставлю сюда ссылки.

3. Автоматическое скачивание рилсов от зрителей и сбор топа комментариев Instagram*

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

Но часто комментарии смешнее самих видео. Со сбором комментариев тоже свои нюансы на целую статью. Хочется показывать самые залайканные, а Instagram* не отдаёт программам число лайков у комментариев, так что топ по лайкам автоматически не собрать. Пять способов забрать комментарии программно не сработали, сработал шестой: ничего не автоматизировать. Расскажу об этом отдельно, как и про вывод комментариев поверх видео.

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

4. Как работает картинка эфира

Весь кадр эфира — камеры, ролик, сердца, банк, комментарии — это обычная веб‑страница, которую OBS снимает как окно. Так проще, чем собирать сцену из десятков источников в OBS. Из этого же кода получается вертикальная версия для TikTok, а маленький «режиссёр» сам переключает камеры на того, кто говорит или смеётся.

Сейчас есть одна нерешённая загадка: иногда картинка замирает ровно в момент, когда ловят смех (чаще в одном из режимов).

5. Первая статистика TikTok и автоматический режиссёр вертикальной версии

Залил первые видео в TikTok и удивился, как некоторые из них начали выстреливать.

Режиссёр вертикальной сцены

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

У меня же эмоции трекаются много раз в секунду и есть микрофоны, значит, вертикальную сцену можно режиссировать автоматически. Я составил набор правил. Логика довольно простая: приоритет по микрофону — показываем того, кто говорит. Если никто не говорит, смотрим на детектор смеха и показываем того, кто ближе всех к срыву.

В целом эту фичу можно использовать и для вебинаров. Если будет интерес, могу написать отдельную статью.


А что если это стримить

Затем я подумал: раз в TikTok есть просмотры, можно не ограничиваться только им. Лет пять назад я работал в Wargaming и проводил стримы. Поэтому решил подумать, как вообще можно интегрировать это со зрителями. Круто, если бы зрители могли влиять на процесс.

Интерактив со зрителями

Так как я маркетолог, то начал прикидывать, какие механики могут быть интересны зрителям и повлиять на продвижение на Twitch.

Так появился банк: когда кто‑то смеётся, в банк прибавляется определённая сумма. В конце стрима банк разыгрывается между зрителями (почему в конце — это такая замануха для удержания).

Пример, как пополняется банк от смеха.
Пример, как пополняется банк от смеха.

Так как я сейчас не работаю, то в качестве наград пока раздаю свои скины из CS.

Вот что есть из интерактива: банк из смеха ведущего, розыгрыш среди фолловеров, прогнозы «засмеётся или нет» с билетами за верные ответы, оценка рилсов. И отдельное решение — не использовать баллы канала Twitch: правила Twitch запрещают награды, похожие на азартную игру.

Есть ещё много интерактивных штук, о которых, возможно, расскажу отдельно, например про оценку рилса, ставки, «кто засмеётся» и так далее

Голосование за рилс
Голосование за рилс
Голосование, кто засмеется
Голосование, кто засмеется

Как это всё написал не‑программист

Тут и так понятно, что это всё вайбкодинг. Я хочу сделать серию технических статей о том, как что устроено, и буду рад, если у кого‑то будут идеи или комментарии, что можно доработать или улучшить. Да и в целом фидбеку.

Немного цифр

  • Около шести недель, больше 500 коммитов, около 100 тысяч строк кода и тестов.

  • Ведущий и до четырёх гостей, три реакции: смех, злость, страх.

  • Нарезки в TikTok: 600 000 просмотров за 4 недели.

  • Провел первый тестовый эфир.

Статистика тестового эфира, где всё, что могло пойти не так — пошло.
Статистика тестового эфира, где всё, что могло пойти не так — пошло.

Нашёл то, чем действительно загорелся

Немного лирики. Я как‑то думал, чем бы хотел заниматься, если бы вопрос был не в деньгах, — и не придумал, что искренне может меня сильно увлечь. И пока делал этот проект, понял, что по‑настоящему загорелся.

Сейчас получил оффер на новую работу, но есть внутренняя дилемма: идти в найм и пока забить на этот хобби‑проект или ещё какое‑то время тратить подушку и посмотреть, что из этого выйдет. Может, попробую совмещать, но когда погружаюсь в работу, то хобби обычно уходит на второй‑третий план. Как решу — поделюсь.

Ну и важна оценка со стороны. Друзья, понятно, говорят «топ», «весело» и так далее, но они на то и друзья. Хочется снять розовые очки и окунуться в реальность, поэтому за любой фидбек буду благодарен.

Как можно помочь (или если вы хотите затестить)

Если у вас нормальный ПК, камера и звук и вы хотите попробовать поиграть — напишите мне, пожалуйста, в Telegram (ссылка ниже). Хочу провести игры не только с друзьями; это для тестов, а не для стрима.

Если у вас есть идеи — тоже пишите, буду рад. Можно комментарием под любым текстом в ТГ (там всего пара человек, я точно увижу и отвечу).

https://t.me/MrKholov


*Instagram принадлежит компании Meta, признанной в России экстремистской организацией; её деятельность в России запрещена.