ブログ一覧

実況 AI が一歩遅れるので語るのをやめて相槌にした

更新: Web開発者向け

カメラの前でゲストが手元の対象を次々と切り替えていく様子を、音声 AI が実況します。最初の設計では、対象が変わるたびに AI が語っていました。これが構造的に追いつきません。語り終える前に次の対象が来るので、実況は常に一つ遅れ、ゲストの手が速いほど遅れが積み上がります。

生成を速くしても、打ち切りを入れても、遅れは消えませんでした。一つの対象に語る時間が、対象が切り替わる間隔より長い限り、どう並べても追いつかないからです。

転回: 実際の MC は解説し続けない

テレビの実況を思い浮かべると、MC は目の前のものを一つずつ解説してはいません。主役はゲストです。MC がやっているのは、基本は相槌で、語るのはゲストが何かを掲げた・手を止めた・声を上げたときだけ。場面が変わったら、前の話は無条件で捨てる。

設計をこれに寄せました。

  • 基本の出力は相槌(「うん」「ほぉ」「おっ」)。一つの対象につき一言以下
  • 語るのは、ゲストが掲げた・止めた・声を上げた、のいずれかが起きたときだけ
  • 場面が変わったら、前の話題は未完でも捨てる。言い切ろうとしない

効いたこと: 高速な切り替え中の相槌は体験として成立した

ゲストが速いペースで対象を切り替えている間、AI は相槌だけを打ちます。これは、私が見ている限りでは体験として成立しました。一つ遅れの解説を聞かされるより、テンポに合った相槌の方が「見てもらっている」感覚が残ります。

「反応しない勇気」を設計に入れた、と言えます。全イベントに語る AI は遅い。語らないことを選べる AI の方が速く見えます。

抜けたこと: 止めて掲げた 20 秒間を見逃した

ただし、穴がありました。ゲストが対象を手に取って、動きを止めて、カメラに掲げた。ここは語るべき場面です。AI はこの 20 秒間、何も言いませんでした

原因は検出器です。映像の検出器は「動きの山」だけを出来事とみなしていました。掲げて静止している間、フレーム差分は 4〜8 で、動きの閾値の下です。検出器から見れば「何も起きていない」状態が続いていました。語るべき瞬間は、動きの山ではなく動きの谷にありました。

その後: 静止イベントを足したら二重発火した

静止を出来事として足しました。すると今度は、既存の「動きの山」トリガーと静止トリガーが近い時刻に両方発火し、後から発火した方が先の応答を打ち切る、という自己キャンセルの連鎖が起きました。片方が語り始めた瞬間にもう片方が打ち切り、結局どちらも語りません。

対処は、トリガーを一本の直列キューに通すことでした。どのトリガーが発火しても、キューの先頭が処理中なら後続は待つか捨てる。並列に発火させない。

どこで止まるか

  • 「体験として成立した」は私自身の主観で、第三者の評価は取っていません
  • 静止の検出は「差分 4〜8 が続く」という閾値で、掲げていない静止(ただ手を止めただけ)との区別はできていません。語らない場面で語ることはあります
  • 直列キューにしたことで、近い時刻に起きた 2 つの出来事のうち片方は必ず捨てられます。両方に反応する設計は諦めました

この構成で気をつけること

  • 「反応しない勇気」を設計に入れる。全イベントに語る AI は、どれだけ速くしても遅れる
  • 語るべき瞬間が「動きの山」にあるとは限らない。止めた・掲げた、は動きの谷にある
  • イベント検出を足すときは、既存トリガーとの排他を先に決める。後から足したトリガーは既存と二重発火する

喋らない AI 実況者の方が、喋り続ける AI 実況者より速く見えました。そして、喋るべき瞬間を見逃したのは、AI ではなく「動いたときだけ見る」検出器を書いた私でした。

関連

この記事をシェア