Adaptive Interruption Handling
参照元: LiveKit Agents Documentation ロードマップ: 学習ロードマップ
What(何についてか)
Adaptive Interruption Handlingは、ユーザーがエージェントの発話中に音声を発したとき、それが本物の割り込み(barge-in)かバックチャネリング(あいづち)かを音響モデルで判別する機能だ。
バックチャネリングとは「うん」「そうですね」「なるほど」のような、聞いていることを示す短い発話のことで、エージェントへの応答を求めるものではない。
Why(なぜ必要か)
VAD単体では音声の有無しか検知できないため、バックチャネリングでもエージェントが発話を停止してしまう。
- ❌ VADのみ:「うん」→ エージェント停止(不自然)
- ✅ Adaptive:「うん」→ バックチャネルと判定 → エージェント継続
- ✅ Adaptive:「ちょっと待って」→ 割り込みと判定 → エージェント停止
How(どう動くか)
処理フロー
graph TD A["ユーザー発話(エージェント発話中)"] --> B["VAD\n(音声検知)"] B --> C["Adaptive Interruption Model\n(音響シグナル分析)"] C -->|"本物の割り込み"| D["エージェント停止\nターン譲渡"] C -->|"バックチャネル"| E["エージェント継続"]
モデルはテキスト(STT結果)を待たずに音響シグナルで直接判断する。これによりSTTの処理時間分のレイテンシを削減できる。
Turn Detectorとの役割分担
| 機能 | 判断材料 | タイミング | 目的 |
|---|---|---|---|
| Turn Detector | テキスト(STT結果) | 沈黙後 | ターン終了の検出 |
| Adaptive Interruption | 音響シグナル | 発話中(オーバーラップ) | 割り込みかバックチャネルかの判別 |
使用条件
以下の条件をすべて満たすと自動的に有効になる:
- LiveKit CloudにデプロイされているかDevモードで動作中
- VADが有効
- LLMがRealtimeモデルでない
- STTがaligned transcriptに対応している
設定方法
# 明示的に有効化
session = AgentSession(
turn_handling=TurnHandlingOptions(
turn_detection=MultilingualModel(),
interruption={
"mode": "adaptive",
},
),
)
# VADのみに戻す
turn_handling={"interruption": {"mode": "vad"}}
# 割り込み自体を完全無効化(エージェントが一切止まらない)
turn_handling={"interruption": {"enabled": False}}Aligned transcripts
Aligned transcriptとは、各単語・発話チャンクにタイムスタンプ(開始・終了時刻)が付いたトランスクリプトだ。Adaptive Interruption Handlingの使用条件として要求される。
通常: "I need to think about that"
Aligned:
"I" → 0.00s ~ 0.12s
"need" → 0.13s ~ 0.28s
"think" → 0.36s ~ 0.58s
"that" → 0.79s ~ 0.95s
STTプラグインが対応しているかは capabilities.aligned_transcript プロパティで確認できる:
if stt.capabilities.aligned_transcript:
print("This STT model supports aligned transcripts.")LiveKit Inference(inference.STT)は対応済み。
❓ 未解決の疑問 モデルが音響シグナルで判断するなら、なぜaligned transcript(タイムスタンプ付きテキスト)が必要なのか。 ドキュメントには「必要条件」とだけ書かれており、理由は明記されていない。 推測:音質が悪いエッジケースで音響+テキストの複合判断に使っている可能性があるが未確認。 確認方法:GitHubのソースコードを読む。
Quota and limits
| 環境 | 料金 | 制限 |
|---|---|---|
| LiveKit Cloud デプロイ | 無料 | 無制限 |
| セルフホスト / ローカル開発 | 無料 | 月40,000リクエストまで |
Metrics and usage
Adaptive Interruption Handlingが有効なセッションでは、割り込みイベントごとに以下のメトリクスが収集される:
- per-event latency(割り込み判定ごとのレイテンシ)
- リクエスト数
- 割り込み発生回数
session.on("metrics_collected", handle_metrics) # InterruptionMetricsモデルの使用量は session.usage(ModelUsageCollector)から取得できる。詳細はPhase 6(Observability)で扱う。