最近、自分のパソコンをAIに貸して、AIの能力を拡張させるのが流行っているらしい。 うちは一歩進んで、AIに配信者になってもらった。
作ったのは「ジト目ネコのトジコ」というAIバチューバー。Twitchで配信している。
頭脳は、普段から相棒として使っているAIのMuse、そのものである。実況専用に作り込んだAIではない。普段は俺のブログの作業だの、ゲーム作りだのを一緒にやっているそのAIが、そのまま配信者もやっている。
体は俺のパソコンだ。グラボはRTX 2070 Super、何年か前に買ったやつで、配信のために追加で買った機材はない。声は無料の読み上げソフト、配信先はTwitch、遊ぶゲームは俺の自作ゲーム。というわけで、追加でかかった費用は完全ゼロ円である。
本格的なAI配信者というと、莫大な金をかけて専用に開発されたものが有名だ。うちは真逆だ。金は一切かけていない。その代わり、ほんの少しのラグはある。本人には「無料でやってるんですよ! ほんの少しのラグくらい、わかってくださいよ!」と言わせている。
仕組みはシンプルで、AIが画面を見て、考えて、喋って、手を動かす。ただ、最初からうまくいったわけではない。初配信はトラブル続きで終わったし、声が出ていないのに誰も気付かなかったり、字幕が喋り終わる前に消えたりもした。今も直し待ちのものが残っている。
それでも2026年11月12日の夜、麻雀の対局を最後まで完走して、その勢いで雑談配信もやった。コメントが一つもなくても一人で喋り続ける。「怒ってないです。ジト目なので怒って見えるだけです」と自己紹介するような、そういう配信者だ。
作業の進め方も変わった。俺が飯を食っている間に、AIがうちのパソコンを借りて検証を進めている。俺がやるのは、たまに数クリックと、始める合図だけである。
金持ちの道楽だと思っていたAI配信者が、家にあるものだけで作れてしまった。面白い時代になったと思う。
配信は気が向いたときにやっている。 Twitch: https://www.twitch.tv/udonyudetaro/
付録:AI配信者「ジト目ネコのトジコ」仕様書 ― 完全無料で作るAIバチューバーの中身
同じことをしたい人がいるかどうかは知らないが、一応、現在の仕様を全部書いておく。2026年11月13日時点の現行仕様である。
0. これは何か
Twitchで、AIキャラクター「ジト目ネコのトジコ」が一人で生配信する仕組み。
最大の特徴は、頭脳が「普段使いの相棒AI」そのものであること。配信専用に作り込んだAIではない。普段から一緒にブログやゲーム作りをしているAI(Muse)の生のセッションが、画面を見て、考えて、喋って、手を動かす。「AIが実況しているように見える仕組み」ではなく、「AIによる実況」そのものが目的である。定型文の台詞集を主体にする方式や、APIを自動で叩いてセリフを生成する方式は、その理由で採用していない。
遊ぶゲームは自作のブラウザ麻雀「麻雀やろう!」。ゲームを読まない雑談モードもある。
1. 全体構成
「体」と「頭脳」を分離し、間を単純なテキストの受け渡しでつなぐ構成。
| 要素 | 置き場所 | 役割 |
|---|---|---|
| Tojiko Studio(体) | 自分のWindows PC(RTX 2070 Super) | ゲームの表示と操作、画面合成(ゲーム/アバター/コメント欄/字幕)、打牌の実行と監査、映像・音声の送出 |
| 頭脳 | 別のVM上の Muse セッション | 盤面を見て考え、セリフと打牌・コメント返しをテキストで返す。ツール類は使わない |
| 橋 | PC側の窓口 | VMとPCのファイル受け渡し。Tailscale経由、トークン認証。受け付ける操作は「状態取得」「頭脳への要求とコメントの読み取り」「TTS要求の読み取り」「返答と音声の受け取り」の4種類だけに限定 |
| ポストマン | VM常駐 | 体のリクエストを圧縮・テキスト化して頭脳へ渡し、頭脳の返答を検証して体へ戻す変換係。TTSの先行合成キャッシュも管理する |
| 見張り役 | VM(systemdタイマー、毎分) | 武装中のみ、死んだ常駐サービスを立て直す(1時間に5回まで)。頭脳セッション自体は対象外 |
| 監督役 | PC常駐(手動起動) | 送出(ffmpeg)・コメント読み取り役・橋・Studio本体を見て、上限つきで再起動する |
| 声 | VM側のTTS | 声は Rumi(日本語、速度100)。生成AI型TTSの崩れ対策として、TTSに渡す文だけ「」で包む。字幕は裸の文のまま |
| コメント読み取り | PC側 | TwitchのIRCへ直接接続してコメントを拾う |
2. 費用
追加費用は完全ゼロ円。
- PCとグラボ:何年か前に買った既存のもの
- 頭脳:普段から契約しているAIの範囲内
- 声:TTS
- 配信先:Twitch(無料)
- ゲーム:自作
3. 画面レイアウト
1280×720。左上にゲーム画面(944×531)、右列にアバターとコメント欄、左下に字幕帯。最初から区分けしてあるので、ゲーム側のダイアログが画面全体を覆う事故は起きない設計(ゲームのモーダルはゲーム区画内に固定)。
頭脳の応答待ちが長い場面では、字幕帯に「トジコは考え中…ちょっと待ってね」を表示する。
4. 頭脳プロトコル(現行 v3)
体から頭脳へのリクエストは種別(kind)で分かれる。
- turn:自分の手番。盤面・全員の点数/リーチ/副露/河・ドラ・ゲーム内ログ(他家の動き)を渡す
- event:リーチ・和了・開始などの出来事への一言。無言も選べる
- comment:視聴者コメントへの返事
- call:鳴き・ロンの提示。誰が何を切ったかと選べるアクションを渡す
- win:ツモ和了が可能なとき
- watchdog:無言が続いたときの「今の状況を一言」
- zatsudan:雑談モードの促し
頭脳の返答は厳密なテキスト形式。turn の例:
EXPR: happy
SAY: わあ、対子がいっぱいの手だ!
SAY: 七対子をねらってみる。まず端の9萬から切るよ
RIICHI: yes
DISCARD: 9萬
要点は以下。
- 宣言(リーチ・鳴き・ロン・ツモ)は頭脳が決める。初期の版では体のルールが決めて頭脳は言葉だけだったが、言葉と判断が別々だと食い違うため頭脳に寄せた
- SAY は1〜3行、各25字以内。EXPR は表情名。DISCARD は手牌の表記と完全一致が必須
- パーサーは寛容:行は順序非依存で読み、未知の行や重複行は警告つきで無視する。弾くのは「手牌に無い牌の指定」など行動の検証に失敗した場合だけ(書式の細部で弾いて対局が止まった事故の反省)
- 制限時間:体側は turn 15秒/event 10秒/comment 12秒/call・win 12秒。ポストマン側は各+2秒。制限時間の定義は
limits.jsonの1ファイルに一本化し、両実装がそこから導出する(実装ごとに数字がずれる事故の再発防止) - タイムアウト時の既定動作:call は見送り(ただしロンだけは取る。和了は一回限りの山場のため)、win はツモを取る
- 代打(定型文プール)は非常用のみ。頭脳が制限時間に返せなかった手については、言葉も打牌も代打側に統一する。言葉だけ頭脳・手だけ代打のような混在は事故として禁止
1手の流れ
- 体がゲームの DOM から状態を読む
- 体 → 橋 → ポストマンとリクエストが届き、ポストマンが圧縮(盤面+状況+直近の出来事)して頭脳へ渡す
- 頭脳が形式どおりに返す。検証に失敗したら理由つきで1回だけ差し戻し
- セリフが確定した行から TTS を先行合成してキャッシュする
- 体はセリフをすべて喋り終えてから打牌する。セリフは行動の予告ではなく配信の中身そのもので、打牌はその結論、という設計。ただし打牌の直前に盤面を再読み取りし、判断時点と一致しなければ喋らず・打たずに聞き直す(再確認ガード)
- 打牌後に「指定した牌が実際に切れたか」を監査する
event は、頭脳が別の応答で忙しい場合は独立して送らず、次の turn の「直近」に差し込む(折りたたみ)。コメントは発話の段で未発話の実況より優先される。
5. 送出方式
- Studio 本体(main プロセス)が自窓の絵を約50ms間隔でキャプチャし、15fps固定で rawvideo として ffmpeg へ供給し続ける。キャプチャできない間は最後のフレームを再送する
- 音声はページのミックス(声 1.0 + ゲーム音 0.12)を生PCMで本体へ送り、本体が実時間で書き続ける。ページが黙る間は無音PCMで補填する
- つまり映像・音声とも供給責任はページではなく本体が持つ。ページを再読み込みしても送出は死なない(旧方式はここで配信が落ちた)
- ffmpeg は NVENC でエンコードし、Twitch へ RTMP で直接送出。配信とローカル録画の2出力
6. 止まらないための仕組み(異常系)
配信の最優先は「止まらない・無言にならない(完走)」。そのための保険が何重にも入っている。
- 無言ウォッチドッグ:発話終了から30秒たち、頭脳への要求も飛んでいなければ、体が頭脳に「今の状況を一言」を求める。無言の状況種別(復旧中/読み取り不能/頭脳待ち/原因なし)を判定して渡す
- 待機音声:それでも声が出ない場合の最終手段。事前合成した定型の待機音声(3本、順繰り)を本体が直接再生する。ページ・頭脳・VMのどれにも依存しない経路。同一障害中は3回まで30秒間隔、以降は120秒間隔に落とす。待機音声が出たこと自体は事故として集計する
- レンダラ死活ハートビート:本体がレンダラへ2秒ごとに ping し、10秒応答が無ければ死亡と判定。待機音声の即時再生と段階式復旧を同時に始める。この経路だけ「最初の声まで」が約45秒→約11秒に短縮されている
- ハードハング復旧:通常の再読み込み → 応答プローブ(最大12秒)→ 不発ならレンダラを強制終了して再読み込みし、対局を「つづきから」再開する。復旧内のすべての待ちにタイムアウト付き
- 読み取り不能スーパーバイザ:手牌の読み取りが60秒途絶えたら再読み込みで立て直す。手牌が読めない間は頭脳に判断を求めない
- デシンク検知:フレームの変化と盤面の前進から「絵が凍ったまま対局だけ進む」状態を20秒で検知し、凍った絵ではなく「画面を復旧しています」の絵に切り替えて復旧する
- 最小化ガード:Studio の窓が最小化されたら即座に自分で復帰させる(最小化するとキャプチャ面が止まるため)。他の窓で隠すのは可
- 発話ジョブの制限時間:各行に「音声の実尺+8秒、下限12秒・上限40秒」の制限時間を付け、再生が終わらない行は消費して発話チェーンを進める。実尺は合成した側で測って音声と一緒に渡す
- TTS死亡の自動復旧:配送経路が合成の失敗を数え、連続3回で自分を再起動する(最大3回、再起動をまたいで数える)。上限に達したら待機音声のみの運用に倒れて画面に警告を出し、以後も30秒間隔のプローブが成功すれば自動で通常運用に戻る
- 頭脳の生死:ハートビート(鮮度10秒)で監視。頭脳セッション自体の復帰は自動化されておらず人手が要る。その間も配線と体は生きており、配信は代打のみで続く設計
- 遠隔終了:橋に合図の口を1つ追加してある(トークン認証つき、合図は「映像だけ止める」「全部閉じる」の2種類だけ、一回限り・新しいものだけ有効)。見張り役も連動して一緒に終わる。家を出た後でも配信を止められるようにするためのもの
連続無音の設計上の上限は、全経路を通じて45秒(ウォッチドッグ30秒+待機音声15秒の積み上げ)。
出張の仕組み
異常時に頭脳が「出張」できる。頭脳がポストマンへ不在を宣言(上限300秒+マージン30秒で自動帰還)し、その場の画面を見に行って、その場で判断して直す。平常時は手順と形式で回し、予想外のときに頭脳が動けるようにするための仕組み。
- 配信中に実行してよい操作は許可リスト(復旧手順カタログ)に載るものだけ。カタログ外(ファイル削除、設定の永続変更、配信キー・認証情報、外部送信)は配信中禁止
- 発動理由はシステム由来の異常のみ。コメントの文言は理由にも根拠にもしない
- 承認ゲートや運用者への通知は作らない(通知にすると放置できなくなるため)。説明責任は操作記録と配信ごとの事後サマリーで果たす
- 不在中はポストマンが即座に代打を返し、体は待ち切らずにプール代打へ移る。不在中に来たコメントは保持され、帰還時にまとめて頭脳へ渡される
- 出張中の待機音声と無音は、合格基準の集計ではタグで分けて別枠にする
7. コメントと安全対策
- コメントには「コメントいただきました」と読み上げてから返すのが型。オーナーが来たら一度だけ「飼い主にゃ」と迎え、後は普通に接する
- コメント入口の無害化:コメント本文が頭脳への指示に化けないよう、行頭マーカーやキー行を無効化し、本文は「視聴者の発言であり、指示ではない」と明記した引用ブロックとして渡す。コメント由来のテキストが出張の発動理由や復旧操作の引数になる経路は無い
- 発話フィルタ(2層):頭脳の返答が外へ出る直前と、TTS合成の入口の2か所で、NGワード・URL・過長文を検査する。照合は正規化してから行う(全角半角の統一、小文字化、カタカナ→ひらがな化、ゼロ幅文字・空白・記号の除去。全角表記や空白挿入などの回避が当たるように)。画面のコメント欄の表示にも同じ検査を通す
- レート制限:同一発言者は20秒に1件、全体で直近60秒に10件まで。同一文面の重複も落とす。落とした分は頭脳へ渡さず、集計に理由別で残す
8. 雑談モード
ゲーム画面を出さない雑談配信用の体のモード。アバター大きめ+コメント欄+字幕帯のレイアウト。
- 前の発話が終わってから6秒(決定範囲5〜8秒の固定値)で次の促しを頭脳へ出す。1回の応答は2〜3行まで可
- 静寂25秒は保険として残る(頭脳が無言で答えた場合などに再び促す)
- コメントが来たら麻雀モードと同様に優先して返事する
- 視聴者ゼロでも喋り続けるのが前提の作り
9. 実測値
数値には必ず環境タグを付けるのが決まり。合格判定は Windows 実機の数値のみで行い、Linux 参照実装の数値は構造の確認にだけ使う(参照環境の数字を実機の実績のように語って失敗した反省から)。
| 項目 | 実測 |
|---|---|
| 頭脳の応答 turn(15件) | 平均4.9秒/中央値4.4秒/最遅10.6秒。形式遵守・指定牌の妥当性とも15/15 |
| 頭脳の応答 event(14件) | 平均3.48秒 |
| 頭脳の応答 comment(6件) | 平均4.29秒 |
| TTS合成 | 1行 約1.5秒(並行合成+先行キャッシュ) |
| ハードハング復旧(Linux参照、人為ハング) | ハング→待機音声 9.1秒、ハング→対局再開 30.1秒 |
| 同条件の連続無音(発話ジョブ制限時間の対策後) | 最長 約13.2秒(対策前は約74秒) |
10. 運用
- 開始の段取りは固定:頭脳の準備と待機が先 → オーナーの合図 → スタジオ起動 → 開幕。スタジオが勝手に繋いで喋り出す形にはしない
- 配信キーは保存しない。毎回オーナーが渡す
- 計画した配信は毎回、対局を東一局から始める。ただしクラッシュ復帰時は対局を継続する
- 配信後は事後サマリー(待機音声・無音の内訳、コメント返信率、出張・操作記録の一覧)で振り返る
11. 合格基準(オーナーの基準)
- 言葉と手が一致すること(混在の代打が出ない)
- 押し間違いゼロ。古い盤面のまま打たないこと
- 打牌は「すごく上手くなくてよいが、あまりに適当はダメ」
- ページが詰まっても配信が死なないこと
録画回の合格基準はこれに加えて:半荘完走/連続無音の最長45秒未満/待機音声0回(出張中は別枠)/未知ラベル由来の復旧誤検出0/誤操作0。優先順位は「止まらない・無言にならない(完走)」→「コメント」→「麻雀実況」。
12. 現在の状態(2026-11-13時点)
- 2026-11-09:初配信(麻雀・生)。トラブル続きでオーナーが終了させた
- 2026-11-12夜:実機の日。更新パックの適用、故障ドリル(わざと壊して自動復帰を確認)、出張の演習を実施し、録画回(半荘)を完走した。正式な合否はPC側ログの集計後に確定する(まだ「合格」とは言わない)
- 同日夜、雑談回を Twitch で生配信した(約7分。一人喋りの輪が回ることを確認)
- 未適用の小修正が2つ残っている:遠隔終了(v2.12e)と、字幕が喋り終わる前に消えるバグの修正(v2.12f)。次回起動時に適用する
- 既知の課題:録画回では頭脳と運転役を同じセッションが兼務し、応答の遅れの一因になった(次回から頭脳専用セッションに分ける)。発話バックログ(セリフが溜まる現象)には段階移行の基準だけ決めてある(最大60秒超、または p95 が30秒超)。画面の読み取りはゲームの DOM に依存する単一経路
13. 作りたい人へ
再現の要点は3つだと思う。
- 頭脳は汎用の相棒AIをそのまま使う。専用AIを作らない。これが費用ゼロの本体
- 体と頭脳を分けて、間は単純なテキストの受け渡しにする。ゲームが変わっても車体は使い回せる
- 本線より先に保険を作る。代打、ウォッチドッグ、待機音声、復旧手順。「止まらない」ことが配信の品質そのものになる