3. 台本・雑談・参加・ゲーム・コラボ

3.1 発話の所有者は一つではない

活動 進行の所有者 発話の起点 コメントとの関係
コメントへの返答 ChatGPTController 採用された入力 他の音声、台本ゲート、期限を待つ
台本の進行 ScriptRunner + MonologueController ノード/話題ターン/固定台詞 応答窓と残り尺で割り込める範囲が決まる
自由会話 MonologueController + FreeTalkConversationState 無言、話題リスト、コメント由来の続き 新着コメントと質問受付を優先
自発ゲーム実況 MonologueController.GameReaction freshな解析結果 最新イベントだけを保持し、発話権を予約
認証済みゲームイベント CommentStock + ChatGPTController 拡張のイベント 専用優先レーン。前章参照
コラボ掛け合い CollabDialogueOrchestrator 手動/コメント/ホスト返答/言及/無言 台本を止めて再開する方針を持つ
運営カンペ OperatorCue経路 運営の指示 通常会話や台本の旧生成を中断・失効できる

「自律性があるか」を一つのboolで判断できない。生成内容の自由さ、発話を始める権利、番組構成を変える権利が分かれている。

3.2 台本は読み上げリスト以上のもの

ScriptNode / ScriptRunner に、以下の要素がある。

PacingController は残り時間と必須ノードの見積もりから、余裕/通常/遅れ/危機を判断する。EndingController と合わせ、予定尺を守るための進行制御がある。

現在の強み: 配信が無限に脱線することや、コメント返答の途中で自動遷移して枠を消費することを避けるための実行管理が厚い。

機能の境界: 残り尺の判断と、観客の期待を作ってオチを回収する編集判断は同一ではない。前者の実装があることから、後者が自動的に保証されるとは言えない。

3.3 台本の話題展開

台本version 1.1以上では ScriptTopicTurnPlanner の決定的なターン計画を使う。topicsを具体的な話題単位として、予定尺と毎分2ターンの基準等から展開を組む。

切り口はフック、観察、場面、具体例、仕組み、比較、反対意見、トレードオフ、視点変更、実践、振り返り、小ボケ、あるある、視聴者に振る、前フリ回収、大げさ実況、転換。長いノードでは時間軸・条件変更・立場などのlensを追加する。

「小ボケ」「前フリ回収」はすでに存在する。機能追加を検討するときに未実装扱いしてはいけない。ただし、現在のCallbackは「先に出した言い回しや例を1つ回収する」というプロンプト指示であり、すべての伏線を構造化して成功を判定する仕組みを意味しない。

ReserveCommit/Skip を分離するため、生成だけで消費済みにしない。ScriptUtteranceContinuity は直近発話、必須台詞カバー、重複、発話間隔等を扱う。意味記憶も加わるが、語の類似・消費キー・LLM要約はそれぞれ異なる近似である。

3.4 視聴者に質問し、実際に待つ

拡張された台本参加機能の有効条件は AudienceInteractionEnabled に明示される。

台本が実行中
AND node.audienceInteraction.enabled == true
AND commentWindowMode == WholeNode
AND scriptOnlyMode == false

さらにコメント由来の寄り道にはv1.1以上の決定的ターン計画と allowAudienceDetours が必要。関連設定がJSONに存在するだけでは有効とは限らない。

質問の状態は ScriptCommentWaitPendingQuestionTracker が管理する。

stateDiagram-v2
    [*] --> 質問の生成と配送
    質問の生成と配送 --> 回答受付: 質問の実再生が完了
    質問の生成と配送 --> 通常進行: 失敗・取消・配送期限切れ
    回答受付 --> 回答の処理: 安全な入力をmessage IDで受付
    回答の処理 --> 回答受付: 返答完了・受付時間は残す
    回答受付 --> 受付済み回答の開始猶予: 締切後も未開始回答あり
    受付済み回答の開始猶予 --> 通常進行: 猶予終了
    回答受付 --> 通常進行: 締切・未開始回答なし

質問の末尾や手掛かりを検出するため、LLMが意図どおりの問いを出さなかった場合まで回答窓が必ず開くわけではない。質問が生成されたかより、最終的に聞こえた文と待ち状態の両方を見る必要がある。

3.5 コメントから台本を寄り道する

LLMcontroller.AudienceTopic は通常返答と同じ生成に、任意の補助JSONを付けさせる。

<audience_topic>{"pickedPhrase":"入力内の言葉", "expansionDirection":"広げる方向"}</audience_topic>

pickedPhraseは2–40文字で元の生コメント内に実在すること、directionは1–120文字などを検証する。タグ破損時も補助情報を音声へ漏らさない。挨拶・相槌・個人情報・敏感な相談では候補を無理に作らないよう指示する。

通常返答が実際に完了してから CommitAudienceTopicAfterReply が候補を台本/自由会話へ渡す。候補を生成できたことと、後続発話が始まることは別である。

AudienceDetourStateScriptRunner.AudienceInteraction の境界は以下。

条件 現在値/挙動
候補キュー 最大3件、既知source最大32
追加発話 ノード内で合計最大2ターン。コメント1件ごとに2回ではない
予約可能な残り尺 15秒以上
旧方式の開始期限 元コメント時刻+60秒
会話品質v2の開始期限 元返答の可聴完了+15秒。元コメントの通常配送期限は変更しない
採用後の有効期間 寄り道開始から90秒
切り口 初回ConcreteExample、次回Reflection
取消 モデレーション、scope変更、終了処理等
状態報告 offered / reserved / expired / discarded / delivered等

この機能は「コメントによって話の内容が変わる」土台になっている。一方、候補は常に採用されず、残り尺・期限・コメント待ち・モード変更が一つでも合わなければ表に出ない。

3.6 自由会話は別の状態機械

LLMcontroller.FreeTalk の自由会話は、配信中・切替外・終了フェーズ外・台本なし・ASMR外・ゲームモード外・展示モード外・コラボ不在などが条件。

FreeTalkConversationState は次を実装する。

v2との非対称: 現在の自由会話候補の投入では、まだ元コメントの年齢が60秒未満かを確認する。台本の「可聴返答後15秒」の変更が自由会話にも同じ形で入った、と読んではいけない。

自由会話状態が候補を持っていても、実際に発話するにはMonologueControllerの有効化と実行条件が必要。返答本文に1文補足する encourageConversationFollowups(既定false)とも別機能である。

3.7 自発発話と意図した沈黙

MonologueController は事前WAV、AI生成一人語り、短い自発発言を持つ。コード既定では enableMonologue=falseenableSpontaneousUtterance=false。一人語り間隔300秒、初回30秒、自発の範囲120–300秒、長い無言の閾値120秒。実効値は保存設定/クラウド適用で変わる。

MonologueController.SituationContextAutonomyPolicyEngine とSpeechIntentの予約を使う。

「沈黙を避ける」と「視聴者の答えを待つ」「ASMRの間を守る」は異なる目的。無音秒数だけを短くすると後者を壊す可能性がある。

3.8 ゲーム実況・視覚理解

MonologueController.GameReaction は解析されたCurrentScene / CurrentAction / TensionLevel / NotableEvents / CommentarySuggestionから短い実況を作る。

GameReactionState の鮮度は20秒。最新1件を保持し、古いイベントを順番に喋らない。出来事の正規化キーで重複を抑え、実配送まで消費しない。候補のrevision・画像/解析元・発話権を再確認する。

通常のゲームリアクションは1–2文、上限は maxAIUtteranceLength と60文字の小さい方。生成待ちは10秒を目安に打ち切る経路がある。ゲーム観測から発話する機能であって、すべてのゲームの勝敗・因果・作戦を構造化した状態として理解している保証ではない。

ゲーム実況、一般コメントに付与する画面文脈、認証済みGameEventの固定画像付き応答は別経路。鮮度20秒とGameEventキューの15秒も同じ閾値ではない。

3.9 コラボは制限付きの順番制会話

CollabDialogueModels に手動、視聴者コメント、ホスト返答後、ゲスト言及、無言後などの開始モードがある。台本との関係はDisabled / ScriptOnly / BetweenNodes / CommentInterrupt / FreeTalkSegment。

CollabTurnPlanner は既定2ターン、1–5ターンに制限し、最初の指定話者/ゲストを選び、その後は直前以外で最も長く喋っていない候補を選ぶ。

CollabCharacterResponseGenerator は話者別の人物像・口調・語尾・NGを使い、ホストの人格をそのままゲストへ流用しない。生成失敗時の短いフォールバックも設定として存在する。

CollabDialogueOrchestrator はキュー投入成功ではなく、MultiCharacterの再生結果を待って会話履歴を確定する。台本を停止/再開する制御もある。

エンタメ上の境界: 掛け合いは実装済み。ただし今回確認したplannerは、ボケ役/ツッコミ役の役割計画、話題ごとの緊張関係、観客の反応によるコンビ芸の最適化を行う選択器ではない。主として話者の順番とターン上限を管理する。

別に CharacterRelationshipStoreMultiCharacterPromptInjector があり、キャラ間の好感度・交流履歴をプロンプトへ渡せる。「キャラ同士の関係が一切ない」とも言えない。この関係表現と、上記plannerの話者選択は別の責務である。

3.10 既存の分析・ハイライト

ScriptInteractionMetrics は質問数、受付/開始/配送数、未開始、猶予開始、寄り道ターン、重複抑止、要約の要求/成功/失敗を記録する。質問から最初の処理開始/配送完了までの時間もある。

BroadcastInsightsAnalyzer は過去の台本レポートから尺やコメント応答数等を集計する。EngagementClipDetector はコメント急増、課金、感情高揚をハイライト候補にする。

これは「観測が何もない」状態ではない。ただしコメント数や感情強度は面白さそのものではなく、炎上・困惑・定型感謝でも増え得る。確認した範囲では、これらの評価でResponseDirectorの重みやネタ構造を継続学習する閉ループまでは確認できない。

3.11 参加型企画・配信横断・BGMという周辺の土台

通常コメント処理だけを見て「参加型企画がない」と結論してはいけない。以下も応答体験に関係する。

機能 確認した実装 通常応答との違い
配信拡張 ExtensionHost テナントで有効化された拡張を読み、capabilityと実接続を確認する
モザイク外し MosaicRevealExtension コメント採点、隠し正解、課金、確率・cooldownで開示し、speech.injectでリアクション
ゲーム投票 TaeruCraneGameExtensionYouTubeLiveControllerPollモデル ゲーム連動の公式投票を要求・終了・検証する。通常雑談の質問待ちとは別
シリーズの継続 SeriesStateManager 台本変数、エピソード、セーブポイントをローカル/クラウドで継承
BGM NativeBgmController 配置preset連動、TTS中の音量低下、ASMR中のmute。Native配信設定に依存

これらは企画や音楽の素材・実行基盤として存在する。現在の通常応答が観客の反応から企画を選び、導入→参加→結果→次の期待まで自動編成する共通機構がある、という根拠にはならない。また、拡張のコメント購読とChatGPTControllerの入口は別なので、通常返答で落ちる短文が、すべての企画でも無視されるとは限らない。