実況 AI が一歩遅れるので語るのをやめて相槌にした
カメラの前でゲストが手元の対象を次々と切り替えていく様子を、音声 AI が実況します。最初の設計では、対象が変わるたびに AI が語っていました。これが構造的に追いつきません。語り終える前に次の対象が来るので、実況は常に一つ遅れ、ゲストの手が速いほど遅れが積み上がります。
生成を速くしても、打ち切りを入れても、遅れは消えませんでした。一つの対象に語る時間が、対象が切り替わる間隔より長い限り、どう並べても追いつかないからです。
転回: 実際の MC は解説し続けない
テレビの実況を思い浮かべると、MC は目の前のものを一つずつ解説してはいません。主役はゲストです。MC がやっているのは、基本は相槌で、語るのはゲストが何かを掲げた・手を止めた・声を上げたときだけ。場面が変わったら、前の話は無条件で捨てる。
設計をこれに寄せました。
- 基本の出力は相槌(「うん」「ほぉ」「おっ」)。一つの対象につき一言以下
- 語るのは、ゲストが掲げた・止めた・声を上げた、のいずれかが起きたときだけ
- 場面が変わったら、前の話題は未完でも捨てる。言い切ろうとしない
効いたこと: 高速な切り替え中の相槌は体験として成立した
ゲストが速いペースで対象を切り替えている間、AI は相槌だけを打ちます。これは、私が見ている限りでは体験として成立しました。一つ遅れの解説を聞かされるより、テンポに合った相槌の方が「見てもらっている」感覚が残ります。
「反応しない勇気」を設計に入れた、と言えます。全イベントに語る AI は遅い。語らないことを選べる AI の方が速く見えます。
抜けたこと: 止めて掲げた 20 秒間を見逃した
ただし、穴がありました。ゲストが対象を手に取って、動きを止めて、カメラに掲げた。ここは語るべき場面です。AI はこの 20 秒間、何も言いませんでした。
原因は検出器です。映像の検出器は「動きの山」だけを出来事とみなしていました。掲げて静止している間、フレーム差分は 4〜8 で、動きの閾値の下です。検出器から見れば「何も起きていない」状態が続いていました。語るべき瞬間は、動きの山ではなく動きの谷にありました。
その後: 静止イベントを足したら二重発火した
静止を出来事として足しました。すると今度は、既存の「動きの山」トリガーと静止トリガーが近い時刻に両方発火し、後から発火した方が先の応答を打ち切る、という自己キャンセルの連鎖が起きました。片方が語り始めた瞬間にもう片方が打ち切り、結局どちらも語りません。
対処は、トリガーを一本の直列キューに通すことでした。どのトリガーが発火しても、キューの先頭が処理中なら後続は待つか捨てる。並列に発火させない。
どこで止まるか
- 「体験として成立した」は私自身の主観で、第三者の評価は取っていません
- 静止の検出は「差分 4〜8 が続く」という閾値で、掲げていない静止(ただ手を止めただけ)との区別はできていません。語らない場面で語ることはあります
- 直列キューにしたことで、近い時刻に起きた 2 つの出来事のうち片方は必ず捨てられます。両方に反応する設計は諦めました
この構成で気をつけること
- 「反応しない勇気」を設計に入れる。全イベントに語る AI は、どれだけ速くしても遅れる
- 語るべき瞬間が「動きの山」にあるとは限らない。止めた・掲げた、は動きの谷にある
- イベント検出を足すときは、既存トリガーとの排他を先に決める。後から足したトリガーは既存と二重発火する
喋らない AI 実況者の方が、喋り続ける AI 実況者より速く見えました。そして、喋るべき瞬間を見逃したのは、AI ではなく「動いたときだけ見る」検出器を書いた私でした。