筆者は最近「マーベル・ライバルズ」にはまっている。このゲームの配信時、試合の勝敗数を画面に表示しているのだが、このカウンタは勝敗に応じて自動的に更新できるようにしてある。また、ゲームのマッチング待ち開始やマッチング完了もOBSに自動認識させて、自動的に配信レイアウトを変更している。
下記の動画はマーベル・ライバルズではなくOverwatch 2だが、実行していることはおおむね同じだ。
OW2を配信してる時、勝敗数のカウンタを自動で増やすようにしてみた。
加えて、マッチング待ちは雑談用レイアウトに、試合が始まるとゲーム用レイアウトに自動的に変更するよ。
さらに、今の戦績も声でアナウンスしてくれるpic.twitter.com/2XX93NmJKH
— 若杉|PC Watch編集長/配信修行僧/インプレスeスポーツ部部長 (@pcw_wakasugi)August 4, 2024
また、Elden Ringでは、自キャラが死んだことをOBSに自動認識させて、罰ゲームを実行させたりもしている。
Elden Ringで死ぬと、顔面めがけて汁が飛んでくる機能をOBSに実装しましたpic.twitter.com/0w8iMS9g4F
— 若杉|PC Watch編集長/配信修行僧/インプレスeスポーツ部部長 (@pcw_wakasugi)September 7, 2024
これらはいずれも、ゲーム画面の表示内容をOBSに画像解析させることで実現している。たとえば、マーベル・ライバルズやOverwatch 2では、勝利時に「VICTORY」という文字が、そしてElden Ringでは、キャラが死ぬと「You Died」という文字が表示される。これを認識した時に、特定のアクションが起きるように設定しているという具合だ。
今回はプラグインを用いてこれらを自動判定する方法を解説する。
「Advanced Scene Switcher」で映像のパターンマッチングをマクロ条件に設定筆者の実際のASSの設定内容
この勝敗などの判定、そして、それにもとづいたアクションの実行は「Advanced Scene Switcher」(以下、ASS)というプラグインで実現している。このプラグインも、以前に紹介した「Move」並みに膨大な機能を持っているので、すべてを解説することはできないが、目玉機能の1つである画像解析の部分に焦点を当てる。
ASSの利用にあたっては公式サイトに行き、「Go to download」を押してプラグインをダウンロードする。いくつかのファイルがあるが、Windowsなら「advanced-scene-switcher-x.xx.x-windows-x64-Installer.exe (x.xx.xはバージョン番号)」を選んで、実行すればインストールされる。
ASSの設定を行なう前に、一度ゲームを普通にプレイしているところをOBSで録画しておこう。今回は勝利画面をマクロ条件にするので、「VICTORY」など勝利画面が収まるようにする。そして、その動画を全画面再生し、勝利画面の瞬間のスクリーンショットを撮っておく。この画像が勝利判定の基準になる。
その画像をOBSで表示させるのだが、”配信と同じレイアウトで表示”させておく必要がある。ゲームが全画面表示(カメラ映像はゲーム画面上に重ねている)なら特に意識しなくていいが、下記の画像などのようにレイアウトで縮小させている場合は、そのゲーム画面に合わせて勝利画面の画像を表示させておく。
Overwatch 2の勝利判定に使うスクリーンショット
このスクリーンショットを実際の配信のゲーム画面と同じ場所に配置する
ASSをインストールしたらOBSを起動し、「ツール」から「高機能シーンスイッチャー」を選ぶ。ASSは、条件に応じて一連のアクションを実行するツールだ。このツールでは条件とアクションのセットを「マクロ」と呼んでいる。まず、左の「マクロ」と書かれたコラムの「+」を押してマクロを新規作成する。名称は「勝利」など分かりやすいものをつけよう。
ASSを開いたところ
続いて、「マクロの編集」コラムの上側でマクロ条件を定義する。「+」を押してみよう。マクロ条件の行が追加される。デフォルトでは「if」(~ならば)だが、「if not」(~でなければ)を指定することもできる。
そして、「シーン」と書かれたところをクリックすると、膨大な数の条件のリストが表示される。OBSの中で発生するイベントだけでなく、「このモニターが接続されたら」や「このUSB機器が接続されたら」、「VRのヘッドセットがここに置かれたら」などといった、OBSの範疇外のことまで条件として指定できるから驚きだ。今回使う条件は「動画」のみだが、これだけの種類の条件を指定できるということは、発想次第でさまざまな応用が可能ということが分かるだろう。
「if」の右隣で「動画」を選んだら、下の行で「シーン」「現在のシーン」「matches pattern」を選ぶ。これは、「現在のシーンがこれから選ぶ画像とパターンマッチングするかどうかを判定する」ということを意味する。
「if」の右隣で「動画」を選んだら、下の行で「シーン」「現在のシーン」「matches pattern」を選ぶ。
matches patternの横に「–パスを入力–」というのがあるが、これは無視して「Browse」を押す。続いて表示されるダイアログでは「スクリーンショットの作成」を選び、「victory」などのファイル名を付けて適切なフォルダに保存する。
「スクリーンショットの作成」を選ぶ
これで、現在のシーンのスクリーンショットが作成されるとともに、別ウィンドウで表示される。部分的にしか表示されていないので、ウィンドウの右端をドラッグして全体が見えるように拡大しよう。これが、画像解析で参照する大元になるのだが、常に全画面を解析するとCPU負荷が大きくなってしまう。
そこで、CPU負荷を最小限にするため、実際に参照し、判定の基準としたい部分のみを選択することができる。今回の例では判定したいのはゲーム画面に「VICTORY」が表示されたかどうかなので、この文字の領域だけをマウスでドラッグして範囲選択すればいいということだ。これでVICTORYの部分のみが切り出された画像が参照画像として保存される。
シーンのスクリーンショットが表示される
ウィンドウのサイズを大きくして全体が見えるようにしよう
判定の基準とする部分をマウスでドラッグして選択する
OKを押すと、選択範囲だけが画像として保存される
次に、「エリア内のみチェックを実施」にチェックを入れ「範囲指定」ボタンを押す。これも常に配信映像全体で画像解析をかけていると必要以上のCPU負荷が発生するので、チェックする範囲を限定するための設定だ。
「エリア内のみチェックを実施」にチェックを入れ「範囲指定」ボタンを押す
先ほどの参照画像の保存の時と似たウィンドウが表示されるが、こちらはライブの映像となる。ここでも、先ほどと同様にVICTORYの部分を範囲指定するのだが、今度は先ほどより少し広い範囲を選択するという点に留意しよう。具体的にはVICTORYの上下左右に数mm程度の余白ができるくらいだ。ここで選択した範囲が、1つ前の手順で選んだ範囲より狭いとパターンマッチングができないためだ。このウィンドウには「OK」ボタンはないので、そのまま閉じる。
すると、選択範囲が、X、Y、幅、高さという情報として自動的に入力される。ここで「ショーマッチ」を押してみよう。きちんと参照画像がパターンマッチングしていれば赤い線で囲まれている。もし、現在のマッチング値が「nan」になっていたら、範囲指定がうまくいっていない可能性が高い。大事なのは、”参照画像よりも、範囲指定の範囲が広く取られている”ことだ。
先ほどの画面と似ているが、こちらはライブのシーンプレビュー
先ほど作成したVICTORYの切り抜き画像に余白を持たせた範囲を指定する
これで、選択範囲に数値が入力される
「ショーマッチ」を押して、赤枠が出ていればパターンマッチング成功
これで勝利についての判定ができるようになったので、負けた場合の処理についても、「DEFEAT」などが表示された場面のスクリーンショットを撮り、上記の方法で新しいマクロ条件を作成する。Elden Ringで死んだ場合の処理なら「You Died」のスクリーンショットを基に同様にマクロ条件を作ればいい。
閾値とパターンマッチングのインターバルで微調整
基本的にはこれでマクロ条件は設定完了なのだが、パターンマッチングがうまく機能しないこともある。これは、ASSでやっているのが文字認識ではなく、文字の周囲も含めた画像認識だからだ。今回例として使っているOverwatch 2の場合だと、実際のゲーム画面ではVICTORYの文字の背景はマップごとに変わるし、VICTORYの文字自体にもアニメーションで装飾が入ったり、少しずつ大きくなるというように変化が生じる。そのため、判定基準として使う参照画像と実際のゲーム画面とが100%一致することは少ないのだ。
そこで、画像のパターンマッチングでは「閾値」をうまく指定してやる必要がある。デフォルトでは「0.999」になっている。これはパターンマッチングの度合いが99.9%以上ならマクロを実行するという意味だ。もし、実際にゲームをプレイしてみて、VICTORYが表示されたのに、この後説明するマクロアクションが作動しない場合は、この閾値を下げてやろう。ただ、下げすぎると今度は、違う場面なのにパターンマッチングしたと誤認識するようになる。
筆者が試した限りでは、パターンマッチングモードがデフォルトの「相互相関」だとうまい閾値を見つけられなかったので、モードを「相関係数」に変えた上で、閾値を0.6にすると誤認識や誤作動が起きなくなった。ただし、これは実際にプレイするゲーム(パターンマッチングする映像)によって変わってくるため、試行錯誤するしかない
実際にゲームをプレイしてパターンマッチングの判定がうまくいかない場合は、閾値を調整したり、パターンマッチングモードを相互相関から相関係数に変えたりしてみよう
もう1つの調整箇所として、マクロの名前の行の右端にある歯車アイコンを押して、「Check conditions of the currently selected macro at custom interval」にチェックを入れて、パターンマッチングを行なう間隔を指定するのもアリだ。
歯車アイコンを押すと、マクロ個別の詳細な挙動を指定できる
ASSの全般タブの「イベント条件を確認する頻度」として、デフォルトで「300ms」が指定されている。これは、すべてのマクロ条件の確認を0.3秒おきに実施するということだ。しかし、画面にVICTORYなどの参照画面が表示される時間が短いと、パターンマッチングの実行タイミングと、参照画面の表示タイミングが合わない場合が発生する。
「全般」タブを開いたところ。デフォルトですべてのマクロ条件は0.3秒おきに処理される
そういう時には、このCustom intervalを0.1秒などにして、チェック間隔を狭めてやればいい。全般の「イベント条件を確認する頻度」はすべてのマクロに適用されるが、Custom intervalにチェックを入れると、そのマクロは個別の頻度でチェックが実施される。なお、これも時間を小さくし過ぎるとCPU負荷が高くなりすぎるので注意が必要だ。
マクロ条件の判定を行なう間隔はマクロごとにも設定できるカウンタの処理ルーチンを作成
これで、「現在のシーンの指定範囲にVICTORYの文字が表示されたのを認識したら」というマクロ条件を作成できた。後は、その下の「マクロアクション」のエリアで「+」を押して、OBSで実行する一連の動作を作成していく。ここでは、勝利するたびに、画面に表示した勝利数のカウンタを増やすルーチンを紹介する。
マクロアクションとして「変数」を選び、下の行では「インクリメント(増加)を選択する。変数の下の行が表示されていなかったら、「変数」の左の三角ボタンを押して、エリアを展開しよう。
「–変数を選択–」の三角ボタンを押して「新しい変数の追加」を選ぶ。ウィンドウが出るので、「victory_count」など変数の名前を付け、「セーブ/ロード動作」は「値に設定」を選び、その下の欄に「0」を入れ、「OK」を押す。最後に、変数名の右の数値を「1.00」にする。
マクロアクションとして「変数」を選び、下の行では「インクリメント(増加)を選択し、「–変数を選択–」の三角ボタンを押して「新しい変数の追加」を選ぶ
このウィンドウが表示されるので
「victory_count」など変数の名前を付け、「セーブ/ロード動作」は「値に設定」を選び、その下の欄に「0」を入れ、「OK」を押す
これで、マクロが実行(勝利判定など)されるたびに、「victory_count」という変数が1ずつ増えていく。また、OBSを再起動するたびにカウンタは「0」にリセットされる。
続いて、この変数をOBSの画面上に表示させる。いったんASSの画面を閉じ、「ソース」の「+」を押して、「テキスト(GDI+)」を選ぶ。名前は変数に合わせて「勝利数」などをつける。いったんテキスト欄に「0」を入力して、フォントやサイズ、色を調整しよう。
ツールからASSを再度開き、先ほどのマクロのマクロアクションで「+」を押し、「Source」を選ぶ。その下は、「設定を行なう」「勝利数(さきほどのテキストソース)」「テキスト(テキスト)」「固定値に設定」を選んで、最後の欄には「${victory_count}」と入力する。これにより、マクロを実行すると、先ほどのテキストソースの内容に変数の値が代入される。つまり、勝利するたびに勝利数が自動的に増えていく。
味気ない画面だが、マクロが実行されるたびにカウンタの数字が増える
ただし、これだと次回配信時に前回の勝利数が表示される。OBSが起動するたびに変数の値は0に戻っているのだが、それをテキストソースに代入する処理がないからだ。ASSの「変数」タブで変数の現在値は変更できるので、配信開始前に手動で0に戻してもいいが面倒だろう。
これについては、いくつか対応方法があるが、たとえば、マクロを新規に作成し、マクロ条件は「配信」「Streaming starting」を選び、マクロアクションとして「Source」「設定を行なう」「勝利数」「テキスト(テキスト)」「固定値に設定」「0」とする。これで、配信開始時に勝利数のテキストの内容が自動的に0になる。
また、勝利や敗北の数字だけでは意味が通じないので、その横に「勝利」「敗北」といったテキストソースも追加して表示するようにしよう。
基本的にはこれでゲームで勝利するたびに、自動的に画面上に表示した勝利カウントが増えていくマクロが完成した。ただ、万が一誤認識した場合に、カウントを1減らす処理もできた方がいい。これもやり方はいろいろあるが、マクロ条件で「ホットキー」を選び、ホットキーが押されたら、変数を「デクリメント(減少)」するというマクロを作るといった方法がある。
ちなみに、筆者は、マクロアクションについてはホットキーを1つ指定してあるだけで、そのホットキーをトリガーにしてStreamer.botという外部ツールのアクションを実行させることで勝利数を記録したテキストファイルを読み出し、カウントを1増やして上書き保存している。
また、Stream Deckの「Stream Count」というプラグインを使って、Stream Deckのボタンを押すとカウントを増やし、長押しするとカウントが減り、さらに長押しすると0にリセットできるようにしてある。ASSの扱いに慣れたら、自分が運用しやすいカウンタの処理方法を考えてみるといいだろう。
筆者はStream Deckも活用し、カウンタを手動でも変更できるようにしているマクロアクションはさまざまなアクションを指定可能
今回はASSのマクロアクションとしてカウンタの処理方法を解説したが、OBSのソースやフィルタから、クリップボード操作、Websocketの実行など多種多様なことを実行できる。また、アクションは1つではなく、複数をシリアルで実行できるので、勝利数を増やした後に、ファンファーレの音を鳴らすなどといったこともできる。
実際、筆者がElden Ringで死んだ際に汁が顔面に飛んでくる罰ゲームについては、Websocketを使い、Switchbot HubのAPIを叩くことで、Switchbotの物理スイッチをネット経由で押せるようにしてある。
このほかにも、「音声」というマクロアクションで、OBSの標準機能ではできない音量のフェードアウト、フェードインなどもできるし、以前の記事で紹介したMoveフィルタと連携させると、多様な演出を加えることもできる。マクロ条件も複数をORやANDで設定できる。画像のパターンマッチング以外のマクロ条件もうまく組み合わせて、いろいろな効果に挑戦してみよう。