image

Недавно наряду с реплеями minmax.gg/chickendinner мы выпустили новую функцию, отображающую видео, транслируемые участвующими в матче PUBG Twitch-стримерами. Чтобы реализовать её, нам нужно было распознавать Twitch-стримеров по их внутриигровым именам, что оказалось довольно интересной задачей.


Наша новая Twitch-функция в действии.

Вероятность того, что ты играешь в одном матче со стримером


Прежде чем мы приступили к разработке этой функции, нам хотелось удостовериться, что вероятность матча, в котором кто-то из игроков стримит на Twitch, достаточно велика, чтобы оправдать наши усилия. Мы можем составить очень приблизительную оценку, посмотрев на количество активных игроков и сравнив его с количеством активных трансляций.

На момент написания статьи игру транслировало на Twitch около 2100 пользователей, а в Steam было около 700 тысяч активных игроков в PUBG. Это означает, что на это время стримеры составляли примерно 0,3% от базы игроков.


Учитывая то, что в матч чаще всего играют 100 человек, вероятность того, что хотя бы один из них будет стримером, обратна вероятности того, что стримером не будет никто. Так как вероятность того, что игрок не является стримером, равна 99.7%, то вероятность того, что ни один из 100 игроков не будет стримером, равна 0,997 в степени 100, то есть 0,74. Другими словами, в любом матче есть примерно 25-процентная вероятность найти хотя бы одного игрока, стримящего на Twitch.

Стоит заметить, что мы можем предполагать на Twitch сильное смещение в сторону региона «Северная Америка» по сравнению с общей базой игроков PUBG, поэтому если вы смотрите матчи из Северной Америки, то процент, вероятно, будет намного выше.

Угадываем имена


Теперь, когда мы знаем, что существует неплохо шанс найти стримера в любом выбранном матче, как же нам узнать, что игрок стримит игру на Twitch?

Для получения дополнительных бонусов можно подключить к игре свой аккаунт Twitch, но, к сожалению, эти данные недоступны из PUBG API. Нам нужен другой способ привязки имени игрока к стримеру в Twitch.

Давайте рассмотрим гипотетического стримера с названием аккаунта Mitch. Mitch регулярно играет в PUBG, но его Twitch-канал пока не достиг уровня просмотров, о котором он мечтает. Поразмыслив, он меняет своё внутриигровое имя на TwitchMitch. Теперь все знают, что Mitch стримит на Twitch.

Такой принцип встречается очень часто, иногда с немного отличающимися вариациями: TTVMitch или Mitch_TV. Такие имена можно обнаруживать программно и определять из них аккаунт на Twitch, позволяя нам получать видео для отображения в реплее матча.

Сопоставление вручную


Такой подход даёт нам очень хорошую опорную точку, но его далеко недостаточно. Имена большинства популярных стримеров не соответствуют данному паттерну. Чтобы обнаружить их, необходимо индивидуально привязать из аккаунт PUBG к названию их Twitch-канала.

Чтобы справиться с этим, мы начали вручную искать самых популярных стримеров в Twitch, и записывать внутриигровые имена аккаунтов, которые видны на экране. Если повезёт, то вам удастся поймать момент, когда игрок ожидает в лобби, где найти имя можно в нескольких местах:


Однако гораздо вероятнее найти игрока, уже играющего в матче. Если он играет с командой, то его имя постоянно будет видимо в нижнем левом углу:


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

Наиболее целостным подходом будет исследование центральной нижней части экрана, где можно найти следующее:


В этом тексте содержится имя аккаунта, текущая версия игры, последние 6 символов идентификатора матча и регион сервера. Стоит учесть, что он не всегда такой чистый, как показано выше, потому что обычно смешивается с тем, что происходит за ним на экране. Текст небольшой, а значит, может размываться и плохо считываться, когда возникают серьёзные артефакты видео. Но рано или поздно вы поймаете достаточно хороший кадр, чтобы прочитать его.

Возможно, вы уже думаете о том, что мы осознали на тот момент — это идеальная задача для автоматического решения компьютером!

Компьютерное зрение


В идеальных условиях алгоритм OCR должен распознать то, что написано в тексте внизу. Попробовав пару вариантов, мы в конце концов решили, что наилучшие результаты даёт Cloud Vision API Google. Мы можем создать скрипт, выполняющий следующее:

  1. Получает живую трансляцию PUBG и вырезает нижнюю часть из скриншота (Twitch API предоставляет полноразмерное изображение предварительного просмотра, поэтому скриншоты самим нам делать не нужно).
  2. Отправляет скриншот в Cloud Vision API и парсит из результата имя игрока.
  3. Убеждается через PUBG API, что игрок существует, а затем сохраняет привязку аккаунта Twitch к аккаунту PUBG в нашей базе данных.

Это замечательно сработает, за исключением одной небольшой детали: Google просит по 1,5 доллара за каждую тысячу запросов к Cloud Vision API. В любой момент времени может быть около 2-3 тысяч активных стримеров, поэтому даже единственный запуск скрипта будет стоить нам до 4,5 доллара. С учётом того, что мы скорее всего получим множество скриншотов с нечитаемым текстом, то для получения какого-нибудь значимого объёма данных потребуется выполнить скрипт несколько раз. Другими словами, такой подход быстро станет очень затратным мероприятием. К счастью, мы можем организовать запросы к Cloud Vision немного умнее. Мы можем воспользоваться тем, что Google просит оплату за отдельные запросы, вне зависимости от размера изображения. То есть мы можем соединить в сетку множество изображений:


Затем мы отправляем эту сетку изображени в API и привязываем получившийся текст к стримеру, соответствующему области, в которой был обнаружен текст.

Существует ограничение на размер одновременно отправляемых Google данных, поэтому мы будем брать на запрос по 300 склеенных вместе изображений. Это значит, что теперь мы сможем запускать тот же скрипт 300 раз при той же цене, что и раньше, что делает этот подход очень жизнеспособным и эффективным.

Заполняем последние пробелы


Наш скрипт проработал пару недель, и пока мы набрали 25 тысяч сопоставлений между Twitch и PUBG. Однако некоторых стримеров скрипт никак не мог привязать, например тех, у кого есть собственный оверлей поверх текста внизу экрана.

Этих стримеров нам придётся привязывать вручную. Вместо того, чтобы делать это самостоятельно, мы решили добавить функцию, позволяющую нашим посетителям отправлять имя любого стримера, которого они не нашли в нашей базе данных:


Мы с радостью продолжим эксперименты со способами получения таких пар аккаунтов, и ещё больше нам хочется найти новые способы использования уже имеющейся информации. Ждите от нас новых статей!

Комментарии (10)


  1. vassabi
    31.01.2019 20:42
    +1

    Мы можем воспользоваться тем, что Google просит оплату за отдельные запросы, вне зависимости от размера изображения. То есть мы можем соединить в сетку множество изображений
    красавцы!


  1. DrZlodberg
    01.02.2019 09:31

    Мы с радостью продолжим эксперименты со способами получения таких пар аккаунтов, и ещё больше нам хочется найти новые способы использования уже имеющейся информации.
    Хм… Как раз недавно в новостях проскакивала проблема охоты на персонажей стримеров во время матчей и попытки как-то это разрулить. Правда непонятно, как можно разрулить убийство персонажа в игре, вся цель которой в убийстве и состоит.


    1. PatientZero Автор
      01.02.2019 11:00

      PUBG API отдаёт данные о матче только после его завершения, так что стримснайпинг таким образом невозможен.


      1. DrZlodberg
        01.02.2019 11:37

        Так тут же (вроде) и описывается способ найти стримера в обход апи в текущем матче. Хотя надо ещё как-то подключиться нему (с игрой не знаком, возможно можно как-то управлять этим)


        1. QDeathNick
          01.02.2019 16:39

          Можно пытаться начать поиск сессии одновременно со стримером. Довольно неплохие шансы попасть в сотню, как показала практика. Мы так с другом попадали в один бой. С третьего раза удалось.


  1. Janycz
    01.02.2019 11:00

    Ох, как же вам будут благодарны стримснайперы. Это же получается, каждую 4-ую игру, можно стримснайпить кого-то? Хотя народные умельцы умеют в каждой (ну или в почти каждой) игре попадаться с определенным стримером.


    1. PatientZero Автор
      01.02.2019 11:01

      См. мой ответ выше.


      1. QDeathNick
        01.02.2019 16:42

        Надо ещё распознавать ники заработавших фраг и сразу открывать их трансляцию.


  1. krimtsev
    01.02.2019 18:03

    Хех, интересно было найти себя.


  1. CAJAX
    01.02.2019 23:21

    А там ещё карают тех, кто замочил стримера? Я помню, год назад была проблема, что после убийства мамкиной твич-звезды можно было оказаться забаненым в оплаченной игре или типа того.