Silero VAD plugin

参照元: LiveKit Agents Documentation ロードマップ: 学習ロードマップ

公式ドキュメント: https://docs.livekit.io/agents/logic/turns/vad/

JSレンダリングの都合でコード例の直接取得が不安定だったため、以下の公式GitHubソースをあわせて参照した。

What(何についてか)

Silero VAD pluginは、LiveKit Agentsでユーザー発話区間を検出するためのコンポーネントである。VADは「音声か無音か」をフレーム単位で判定し、ターン検出に必要な境界情報を供給する。これにより、会話の開始・終了タイミングを機械的に安定化できる。

LiveKitの推奨は、VAD単体ではなくturn detectorと組み合わせる構成である。VADが低レイヤで音声区間を切り出し、turn detectorが会話的な終了判定を担う。

Why(なぜ必要か)

音声エージェントは、ユーザーの短い間や言い淀みを含む自然発話を扱うため、発話区間の切り出し品質が直接UXに影響する。VADの設定が不適切な場合、語頭欠落、早切り、割り込み過多、レスポンス遅延が発生しやすい。

また、VADで「話している時間」を特定できると、STT処理を必要区間へ集中させられるため、不要な計算を抑えやすい。

How(どう動くか)

Silero VADはVAD.load(...)で初期化され、AgentSession(vad=...)に注入して利用する。load()はモデルをメモリへロードするためブロッキングで、初回コストがある。公式実装でもprewarm経由での事前ロードを推奨している。

graph TD
    A["Worker start"] --> B["prewarm: VAD.load"]
    B --> C["proc.userdata に保存"]
    C --> D["entrypoint で再利用"]
    D --> E["AgentSession に vad を注入"]
    E --> F["音声フレーム判定"]
    F --> G["Turn 判定へ境界情報を供給"]

Prewarmの要点

VAD.load()は重い初期化処理であるため、ジョブ開始時に毎回実行するのではなく、prewarmで一度ロードして再利用する設計が基本になる。これにより、最初のユーザー発話時のコールドスタート遅延を抑制できる。

Configuration(主要パラメータ)

パラメータ役割主要トレードオフ
min_speech_duration発話開始認定に必要な最短時間低いほど反応は速いがノイズ誤検知が増えやすい
min_silence_duration発話終了とみなす無音待ち時間低いほどテンポは速いが早切りしやすい
prefix_padding_duration発話先頭への前置き余白大きいほど語頭欠落に強いが前方ノイズを拾いやすい
max_buffered_speechバッファ保持上限(秒)大きいほど長文に強いがリソース負荷が上がる
activation_thresholdspeech開始しきい値高いほど保守的、低いほど敏感
deactivation_thresholdspeech終了しきい値開始/終了を分離してチャタリングを抑える
sample_rate推論サンプルレート8000/16000のみ対応
force_cpuCPU推論固定環境差を減らし再現性を上げる

閾値の読み方(重要)

activation_thresholddeactivation_thresholdは音量(dB)そのものではなく、モデルが出力するspeech確信度に対する閾値である。2つを分けることで、境界付近のON/OFF振動(チャタリング)を抑制できる。公式実装ではdeactivation_threshold未指定時にmax(activation_threshold - 0.15, 0.01)が適用される。

Key Concepts

用語説明
VADVoice Activity Detection。発話/無音を判定する下層コンポーネント
Prewarmジョブ開始前にモデルを事前ロードして初回遅延を下げる仕組み
Turn detection会話としてのターン終了を判定する上位ロジック
Hysteresis開始閾値と終了閾値を分離して揺れを抑える手法

一言まとめ

Silero VADはターン検出の土台であり、実運用の品質はprewarmと閾値設計で決まる。