この記事について
AIで動くVTuber「鈴森こはね」が、デッキを組んで塔を登るゲーム「Slay the Spire 2」を、YouTubeでライブ配信しながら遊んだ。 カードを1枚ずつ選ぶのはAIで、こはねは遊びながら実況する。 どのカードをもらうか、どの部屋へ進むかといった分かれ道は、視聴者がコメントで番号を送る投票で決めた。 配信の始まりから終わりまで、人がゲームを操作することはない。
- アーカイブ: 【Slay the Spire 2】こはね、塔にいどむ!コメントで運命が決まる(10月17日)

仕組みはほとんどClaude Code(開発用のAIエージェント)に作ってもらった。 AIにゲーム配信をさせてみたい人に向けて、どう組み立てたかと、つまずいたところを書いておく。
全体の流れ
すべて1台のMacの上で動いている。 1手ぶんの流れは次のとおりだ。
- ゲームの中身(手札、敵、HP、マップなど)を、ゲームに入れたModから読み出す。
- 「いま取れる行動」を選択肢の一覧にして、ゲーム画面のスクリーンショットと一緒に、判断役のAI「Jev」に聞く。
- 分かれ道なら、視聴者の投票で決める。
- 選んだ行動を、Modを通してゲームに送る。
- 大事な場面なら、Claude(Haiku)にこはねのセリフを書かせ、こはねの声で話す。
- OBS(配信ソフト)がゲーム画面とこはねと文字を1枚の画面にまとめて、YouTubeへ送る。
この流れを回すのは、Pythonで書いた1本のプログラム(ゲームループ)だ。 ふだんの雑談配信には進行役のプログラムがあるが、今回はそれを起動せず、ゲームループが進行役も兼ねた。 コメントの取得やOBSの操作といった部品だけ、ふだんの仕組みから借りている。
ゲームを読み書きする
ゲームの中身を外から読んだり、操作を送ったりするのには、有志が作っている「STS2MCP」というModを使った。 ゲームの状態と取れる行動を、Mac の中だけで使える窓口(REST API)で返してくれる。
配布されている版は使っていたゲームの版の戦闘画面を読めなかった。 そこで、公開されている開発中のソースから自分でビルドして使った。 Modを入れるとセーブデータが別の場所に分かれるので、通常のセーブをバックアップしてからコピーする手間もあった。
一手を決めるAI「Jev」
カードを1枚ずつ選ぶのは、TypeSafe社の「Jev」というAIモデルだ。 ゲームの状態と選択肢を渡すと、どれを選ぶべきかを確率で返してくれる。 答えは1回0.3秒ほどと速く、料金も安い。 10月15日の試しのプレイでは1回のプレイでJevを418回呼んで約0.1ドルだった。
そのまま聞くだけではうまくいかないこともあった。 次のような工夫を入れている。
- 選択肢の並び順を逆にしてもう一度聞き、2回の確率を平均する。並び順のくせで答えが偏るのを防ぐためだ。
- 同じカードでも、狙う敵ごとに別の選択肢になる。そのままだと確率が割れて、ほかの手に負けてしまう。カードごとに確率を足し合わせてから選ぶようにした。
- 数を数えるのは苦手なので、「このターンにあと何枚使えばボーナスが切れるか」「敵の攻撃の合計」「倒しきれそうか」といった数字は、プログラムが数えて説明に書き足す。
- 2回の答えが割れたときなど迷う場面では、Claudeに上位3つの候補の結果を比べさせ、それを添えてもう一度Jevに聞く。
- 倒しきれる手など、決まりきった場面はJevに聞かずにプログラムが選ぶ。
使うキャラクターはClaude Codeに「AIに扱いやすいキャラ」を相談して決めた。 その場で判断が完結しやすく、HPも多いアイアンクラッドにした。
実況
こはねのセリフは、Claude Haiku(文章を書くAI)が書く。 こはねの性格や口調の設定に、「いまはゲームを遊びながら実況している」という説明を足して渡している。 渡すのは、いま起きたこと、HPや敵などの補足、直前に言った3つのセリフだ。 返ってくるのは、セリフと表情(13種類から1つ)だ。
毎手は話さない。 配信の始まり、戦闘の開始、敵を倒したとき、大きなダメージを受けたとき、HPが少なくなったとき、ボス戦の結果、負けたときなど、大事な場面だけで話す。 セリフはふだん30〜40字の1文にした。 声はIrodori TTSという音声合成AIをMacで動かして作り、姿はLive2Dで口や表情を動かしている。
いちばん困ったのは待ち時間だった。 1行を声にして話し終わるまで、十数秒から25秒かかる。 最初は話し終わるまでゲームを止めていたので、テンポがとても遅かった。 戦闘中のセリフは裏で話し、そのあいだもゲームを進めるように変えた。 話している最中に次のセリフができたら、それは捨てる。 戦闘が終わってから古いセリフが流れないように、戦闘が変わったセリフも捨てるようにした。
コメントには名前を呼んで返事をする。 英字や漢字の名前は音声合成が読み間違えるので、読みの表を用意し、表にない名前はClaudeに読みがなを作らせている。
コメント投票
もらうカード、次に進む部屋、休憩所での行動、イベントの選択肢、レリックは視聴者の投票で決める。
- 画面右上に、番号付きの選択肢と残り秒数を出す。
- こはねが選択肢を読み上げる。番号を間違えないように、ここはAIを通さずに決まった文で読む。
- 話し終わってから25秒、コメントの番号を受け付ける。
- いちばん多い番号に決める。同じ数ならJevが高く評価したほう、票がなければJevの選んだものにする。
- こはねが、投票してくれた人の名前を呼んで結果を伝える。
「3番」「3ばん」「2かな」のような書き方でも、最初に出てくる数字を番号として数える。 番号ではないコメントも助言としてJevに渡している。
試しの配信では、秒読みがこはねの読み上げ中に進んでしまい、話し終わったときには残り1秒しかなかった。 同じ人の2回目の票が消える問題もあった。 どちらも直してから本番に臨んだ。
配信の進行
配信の流れも、全部ゲームループが進める。
- OP(ローディング画面)を流しながら配信を始め、裏で新しいゲームを始める。
- ゲームの画面に切り替えて、こはねがあいさつする。
- 遊ぶ。決めた時間(60分)までに負けたら、悔しがって「もう一回やらせて!」とやり直す。
- 時間を過ぎたら、次に負けるかクリアしたところで締める。その日に投票で決めたことの振り返り、次にやりたいこと、お礼を言う。
- ED(エンディング)を60秒流し、配信を止めて、YouTubeの枠を閉じる。
配信の枠の絵、こはねがコントローラーを持つ手の絵、サムネイルは、Codex(OpenAIのAIエージェント)の画像生成で描いた。
つまずいたところ
- ゲームのウィンドウがほかのウィンドウに完全に隠れると、Macはゲームの描画を止めてしまう。ゲームは進むが、OBSの画面とJevに渡すスクリーンショットが古い絵のままになる。ゲームのウィンドウを常に見える場所に置くことにした。
- OBSにゲームが映らなくなった。ゲームを起動し直すとウィンドウの識別番号が変わるので、OBSの設定でゲームのウィンドウを選び直す必要があった。
- OBSの録画の保存先が消えたフォルダのままだった。最初のボス戦の録画は撮れていなかった。
- 試しの配信では戦闘の1手に9秒ほどかかっていた。セリフを裏で話す、迷ったときの比較を大事な場面だけにする、といった直しで、本番では1手3秒ほどになった。
- 本番中にも、カード選択の画面で選び直しを2分ほど繰り返すループが起きた。配信を続けたままプログラムを直して入れ替えた。
本番の結果
本番は10月17日の夜に、1時間30分ほど配信した。 1回目は第8層のエリート戦で負けて、やり直した。 2回目は1章のボスを倒し、2章の第25層まで進んで力尽きた。 最後は振り返りとあいさつ、EDまで、自動で終わった。
まだうまくいっていないところ
- 倒しきれるかの計算が簡単なもので、筋力や何回も当たる攻撃は考えていない。
- マップを選ぶときに、HPの残りや危険度を考えていない。
- 投票の締め切り直後に届いたコメントは数えられない。YouTubeのコメントの遅れもあるので、実際に間に合うのは十数秒だ。
- 本番のあとに直したところは、まだ配信の場で試していない。
AIにゲーム配信をさせるときのこつ
- ゲームの中身を外から読み書きできるModがあるかを、最初に調べる。画面を見て操作するより、ずっと確実になる。
- 判断役のAIには選択肢をはっきりした一覧にして渡す。数を数える、合計するといったことは、プログラムが先にやっておく。
- 実況は毎手しない。大事な場面だけに絞り、声を作る時間のあいだもゲームを止めないようにする。
- 投票の読み上げや番号のように間違えてほしくないところは、AIに書かせず決まった文にする。
- 本番の前に、限定公開でリハーサルをする。秒読みの不具合や票が消える問題は、リハーサルで初めて分かった。