音声区間検出

2つのVADモデルが利用可能です:高精度なオフラインバッチ処理用のPyannoteセグメンテーションと、ストリーミング低レイテンシー検出用のSilero VAD v5。どちらも完全にオンデバイスで動作します。

Pyannote(オフライン)

Pyannote segmentation-3.0は、PyanNetアーキテクチャを使用して高精度のVADを提供します。1秒ステップの10秒スライディング窓で音声を処理し、オーバーラップする予測を集約してヒステリシス平滑化を適用します。

アーキテクチャ

ステージ詳細
SincNet40の学習可能なバンドパスフィルター(合計80:40 cos + 40 sin)
BiLSTM4レイヤー、hidden=128、双方向(256次元出力)
LinearLeakyReLU付き2線形レイヤー(negative_slope=0.01)
出力ヒステリシス後処理付き7クラスsoftmax

モデルサイズ:約1.49Mパラメーター、ディスク上約5.7 MB。

デフォルトしきい値

CLIの使用法

# オフラインVAD
.build/release/audio vad recording.wav

# JSON出力
.build/release/audio vad recording.wav --json

# カスタムしきい値
.build/release/audio vad recording.wav --onset 0.6 --offset 0.3

Silero VAD v5(ストリーミング)

Silero VAD v5は、512サンプルチャンク(16 kHzで32 ms)を処理する軽量ストリーミングモデルです。リリースモードで23倍のリアルタイム速度で動作し、ライブ音声アプリケーションに適しています。

アーキテクチャ

ステージ詳細
STFTConv1d (1から258チャネル)、64の右側のみ反射パッド
エンコーダー4x Conv1d + ReLU
LSTM隠れサイズ128、状態はチャンクを越えて伝達
デコーダーLSTM隠れ状態上のConv1d (128から1)、シグモイド出力

モデルサイズ:約309Kパラメーター、ディスク上約1.2 MB。

ストリーミングステートマシン

ストリーミングVADプロセッサは、クリーンな音声セグメントを生成するために4状態マシンを使用します:

  1. silence — 音声が検出されない
  2. pendingSpeech — オンセットしきい値を超えた、最小音声継続時間を待機中
  3. speech — 確認された音声セグメントが進行中
  4. pendingSilence — オフセットしきい値を下回った、最小無音継続時間を待機中

デフォルトしきい値

CLIの使用法

# ストリーミングVAD
.build/release/audio vad-stream recording.wav

# カスタムしきい値
.build/release/audio vad-stream recording.wav --onset 0.6 --offset 0.3

# 最小継続時間
.build/release/audio vad-stream recording.wav --min-speech 0.5 --min-silence 0.2

# エンジンを選択
.build/release/audio vad-stream recording.wav --engine coreml

オプション

オプション適用説明
--onset両方音声オンセット確率しきい値
--offset両方音声オフセット確率しきい値
--min-speechストリーミング最小音声セグメント継続時間(秒)
--min-silenceストリーミングセグメントを終了する最小無音継続時間(秒)
--engineストリーミング推論エンジン:mlxまたはcoreml
--json両方JSON出力形式
重要

リアルタイムアプリケーションには、Silero VADでaudio vad-streamを使用してください。Pyannoteモデルは完全な音声ファイルを必要とし、精度が優先されるオフラインバッチ処理に適しています。

モデルダウンロード

モデルバックエンドサイズHuggingFace
Silero-VAD-v5MLX約1.2 MBaufklarer/Silero-VAD-v5-MLX
Silero-VAD-v5CoreML約1.2 MBaufklarer/Silero-VAD-v5-CoreML
Pyannote-Segmentation-3.0MLX約5.7 MBaufklarer/Pyannote-Segmentation-MLX

Swift API

import SpeechVAD

// オフラインVAD (Pyannote)
let pyannote = try await PyannoteVAD.loadFromHub()
let segments = try await pyannote.detectSpeech(audioFile: "recording.wav")
for segment in segments {
    print("\(segment.start)s - \(segment.end)s")
}

// ストリーミングVAD (Silero)
let silero = try await SileroVAD.loadFromHub()
let processor = StreamingVADProcessor(model: silero, config: .sileroDefault)
for chunk in audioChunks {
    if let segment = try processor.process(chunk: chunk) {
        print("Speech: \(segment.start)s - \(segment.end)s")
    }
}

Android と Linux (ONNX Runtime経由)でも利用可能です。