VocalSense는 ONNX Runtime과 함께 Silero VAD 모델을 사용하는 실시간 음성 활동 감지(VAD) 시스템의 C# 구현입니다.
- NAudio를 사용한 실시간 오디오 스트림 캡처
- Silero VAD ONNX 모델을 사용한 음성 활동 감지
- 감지된 음성 세그먼트의 자동 녹음
- 음성 활동 변화에 대한 이벤트 기반 알림 시스템
- 대화형 컨트롤이 있는 콘솔 UI
- 구성 가능한 임계값, 장치 및 녹음 옵션
시스템은 깔끔한 계층 아키텍처를 따릅니다:
- 프레젠테이션 계층: 이벤트 처리가 있는 콘솔 UI
- 애플리케이션 계층: 모든 구성 요소를 조정하는 VoiceActivityDetectionService
- 도메인 계층: 핵심 비즈니스 로직 (AudioProcessor, VADEngine, RecordingManager)
- 인프라스트럭처 계층: NAudio 통합, ONNX Runtime, 파일 시스템 스토리지
자세한 아키텍처 문서는 docs/architecture.md를 참조하세요.
- .NET 8.0 SDK 이상
- Windows (NAudio WaveIn 지원용)
- Silero VAD ONNX 모델 파일
Silero VAD 모델을 다운로드하여 models 디렉토리에 배치합니다:
# models 디렉토리 생성
mkdir models
# 모델 다운로드 (PowerShell)
Invoke-WebRequest -Uri "https://github.com/snakers4/silero-vad/raw/master/src/silero_vad/data/silero_vad.onnx" -OutFile "models/silero_vad.onnx"또는 다음에서 수동으로 다운로드: https://github.com/snakers4/silero-vad
dotnet builddotnet test기본 설정으로 실행 (장치 0, 임계값 0.5, 녹음 활성화):
dotnet run --project src/VocalSense.Consoledotnet run --project src/VocalSense.Console -- [옵션]
옵션:
-m, --model <경로> ONNX 모델 파일 경로 (기본값: models/silero_vad.onnx)
-t, --threshold <값> 신뢰도 임계값 0.0-1.0 (기본값: 0.5)
-d, --device <번호> 오디오 입력 장치 번호 (기본값: 0)
-o, --output <경로> 녹음 출력 디렉토리 (기본값: recordings)
--no-recording 자동 녹음 비활성화
-h, --help 도움말 메시지 표시# 다른 마이크 사용 (장치 1)
dotnet run --project src/VocalSense.Console -- -d 1
# 감도 조정 (낮을수록 더 민감함)
dotnet run --project src/VocalSense.Console -- -t 0.3
# 녹음 비활성화, 감지만 수행
dotnet run --project src/VocalSense.Console -- --no-recording
# 사용자 지정 출력 디렉토리
dotnet run --project src/VocalSense.Console -- -o "my_recordings"실행 중:
- Q: 애플리케이션 종료
- R: VAD 상태 재설정
- S: 통계 표시
VocalSense/
├── src/
│ ├── VocalSense.Core/ # 도메인 계층
│ │ ├── Models/ # 데이터 모델
│ │ ├── Interfaces/ # 핵심 추상화
│ │ └── Services/ # 비즈니스 로직
│ ├── VocalSense.Infrastructure/ # 인프라스트럭처 계층
│ │ ├── Audio/ # NAudio 통합
│ │ ├── Storage/ # 파일 시스템 스토리지
│ │ └── ML/ # ONNX VAD 구현
│ ├── VocalSense.Application/ # 애플리케이션 서비스
│ │ ├── Services/ # 오케스트레이션 서비스
│ │ └── Configuration/ # 구성
│ └── VocalSense.Console/ # 콘솔 UI
├── tests/
│ ├── VocalSense.Core.Tests/
│ ├── VocalSense.Infrastructure.Tests/
│ └── VocalSense.Integration.Tests/
├── models/ # ONNX 모델 파일
│ └── silero_vad.onnx # (별도 다운로드)
├── recordings/ # 출력 디렉토리 (런타임에 생성됨)
└── docs/
└── architecture.md # 아키텍처 문서
- 지연 시간: <100ms (오디오 캡처 → VAD 결과)
- 처리량: 16,000 샘플/초 (16kHz 샘플링)
- 메모리: 최대 ~100MB (버퍼 포함)
- 오디오 처리를 위한 SIMD 벡터화
- ArrayPool을 사용한 메모리 풀링
- I/O 작업을 위한 Async/await
- System.Threading.Channels을 사용한 생산자-소비자 패턴
- 최적화된 버퍼 크기 (50ms 청크)
var config = new VadConfiguration
{
ModelPath = "models/silero_vad.onnx",
ConfidenceThreshold = 0.5f,
AudioDeviceNumber = 0,
OutputDirectory = "recordings",
EnableRecording = true,
MinimumRecordingDurationSeconds = 0.5,
MaximumRecordingDurationSeconds = 300.0,
ChannelCapacity = 100
};- 0.3-0.4: 매우 민감함, 배경 소음을 잡을 수 있음
- 0.5: 균형 잡힘 (기본값)
- 0.6-0.7: 덜 민감함, 명확한 음성만
- 0.8+: 매우 엄격함, 작은 음성을 놓칠 수 있음
- NAudio 2.2.1: 오디오 I/O 및 WAV 파일 처리
- Microsoft.ML.OnnxRuntime 1.16.3: ONNX 모델 추론
- System.Reactive 6.0.0: 이벤트를 위한 Observable 패턴
- .NET 8.0: 대상 프레임워크
Silero VAD 모델이 다운로드되어 models/silero_vad.onnx에 배치되었는지 확인하세요.
마이크가 연결되어 있고 Windows 사운드 설정에서 활성화되었는지 확인하세요.
애플리케이션이 Windows 개인 정보 설정에서 마이크 액세스 권한을 가지고 있는지 확인하세요.
NuGet 패키지 복원:
dotnet restore이 프로젝트는 MIT 라이선스로 라이선스가 부여된 Silero VAD 모델을 사용합니다.
- Silero VAD Model: https://github.com/snakers4/silero-vad
- NAudio: https://github.com/naudio/NAudio
- ONNX Runtime: https://onnxruntime.ai/