การตรวจจับเสียงพูด — Silero VAD v5
มีโมเดล VAD ให้เลือกสองตัว ได้แก่ Pyannote segmentation สำหรับการประมวลผลเป็นชุดแบบออฟไลน์ที่มีความแม่นยำสูง และ Silero VAD v5 สำหรับการตรวจจับแบบสตรีมมิ่งที่มีดีเลย์ต่ำ ทั้งสองโมเดลทำงานบนอุปกรณ์ทั้งหมด
Pyannote (ออฟไลน์)
Pyannote segmentation-3.0 ให้ VAD ที่แม่นยำสูงโดยใช้สถาปัตยกรรม PyanNet โมเดลประมวลผลเสียงพูดในหน้าต่างเลื่อนขนาด 10 วินาที โดยมีการก้าวทีละ 1 วินาที จากนั้นรวมผลการพยากรณ์ที่ทับซ้อนกันและใช้การปรับให้เรียบแบบ hysteresis
สถาปัตยกรรม
| ขั้นตอน | รายละเอียด |
|---|---|
| SincNet | 40 ตัวกรองแถบความถี่ที่เรียนรู้ได้ (รวม 80: 40 cos + 40 sin) |
| BiLSTM | 4 ชั้น, hidden=128, สองทิศทาง (เอาต์พุต 256 มิติ) |
| Linear | 2 ชั้น linear กับ LeakyReLU (negative_slope=0.01) |
| เอาต์พุต | Softmax 7 คลาส พร้อมการประมวลผลภายหลังแบบ hysteresis |
ขนาดโมเดล: ~1.49M พารามิเตอร์, ~5.7 MB บนดิสก์
ค่าเกณฑ์เริ่มต้น
- Onset:
0.767— ค่าความน่าจะเป็นที่เกินกว่านี้จะถือว่าตรวจพบเสียงพูด - Offset:
0.377— ค่าความน่าจะเป็นที่ต่ำกว่านี้จะถือว่าเสียงพูดสิ้นสุดแล้ว
การใช้งาน CLI
# VAD ออฟไลน์
.build/release/speech vad recording.wav
# เอาต์พุต JSON
.build/release/speech vad recording.wav --json
# กำหนดค่าเกณฑ์เอง
.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 จึงเหมาะกับแอปพลิเคชันเสียงแบบสด
สถาปัตยกรรม
| ขั้นตอน | รายละเอียด |
|---|---|
| STFT | Conv1d (1 ถึง 258 channels), reflection pad ฝั่งขวา 64 |
| Encoder | 4x Conv1d + ReLU |
| LSTM | Hidden size 128 รักษาสถานะข้าม chunk |
| Decoder | Conv1d (128 ถึง 1) บนสถานะ hidden ของ LSTM, เอาต์พุต 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/speech vad-stream recording.wav
# กำหนดค่าเกณฑ์เอง
.build/release/speech vad-stream recording.wav --onset 0.6 --offset 0.3
# ระยะเวลาขั้นต่ำ
.build/release/speech vad-stream recording.wav --min-speech 0.5 --min-silence 0.2
# เลือก 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-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 |
API ของ Swift
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")
}
}
มีให้ใช้บน Android และ Linux ผ่าน ONNX Runtime ด้วยเช่นกัน