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

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

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 v5 (สตรีมมิ่ง)

Silero VAD v5 เป็นโมเดลสตรีมมิ่งขนาดเล็กที่ประมวลผล chunk ขนาด 512 ตัวอย่าง (32 ms ที่ 16 kHz) ทำงานได้เร็วกว่าเรียลไทม์ 23 เท่าในโหมด release จึงเหมาะกับแอปพลิเคชันเสียงแบบสด

สถาปัตยกรรม

ขั้นตอนรายละเอียด
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-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

// 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 ด้วยเช่นกัน