음성 활동 감지 — Silero VAD

두 가지 VAD 모델을 사용할 수 있습니다: 높은 정확도로 오프라인 배치 처리를 하는 Pyannote 분할, 그리고 스트리밍 저지연 감지를 위한 Silero VAD. 둘 모두 완전히 온디바이스에서 실행됩니다.

Pyannote (오프라인)

Pyannote segmentation-3.0은 PyanNet 아키텍처를 사용한 고정밀 VAD를 제공합니다. 1초 스텝의 10초 슬라이딩 윈도로 오디오를 처리한 다음, 겹치는 예측을 집계하고 히스테리시스 스무딩을 적용합니다.

아키텍처

단계세부 내용
SincNet40개의 학습된 대역통과 필터 (총 80개: 40 cos + 40 sin)
BiLSTM4 레이어, hidden=128, 양방향 (256차원 출력)
LinearLeakyReLU (negative_slope=0.01)가 적용된 선형 레이어 2개
출력히스테리시스 후처리가 적용된 7-클래스 softmax

모델 크기: 약 1.49M 파라미터, 디스크에서 약 5.7 MB.

기본 임계값

CLI 사용법

# Offline VAD
.build/release/speech vad recording.wav

# JSON output
.build/release/speech vad recording.wav --json

# Custom thresholds
.build/release/speech vad recording.wav --onset 0.6 --offset 0.3

Silero VAD (스트리밍)

Silero VAD는 512 샘플 청크(16 kHz에서 32 ms)를 처리하는 경량 스트리밍 모델입니다. 릴리즈 모드에서 실시간의 23배로 실행되어 라이브 오디오 애플리케이션에 적합합니다.

백엔드 구분: MLX와 CoreML은 이제 모두 Silero v6.2.1 내보내기를 기본값으로 사용합니다: aufklarer/Silero-VAD-v6.2.1-MLXaufklarer/Silero-VAD-v6.2.1-CoreML. 둘 다 동일한 32 ms 스트리밍 API를 유지합니다.

아키텍처

단계세부 내용
STFTConv1d (1 → 258 채널), 64의 오른쪽만 reflection pad
인코더4x Conv1d + ReLU
LSTMHidden 크기 128, 청크 간 상태 전달
디코더LSTM hidden 상태에 대한 Conv1d (128 → 1), sigmoid 출력

모델 크기: 약 309K 파라미터, 디스크에서 약 1.2 MB.

스트리밍 상태 머신

스트리밍 VAD 프로세서는 4 상태 머신을 사용하여 깨끗한 음성 세그먼트를 생성합니다:

  1. silence — 음성이 감지되지 않음
  2. pendingSpeech — onset 임계값 교차, 최소 음성 지속 시간 대기
  3. speech — 확인된 음성 세그먼트 진행 중
  4. pendingSilence — offset 임계값 교차, 최소 침묵 지속 시간 대기

기본 임계값

CLI 사용법

# Streaming VAD
.build/release/speech vad-stream recording.wav

# Custom thresholds
.build/release/speech vad-stream recording.wav --onset 0.6 --offset 0.3

# Minimum durations
.build/release/speech vad-stream recording.wav --min-speech 0.5 --min-silence 0.2

# Choose engine
.build/release/speech vad-stream recording.wav --engine coreml

옵션

옵션적용 대상설명
--onset둘 다음성 onset 확률 임계값
--offset둘 다음성 offset 확률 임계값
--min-speech스트리밍최소 음성 세그먼트 지속 시간 (초)
--min-silence스트리밍세그먼트 종료를 위한 최소 침묵 지속 시간 (초)
--engine스트리밍추론 엔진: mlx 또는 coreml
--json둘 다JSON 출력 형식
중요

실시간 애플리케이션에는 Silero VAD와 함께 speech vad-stream을 사용하세요. Pyannote 모델은 전체 오디오 파일이 필요하며 정확도가 우선인 오프라인 배치 처리에 더 적합합니다.

모델 다운로드

모델백엔드크기HuggingFace
Silero-VAD-v6.2.1MLX약 1.2 MBaufklarer/Silero-VAD-v6.2.1-MLX
Silero-VAD-v6.2.1CoreML약 1.2 MBaufklarer/Silero-VAD-v6.2.1-CoreML
Pyannote-Segmentation-3.0MLX약 5.7 MBaufklarer/Pyannote-Segmentation-MLX

Swift API

import SpeechVAD

// Offline VAD (Pyannote)
let pyannote = try await PyannoteVADModel.fromPretrained()
let segments = pyannote.detectSpeech(audio: samples, sampleRate: 16000)
for segment in segments {
    print("\(segment.startTime)s - \(segment.endTime)s")
}

// Streaming VAD (Silero)
let silero = try await SileroVADModel.fromPretrained()
let processor = StreamingVADProcessor(model: silero, config: .sileroDefault)
for event in processor.process(samples: audioBuffer) {
    switch event {
    case .speechStarted(let time):
        print("Speech started at \(time)s")
    case .speechEnded(let segment):
        print("Speech: \(segment.startTime)s - \(segment.endTime)s")
    }
}

ONNX Runtime을 통한 Android, Linux 및 Windows에서도 사용할 수 있습니다.