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

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

Я не программист, по профессии маркетолог. Всё это написано с ИИ‑агентами примерно за шесть недель: сейчас в проекте больше пятисот коммитов. Как выглядит такая работа изнутри и что агент ломал по дороге, расскажу отдельно и честно. А в этой статье — карта: из каких частей состоит шоу и какие задачи в каждой из них оказались неожиданно сложными.
Как всё началось
Я уволился и решил повайбкодить. Начать хотел с чего‑то весёлого. У меня есть друзья, которые живут в разных странах, и я захотел сделать для нас игру. Сам формат не новый — игра вроде «Большого шоу» или японского 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 (ссылка ниже). Хочу провести игры не только с друзьями; это для тестов, а не для стрима.
Если у вас есть идеи — тоже пишите, буду рад. Можно комментарием под любым текстом в ТГ (там всего пара человек, я точно увижу и отвечу).
*Instagram принадлежит компании Meta, признанной в России экстремистской организацией; её деятельность в России запрещена.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.