Ötfős alapcsapattal indultunk: két fejlesztővel (az egyik az AI-ra és a streamelésre, a másik a webplatformra fókuszált), egy grafikussal, az operatív vezetőnkkel és a cégvezetőnkkel. A második szakaszban UX/UI-tervezővel, további Laravel-fejlesztőkkel és egy felhőmérnökkel bővült a csapat. Kéthetes sprintekben dolgoztunk, rendszeres demókkal, az alapító pedig minden lépésbe be volt vonva.
Architektúra. A rendszer négy, egymással együttműködő részből áll. A játékos gépén futó asztali kliens rögzíti a képet és a hangot. A streamingszerver fogadja és tárolja a folyamokat, majd rövid szakaszokra bontja őket. Az AI-elemzők ezeket a szakaszokat vizsgálják. A SzuperChess webplatform pedig mindent megmutat a játékosoknak, a versenybíróknak és az adminisztrátoroknak. Az egyes részek jól definiált API-kon keresztül kommunikálnak, így bármelyik elemzőt fejleszteni vagy cserélni lehet anélkül, hogy a rendszer többi részéhez hozzá kellene nyúlni.
Játékoskliens és beléptetés. .NET-ben, Avalonia keretrendszerrel többplatformos asztali klienst fejlesztettünk. A játékos a SzuperChess-fiókjával lép be, a kliens pedig végigvezeti a beléptetésen. Ellenőrzi, hogy látszik-e az arc és jó-e a fény, majd megkéri, hogy fordítsa el a fejét, és mutassa meg mindkét fülét. Minden lépést gépi látás igazol. Ezután a kliens gRPC-n keresztül továbbítja a szerverünkre a webkamera képét, a képernyőt, a mikrofont és a számítógép hangját. A versenybírók játék közben üzenetet küldhetnek a játékosoknak, amely megjelenik a játékos képernyőjén.
AI-elemzők. Minden elemző külön Python-szolgáltatás, és egyfajta kockázatot figyel:
- Tekintetkövetés: Arcpontok felismerésével a rendszer minden képkockán megtalálja a szemet és a pupillát. Riaszt, ha a játékos nagyjából négy másodpercre elnéz a képernyőről, ismételten ugyanarra az irányra pillant, vagy kikerül a képből.
- Képernyős feketelista (OCR): A játékos képernyőjét optikai karakterfelismerés olvassa be, és összeveti egy, a szervező által szerkeszthető feketelistával. Ezen sakkprogramok (Stockfish, Komodo, Houdini, Fritz), üzenetküldő alkalmazások és botok szerepelnek.
- Beszédaktivitás és beszédfelismerés: A rendszer emberi beszédet keres a hangban, ami arra utalhat, hogy valaki segít a szobában. Ezután beszédfelismeréssel megpróbálja rögzíteni, mi hangzott el.
- Stressz- és érzelemelemzés: Egy konvolúciós neurális háló osztályozza az arckifejezéseket, és az arcpontokból számolt mérőszámokkal együtt stresszértéket ad. A versenybíró így a játszma kulcspillanataiban is láthatja, hogyan reagált a játékos.
- Jelenlét-ellenőrzés: Riasztás, ha eltűnik az arc, egynél több arc jelenik meg, vagy a játékos kapcsolata megszakad.
Minden riasztás pontos időbélyeget kap, és a hozzá tartozó kamera-, képernyő- és hangfelvételre mutat, így a versenybíró azonnal ellenőrizheti a bizonyítékot.
Webplatform és versenybírói felület. A SzuperChess weboldala Laravelben készült. A játékosok regisztrálnak, kitöltik sakkprofiljukat (FIDE-értékszám, klub, ország, becenév a versenyt rendező oldalakon), és jelentkeznek a Lichessen, a Chess.com-on vagy a Chess24-en futó versenyekre. Az adminisztrátorok egyetlen irányítópultról kezelik a versenyeket, a partnereket, a versenybírókat és a játékosokat. A versenybírók kifejezetten nekik tervezett nézetet kapnak. Ebben rácsban látják az élő játékosokat, mellette valós idejű riasztási listát, és bármelyik játékos kamera-, képernyő- és hangfelvételét szinkronban visszanézhetik. Az idővonalon megjelenő jelölőkkel egyből a kérdéses pillanathoz ugorhatnak. A videókat megjelölhetik látottként vagy későbbi megtekintésre, rögzíthetik az incidenseket, cseveghetnek a játékosokkal, közleményt küldhetnek, a verseny után pedig táblázatba exportálhatják az összes riasztást.
Kevesebb, de fontosabb riasztás. Az első éles versenyek megmutatták, hogy a nyers AI-kimenet könnyen elárasztja a versenybírókat. Az alapító tapasztalatai alapján a riasztási rendszert három súlyossági szint köré szerveztük át. A piros riasztások (például tiltott program a képernyőn, vagy ha a játékos több mint egy percig nem látszik) alapból megjelennek, a narancs és zöld riasztások szűrőkkel érhetők el. A versenybírók a komoly riasztások száma szerint rendezhetik a játékosokat, így a figyelmük oda irányul, ahol valóban szükség van rá.
Felhő és böngészős kliens. A második szakaszban a tárolást az AWS-re költöztettük. A felvételek rövid ideig érvényes, biztonságos linkeken keresztül kerülnek fel, versenyenként külön tárolóba, és a megőrzési idő lejártával automatikusan törlődnek, a GDPR előírásainak megfelelően. Emellett böngészőben futó WebRTC-klienst is fejlesztettünk, és beépítettük a SzuperChess weboldalába, így a játékosok telepítés nélkül is csatlakozhattak.
Termékből platform. 2021 elején a SzuperChess úgy döntött, hogy B2B modellre vált, és ugyanezt a technológiát más területekre is elviszi, például az online vizsgáztatásba és az e-sportba, Decoditive néven. Két architektúrát elemeztünk erre: szektoronként külön oldalakat (az úgynevezett „csáp” modellt), illetve egyetlen közös platformot szektorspecifikus beállításokkal. Összevetettük a kódminőséget, a skálázhatóságot, valamint a hosztolási és fejlesztési költségeket, és azt a megoldást javasoltuk, amely a cég terveihez illett.
Ezután úgy terveztük meg az adminfelületet, hogy minden munkamenethez külön lehessen beállítani az elemzőket, a riasztási küszöböket és a riasztási üzeneteket.
Beépített adatvédelem. Mivel a rendszer arcot és hangot rögzít, az adatvédelem az első naptól a tervezés része volt. A platform kezeli a hozzájárulásokat és a sütikre vonatkozó szabályzatot, fiók törlésekor anonimizálja a profilt, a felvételeket pedig automatikusan törli.
Együttműködés az alapítóval. A projekt teljes ideje alatt szoros kapcsolatban voltunk az ügyféllel, és úgy dolgoztunk, mintha a SzuperChess saját technológiai csapata lennénk. A megállapodott kereten túl folyamatosan javasoltunk fejlesztéseket és új funkciókat, és ezek közül sok bekerült a termékbe.