AI VTuber を Twitch につなぐ:配信とチャット返答を Claude Code に頼んだ指示と手順

AI VTuber「ATW」を Twitch につなぐ 手順です。配信、チャットの読み取りと返事、動作の確認、チャット欄の追加までを、「① 私が出した指示」と「② Claude Code がしたこと」で並べます。指示の文は、実際に送った文を読みやすく整えたものです。

手順5:Twitch に配信する

① 私の指示

Twitch でやっている。配信しよう。

② Claude Code がしたこと

  • OBS の「設定 → 配信」を開く手順を案内し、サービスが「Twitch」で「アカウントを切断」と出ていれば、連携済みなのでストリームキー(配信用の合言葉)は不要だと教えた
  • 配信を始める前に、立ち絵が映っているか、ボットが起動しているかを確認させた
  • 「配信開始」を押したあと、Twitch の自分のページで配信中になっているかを確認する手順を案内した

手順6:チャットを読んで返事をする(ボット)

① 私の指示

チャットはどうやって認識するの?

「Twitch でやっている」と伝えると、Claude Code が twitchio という部品を使う流れを説明し、「Twitch のチャット読み取りを組み込みますか?」と聞いてきました。それに OK を出し、チャンネル名を伝えて進めました。

② Claude Code がしたこと

Twitch のチャットを読むには、トークン(Twitch に入るための合言葉)が必要です。取り方を、順番に案内してもらいました。

  1. 最初に案内された「TMI トークン生成サイト」は、すでに終了していました。Claude Code はそれに気づき、公式の方法に切り替えた
  2. Twitch の開発者ページ(https://dev.twitch.tv/console/apps)でアプリを登録する(OAuth リダイレクト URL は http://localhost、カテゴリは Chat Bot)。ここで Twitch アカウントの2段階認証が必要と分かり、先に設定した
  3. 認証用の URL(https://id.twitch.tv/oauth2/authorize に、クライアント ID と scope=chat:read+chat:edit を付けたもの)をブラウザで開き、許可すると、移動先の URL の access_token= のあとにトークンが出る
  4. pip install twitchio で部品を入れ、twitch_bot.py を書いた

twitch_bot.py の中心部分です。event_message(チャットが来たときに呼ばれる部分)から、会話(talk)と声(speak)につないでいます。

class ZelosBot(commands.Bot):
    def __init__(self):
        super().__init__(token=TOKEN, prefix="!", initial_channels=[CHANNEL])
        self.style_id = get_style_id()
        self.lock = asyncio.Lock()  # 返事と声を1件ずつ順番に処理する

    async def event_ready(self):
        print(f"ゼロスBot接続完了 → #{CHANNEL}")

    async def handle_chat(self, user, text):
        async with self.lock:
            print(f"[チャット] {user}: {text}")
            loop = asyncio.get_running_loop()
            try:
                # Bedrock と VOICEVOX は待ち時間が長いので別スレッドで動かし、チャット受信を止めない
                reply = await loop.run_in_executor(None, talk, f"{user}さんのコメント: {text}")
                print(f"ゼロス> {reply}")
                await loop.run_in_executor(None, speak, reply, self.style_id)
            except Exception as e:
                print(f"[エラー] {type(e).__name__}: {e}")

    async def event_message(self, message):
        if message.echo:  # ボット自身の発言には返事しない
            return
        await self.handle_chat(message.author.name, message.content)

トークンなどの秘密の文字列は、プログラムの中に書かず、secrets.ps1 という別のファイルに入れて、環境変数(プログラムに渡す設定値)として読み込みます。このファイルは git(変更履歴の管理)に入れず、人にも見せません。

TOKEN = os.environ.get("TWITCH_TOKEN", "")
CHANNEL = os.environ.get("TWITCH_CHANNEL", "あなたのチャンネル名")

手順7:Twitch を使わずに、ボットの動きを試す

トークンが合っているか分からないとき、ボットが悪いのか Twitch 側が悪いのかが分かりません。そこで、Twitch を使わない試し方を作ってもらいました。

① 私の指示

twitch_bot.py がチャットを受け取って返事するかを、Twitch 以外の部分から確かめたい。
動いている twitch_bot.py に、別のプログラムからコメントを送って反応させて。

② Claude Code がしたこと

  • 動いているボットの中に、コメントを受け取る小さな窓口(http://localhost:8765/chat)を足した。Twitch から来たコメントと同じ処理に流れる
  • その窓口にコメントを送る send_test.py を書いた
  • ターミナルで文字を打つだけで試せる test_bot.py(Twitch もボットも不要)も書いた

使い方は、ボットを動かしたまま、別のターミナルで次のように打つだけです。

python send_test.py "こんにちは"

声が出て、立ち絵の口が動けば、ボットから先は正常です。

手順8:「接続完了」と出るのにチャットに反応しないとき

一番時間がかかったのがここです。

  • 症状:ボットを起動すると「接続完了」と出ます。しかし、Twitch のチャットにコメントを書いても何も起きません
  • Claude が困っていたこと:最初に作業していた Claude(Sonnet 4.6)は、部品の twitchio を新しい版(v3)から古い版(v2)に戻しました。それでも直らず、作業の引き継ぎメモに「未解決」と書いて止まりました
  • 解決の頼み方:Claude(Opus 5.5)に、「動かない」ではなく、どこで止まっているかを順番に確かめるよう頼みました

① 私の指示

Twitch のボットがチャットに反応しない。部品の入れ替えをする前に、
① トークンが有効で chat:read の権限があるか
② ボットを使わずに Twitch のチャットへ直接つないで、送受信できるか
③ ボットのプログラム
の順に、どこで止まっているかを確かめて、結果を見せてください。

② Claude Code がしたこと

順番確かめたこと結果
1トークンが有効か、チャットを読む権限があるか有効。読む権限(chat:read)もあった
2ボットを使わず、Twitch のチャットに直接つないで書き込みと受け取りができるかできた
3ボットのプログラム弱い所が見つかった(下に書きます)

1 と 2 が正常だったので、Twitch 側ではなくボット側だと分かりました。調べている間に私の環境ではチャットに返事をするようになりましたが、動かなかった本当の原因ははっきりしていません。

3 で見つかった弱い所は、次の3つです。どれも Claude Code に直してもらいました。

  • AI の返事を待っている数秒間、ボット全体が止まっていた → 待っている間もチャットを受け取れるようにした
  • コメントが続けて来ると、声が重なった → 1件ずつ順番に返事をするようにした
  • AI の呼び出しが1回失敗すると、その後ずっと失敗し続けた → 失敗しても、次のコメントから普通に返事をするようにした

「動かない」とだけ頼むと、部品の版を上げ下げするところから始まりがちです。切り分けの順番を先に指定するのがコツです。

トークンが有効かどうかは、次の確認用の窓口で調べられます(確認日:2026-10-18)。

手順9:OBS にチャット欄を出す

ボットが動いても、OBS の画面には Twitch のチャットは出ません。チャットを見ながら配信したいときは、OBS の中にチャット欄を追加します。

① 私の指示

配信のチャットが出てこない。OBS に配信の画面が出ない。

② Claude Code がしたこと

OBS は画面操作のアプリなので、Claude Code が追加するのではなく、次の手順を案内してもらいました。

  1. OBS のメニュー「ドック」→「カスタムブラウザドック」を開く
  2. 1行目(ドック名)に チャット と入力する
  3. 2行目(URL)に https://www.twitch.tv/popout/あなたのチャンネル名/chat?popout= を入力する
  4. 「適用」を押す。OBS の画面にチャット欄が出る

これは自分が見るための表示です。視聴者の画面にもチャットを映したいときは、同じ URL を「ソース」の「ブラウザ」として追加します。

この記事のつづき

コメント

タイトルとURLをコピーしました