음성 활동 감지
두 가지 VAD 모델을 사용할 수 있습니다: 높은 정확도로 오프라인 배치 처리를 하는 Pyannote 분할, 그리고 스트리밍 저지연 감지를 위한 Silero VAD v5. 둘 모두 완전히 온디바이스에서 실행됩니다.
Pyannote (오프라인)
Pyannote segmentation-3.0은 PyanNet 아키텍처를 사용한 고정밀 VAD를 제공합니다. 1초 스텝의 10초 슬라이딩 윈도로 오디오를 처리한 다음, 겹치는 예측을 집계하고 히스테리시스 스무딩을 적용합니다.
아키텍처
| 단계 | 세부 내용 |
|---|---|
| SincNet | 40개의 학습된 대역통과 필터 (총 80개: 40 cos + 40 sin) |
| BiLSTM | 4 레이어, hidden=128, 양방향 (256차원 출력) |
| Linear | LeakyReLU (negative_slope=0.01)가 적용된 선형 레이어 2개 |
| 출력 | 히스테리시스 후처리가 적용된 7-클래스 softmax |
모델 크기: 약 1.49M 파라미터, 디스크에서 약 5.7 MB.
기본 임계값
- Onset:
0.767— 이 확률을 넘으면 음성으로 감지 - Offset:
0.377— 이 확률 아래로 내려가면 음성 종료
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배로 실행되어 라이브 오디오 애플리케이션에 적합합니다.
아키텍처
| 단계 | 세부 내용 |
|---|---|
| STFT | Conv1d (1 → 258 채널), 64의 오른쪽만 reflection pad |
| 인코더 | 4x Conv1d + ReLU |
| LSTM | Hidden 크기 128, 청크 간 상태 전달 |
| 디코더 | LSTM hidden 상태에 대한 Conv1d (128 → 1), sigmoid 출력 |
모델 크기: 약 309K 파라미터, 디스크에서 약 1.2 MB.
스트리밍 상태 머신
스트리밍 VAD 프로세서는 4 상태 머신을 사용하여 깨끗한 음성 세그먼트를 생성합니다:
- silence — 음성이 감지되지 않음
- pendingSpeech — onset 임계값 교차, 최소 음성 지속 시간 대기
- speech — 확인된 음성 세그먼트 진행 중
- pendingSilence — offset 임계값 교차, 최소 침묵 지속 시간 대기
기본 임계값
- Onset:
0.5 - Offset:
0.35 - 최소 음성 지속 시간:
0.25s - 최소 침묵 지속 시간:
0.1s
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-v5 | MLX | 약 1.2 MB | aufklarer/Silero-VAD-v5-MLX |
| Silero-VAD-v5 | CoreML | 약 1.2 MB | aufklarer/Silero-VAD-v5-CoreML |
| Pyannote-Segmentation-3.0 | MLX | 약 5.7 MB | aufklarer/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에서도 사용할 수 있습니다.