Phát hiện hoạt động giọng nói — Silero VAD v5

Có hai mô hình VAD: Pyannote segmentation để xử lý theo lô offline với độ chính xác cao, và Silero VAD v5 để phát hiện streaming với độ trễ thấp. Cả hai đều chạy hoàn toàn trên thiết bị.

Pyannote (offline)

Pyannote segmentation-3.0 cung cấp VAD độ chính xác cao bằng kiến trúc PyanNet. Mô hình xử lý âm thanh trong các cửa sổ trượt 10 giây với bước 1 giây, sau đó tổng hợp các dự đoán chồng lấn và áp dụng làm mượt theo độ trễ (hysteresis).

Kiến trúc

Giai đoạnChi tiết
SincNet40 bộ lọc thông dải đã học (tổng 80: 40 cos + 40 sin)
BiLSTM4 lớp, hidden=128, hai chiều (đầu ra 256 chiều)
Linear2 lớp tuyến tính với LeakyReLU (negative_slope=0.01)
Đầu raSoftmax 7 lớp với hậu xử lý theo hysteresis

Kích thước mô hình: ~1.49M tham số, ~5.7 MB trên đĩa.

Ngưỡng mặc định

Cách dùng CLI

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

# Đầu ra JSON
.build/release/speech vad recording.wav --json

# Ngưỡng tùy chỉnh
.build/release/speech vad recording.wav --onset 0.6 --offset 0.3

Silero VAD v5 (streaming)

Silero VAD v5 là mô hình streaming nhẹ, xử lý các chunk 512 mẫu (32 ms ở 16 kHz). Mô hình chạy nhanh gấp 23 lần thời gian thực ở chế độ release, phù hợp cho các ứng dụng âm thanh trực tiếp.

Kiến trúc

Giai đoạnChi tiết
STFTConv1d (1 đến 258 kênh), reflection pad bên phải 64
Encoder4x Conv1d + ReLU
LSTMHidden size 128, trạng thái được duy trì giữa các chunk
DecoderConv1d (128 đến 1) trên trạng thái ẩn LSTM, đầu ra sigmoid

Kích thước mô hình: ~309K tham số, ~1.2 MB trên đĩa.

Máy trạng thái streaming

Bộ xử lý VAD streaming dùng máy trạng thái 4 trạng thái để tạo ra các đoạn giọng nói sạch:

  1. silence — không phát hiện giọng nói
  2. pendingSpeech — đã vượt ngưỡng onset, chờ thời lượng giọng nói tối thiểu
  3. speech — đoạn giọng nói đã xác nhận đang diễn ra
  4. pendingSilence — đã vượt ngưỡng offset, chờ thời lượng im lặng tối thiểu

Ngưỡng mặc định

Cách dùng CLI

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

# Ngưỡng tùy chỉnh
.build/release/speech vad-stream recording.wav --onset 0.6 --offset 0.3

# Thời lượng tối thiểu
.build/release/speech vad-stream recording.wav --min-speech 0.5 --min-silence 0.2

# Chọn engine
.build/release/speech vad-stream recording.wav --engine coreml

Tùy chọn

Tùy chọnÁp dụng choMô tả
--onsetCả haiNgưỡng xác suất bắt đầu giọng nói
--offsetCả haiNgưỡng xác suất kết thúc giọng nói
--min-speechStreamingThời lượng tối thiểu của đoạn giọng nói (giây)
--min-silenceStreamingThời lượng im lặng tối thiểu để kết thúc đoạn (giây)
--engineStreamingEngine suy luận: mlx hoặc coreml
--jsonCả haiĐịnh dạng đầu ra JSON
Quan trọng

Với các ứng dụng thời gian thực, hãy dùng speech vad-stream với Silero VAD. Mô hình Pyannote yêu cầu toàn bộ tệp âm thanh và phù hợp hơn cho xử lý theo lô offline khi độ chính xác là ưu tiên.

Tải mô hình

Mô hìnhBackendKích thướcHuggingFace
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

API Swift

import SpeechVAD

// VAD offline (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 streaming (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")
    }
}

Cũng có sẵn trên Android và Linux qua ONNX Runtime.