음성 활동 감지

두 가지 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 (negative_slope=0.01)가 적용된 선형 레이어 2개
출력히스테리시스 후처리가 적용된 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의 오른쪽만 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 사용법

# 스트리밍 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둘 다음성 onset 확률 임계값
--offset둘 다음성 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")
    }
}

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