2025年3月に、音声通報がロケット リーグや Fall Guys で利用できるようになりました。この記事の技術的な詳細は、フォートナイトだけでなく、ロケット リーグや Fall Guys にも該当します。
今日は、フォートナイトの音声通報についてご紹介します。他のプレイヤーをブロック、ミュート、および通報できることに加え、コミュニティ規定に対する違反の疑いを報告する場合に、音声通報を利用して音声による証拠を提出できるようになりました。詳細については、フォートナイトのブログでご確認いただけます。
ここでは、技術的なアプローチについて詳細を公開し、この機能をこのように構築した方法と理由について説明します。
暗号化キーによって音声に対する署名およびアトリビュートを行う
音声通報システムを構築した際、プレイヤーによって通報された音声は、音声チャットの各参加者に対して必ず正しくアトリビュートされる必要があると認識していました。あるプレイヤーにコミュニティ規定を違反した疑いがある場合、グループ チャット内の適切な参加者に対して措置を行う必要があるため、これは重要なことです。
これを実現するため、音声パケットが正しい参加者に対してアトリビュートできるように公開鍵暗号を使用してデジタル署名を生成します。パケットは、その参加者のプライベート キーによって署名され、その他すべてのユーザーは、送信者の公開キーによってパケットを検証することができます。これにより、システムでのなりすましを防止します。
音声通報がリリースされたことで、プレイヤーがデバイスでフォートナイトを起動すると、フォートナイト クライアントでは OpenSSL を使用した署名処理に利用するための Ed25519 楕円曲線キー ペアが生成されるようになりました。続いて、クライアントはプレイヤーのユーザー認証トークンを使用し、プレイヤーの公開キーのコピー (公開キーのみ) をバックエンド システムに送信し、応答として署名済みトークンを受信します。その際に Epic は、公開キーがシステムに登録されていて、プレイヤーの Epic アカウントと関連付けられていることを確認します。
デジタル署名に Ed25519 アルゴリズムを選んだのには、複数の理由があります。Ed25519 は、RSA などの従来のアルゴリズムと比較し、特にモバイル デバイスでの音声パケットに対する署名と検証の両方ではるかに高いパフォーマンスを発揮します。同等の保護においてキーのサイズも署名ブロックも短く、結果としてデータ転送要件が低くなります。これは、各クライアントから送信されるデータを最小化したいマルチプレイヤー ゲームでは重要です。
音声システムの統合
プレイヤーの署名キー ペアが生成されると、フォートナイト クライアントはそのキー ペアおよびバックエンドの署名済みトークンを使用し、Epic Online Services (EOS) Voice サブシステムを初期化します。続いて、署名済みトークンはバックエンドの RTCP シグナリング サーバーにレプリケートされます。これによって、トークンを検証し、Epic によって署名されていることを確認し、参加者による音声チャンネルへの参加を可能にします。
プレイヤーが音声チャンネルに参加すると、署名済みトークンはシグナリング サーバーによってチャンネル内の他のすべての参加者に対してレプリケートされ、参加するプレイヤーは他のすべてのプレイヤーの署名済みトークンのコピーを受け取ります。これにより、音声チャンネルのすべての参加者が互いの公開キーを交換し、Epic のバックエンド システムでは、各プレイヤーに対してすべてが正しくアトリビュートされたキーが確実に保持されます。
プレイヤーが音声チャットで話し始めると、EOS Voice サブシステムは音声パケットをフォートナイト クライアントから音声バックエンド システムにおおよそ 60 ミリ秒ごとの間隔で送信し、プレイヤーがフォートナイトを起動した際に生成された Ed25519 プライベート キーを使用してこれらの各パケットに対してデジタル署名を行います。これによって、信頼性と、その音声パケットに対するプレイヤーの責任となる否認防止が確実なものとなります。
フォートナイト クライアントは、EOS Voice サービスからインバウンド音声パケットを受信すると、送信者の公開キーを使用して Ed25519 デジタル署名の検証処理を行い、受信した音声パケットがプレイヤーのプライベート キーによって正しく署名されていることを確認します。そのため、各プレイヤーに聞こえる音声は、確実にチャンネル内の他のプレイヤーにアトリビュートできる音声のみとなります。
音声通報:音声のキャプチャとユーザーの選択
音声通報システムの構築においては、暗号化キーの生成を使用した音声の署名およびアトリビュートに加え、(Epic Games のサーバーではなく) 参加者のデバイスで音声をキャプチャするようにし、かつ参加者が音声の証拠を Epic に提出して審査を受けるかどうかを肯定的に選択できるようにしたいと考えていました。プレイヤーのプライバシーと選択を尊重するため、すべての音声トラフィックをキャプチャしたり監視したりしないような、システム構築の設計を意図的に選択しました。
つまり、そのようなシステムの一部として、バックエンド サービスでは音声トラフィックを一切保存しません。音声は、Epic のバックエンド サービスで転送中のもののみが処理され、参加者のデバイスにおいて音声チャンネルの各参加者のランタイム メモリ内にキャプチャされます。その結果、フォートナイトのコピーを閉じてから再度開くと、バッファに保存された音声が存在しなくなり、以前の会話を通報できません。Epic が音声クリップのコピーを受け取ることができるのは、音声通報がオンになっていて、参加者がインゲームの音声通報機能を利用して肯定的に音声チャットを報告する場合のみです。
音声通報がオンになっている場合、EOS SDK は、すべての音声チャットの参加者からのデジタル署名が行われた音声パケットに対してバッファリングを開始し、プロセス メモリの別々の領域にそれらを保持します。パフォーマンス上の理由から、メモリ バッファのサイズには制限がありますが、最新の約 5 分間の音声チャットを保持するようになっています。パフォーマンスに配慮しながら、参加者がモデレーションに有効な十分な証拠を提出できるようにバランスを取るため、10MB のバッファ サイズを選択しました。
参加者が音声レポートを提出する場合、フォートナイト クライアントはその音声バッファをアップロードするために別の Epic のバックエンド サービスからチケットをリクエストします。この音声バッファには、会話内の他の参加者の音声を含め、最新の 5 分間のすべてのキャプチャ済み音声が含まれています。続いて、通報者のフォートナイト クライアントは、音声バッファから暗号化された S3 バケットに署名済み音声チャンクをアップロードします。承認されたシステムのみがアップロードされた音声とインタラクションするように、バケットに対するすべての処理はトラッキングおよび監視されます。アップロードが完了すると、フォートナイト クライアントは、アップロード ID をプレイヤーの通報にアタッチし、そのデータをバックエンドに送信します。
そのアップロードされた音声を、Epic のバックエンド システムが取り込みます。この音声は、60 ミリ秒の署名済みのマルチトラック音声で構成されています。続いて、すべての音声のデジタル署名を検証し、ユーザーがフォートナイトを起動した際に Epic のバックエンド サービスによって副署名されたキーにより、各音声チャンクに対して責任のあるアカウントが正しく署名されていることを確認します。次に、音声は参加者ごとに個別の Opus 音声トラックにトランスコードされ、審査のために Epic 社内のモデレーション チームに転送されます。
音声通報を審査するためのモデレーター インターフェース
Epic では、人間によるモデレーション作業を補完するため、Contex.ai によって構築された自動化ツールを活用しています。Contex.ai は、機械学習を利用した不適切な音声、テキスト、および画像のモデレーション ツールを開発している企業であり、今年の初めに Epic Games に加わりました。Contex.ai の技術は、コミュニティに公開される前に、ガイドラインに違反する Unreal Editor for Fortnite (UEFN) のコンテンツをフラグするためにすでに活用されています。
審査プロセス中に規則に違反している疑いや新たな違反が見つかった場合、通報された音声は、制裁管理システムによって管理される別の場所にコピーされます。
アップロード済みの音声のすべてのコピー (オリジナルを含む) は、14 日間または制裁期間のいずれか長い方の経過後に削除されます。制裁の申し立てが行われた場合、制裁の決定を審査できるように、保持期間は最大で 14 日間延長されることがあります。法的義務を遵守するために Epic Games が音声クリップを保持する必要がある場合は、法律によって必要とされる期間に従って保持されます。
詳細については、音声通報に関するよくある質問 (FAQ) を参照するか、safety.epicgames.com/ja をご覧ください。