การตรวจจับเสียงพูด — Silero VAD

มีโมเดล VAD ให้เลือกสองตัว ได้แก่ Pyannote segmentation สำหรับการประมวลผลเป็นชุดแบบออฟไลน์ที่มีความแม่นยำสูง และ Silero VAD สำหรับการตรวจจับแบบสตรีมมิ่งที่มีดีเลย์ต่ำ ทั้งสองโมเดลทำงานบนอุปกรณ์ทั้งหมด

Pyannote (ออฟไลน์)

Pyannote segmentation-3.0 ให้ VAD ที่แม่นยำสูงโดยใช้สถาปัตยกรรม PyanNet โมเดลประมวลผลเสียงพูดในหน้าต่างเลื่อนขนาด 10 วินาที โดยมีการก้าวทีละ 1 วินาที จากนั้นรวมผลการพยากรณ์ที่ทับซ้อนกันและใช้การปรับให้เรียบแบบ hysteresis

สถาปัตยกรรม

ขั้นตอนรายละเอียด
SincNet40 ตัวกรองแถบความถี่ที่เรียนรู้ได้ (รวม 80: 40 cos + 40 sin)
BiLSTM4 ชั้น, hidden=128, สองทิศทาง (เอาต์พุต 256 มิติ)
Linear2 ชั้น linear กับ LeakyReLU (negative_slope=0.01)
เอาต์พุตSoftmax 7 คลาส พร้อมการประมวลผลภายหลังแบบ hysteresis

ขนาดโมเดล: ~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 เป็นโมเดลสตรีมมิ่งขนาดเล็กที่ประมวลผล chunk ขนาด 512 ตัวอย่าง (32 ms ที่ 16 kHz) ทำงานได้เร็วกว่าเรียลไทม์ 23 เท่าในโหมด release จึงเหมาะกับแอปพลิเคชันเสียงแบบสด

การแยก backend: ตอนนี้ MLX และ CoreML ใช้ export ของ Silero v6.2.1 เป็นค่าเริ่มต้นทั้งคู่: aufklarer/Silero-VAD-v6.2.1-MLX และ aufklarer/Silero-VAD-v6.2.1-CoreML ทั้งคู่ยังคง API สตรีมมิ่ง 32 ms เดิมไว้

สถาปัตยกรรม

ขั้นตอนรายละเอียด
STFTConv1d (1 ถึง 258 channels), reflection pad ฝั่งขวา 64
Encoder4x Conv1d + ReLU
LSTMHidden size 128 รักษาสถานะข้าม chunk
DecoderConv1d (128 ถึง 1) บนสถานะ hidden ของ LSTM, เอาต์พุต 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ทั้งสองค่าเกณฑ์ความน่าจะเป็นจุดเริ่มต้นเสียงพูด
--offsetทั้งสองค่าเกณฑ์ความน่าจะเป็นจุดสิ้นสุดเสียงพูด
--min-speechสตรีมมิ่งระยะเวลาขั้นต่ำของเซกเมนต์เสียงพูด (วินาที)
--min-silenceสตรีมมิ่งระยะเวลาเงียบขั้นต่ำเพื่อสิ้นสุดเซกเมนต์ (วินาที)
--engineสตรีมมิ่งEngine สำหรับ inference: mlx หรือ coreml
--jsonทั้งสองรูปแบบเอาต์พุต JSON
สำคัญ

สำหรับแอปพลิเคชันแบบเรียลไทม์ ให้ใช้ speech vad-stream กับ Silero VAD โมเดล Pyannote ต้องใช้ไฟล์เสียงทั้งหมดและเหมาะกว่าสำหรับการประมวลผลเป็นชุดแบบออฟไลน์ที่ให้ความสำคัญกับความแม่นยำเป็นหลัก

ดาวน์โหลดโมเดล

โมเดลBackendขนาด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

API ของ Swift

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")
    }
}

มีให้ใช้บน Android, Linux และ Windows ผ่าน ONNX Runtime ด้วยเช่นกัน