Maskinöversättning · Engelskt original
Voice Activity Detection – Silero VAD
Två VAD modeller är tillgängliga: Pyannote segmentering för offline batch bearbetning med hög noggrannhet och Silero VAD för streaming low-latency detection. Båda kör helt på-enhet.
Pyannote (Offline)
Pyannote segmentation-3.0 ger hög noggrannhet VAD med hjälp av en PyanNet-arkitektur. Det behandlar tal i 10-sekunds glidande fönster med ett 1-sekunders steg, sedan aggregerar överlappande förutsägelser och tillämpar hysteresutjämning.
Arkitektur
| Steg | Detaljer |
|---|---|
| SincNet | 40 lärda bandpassfilter (80 totalt: 40 cos + 40 sin) |
| BiLSTM | 4 lager, dolda = 128, bidirectional (256-dim utgång) |
| Linjär | 2 linjära lager med LeakyReLU (negative_slope=0.01) |
| Output | 7-klass softmax med hysteres efterbehandling |
Modellstorlek: ~ 1,49M parametrar, ~ 5,7 MB på disken.
Standard trösklar
0.767- sannolikhet över vilket tal som detekteras- Offset:
0.377- sannolikhet under vilket tal slutar
CLI Användning
# 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 (Streaming)
Silero VAD är en lätt streaming modell som processer 512-prov bitar (32 ms vid 16 kHz). Det körs vid 23x realtid i släppläge, vilket gör det lämpligt för levande ljudapplikationer.
Backend split: MLX och CoreML nu båda standard till Silero v6.2.1 export: aufklarer/Silero-VAD-v6.2.1-MLX och aufklarer/Silero-VAD-v6.2.1-CoreMLBåda håller samma 32 ms streaming API.
Arkitektur
| Steg | Detaljer |
|---|---|
| STFT | Conv1d (1 till 258 kanaler), endast reflektionsplatta på 64 |
| Encoder | 4x Conv1d + ReLU |
| LSTM | Dold storlek 128, staten bärs över bitar |
| Decoder | Conv1d (128 till 1) på LSTM dolda tillstånd, sigmoidutgång |
Modellstorlek: ~ 309K parametrar, ~ 1,2 MB på disk.
Streaming State Machine
streaming VAD processor använder en 4-statsmaskin för att producera rena talsegment:
- tystnad - inget tal som upptäckts
- pendingSpeech - inställd tröskel korsades, väntar på minsta tal varaktighet
- speech — bekräftat talsegment pågår
- pendingSilence - kompenserad tröskel överskrids och väntar på minsta tystnadslängd
Standard trösklar
- Onset:
0.5 - Offset:
0.35 - Minsta tallängd:
0.25s - Minsta tystnadstid:
0.1s
CLI Användning
# 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
Alternativ
| Alternativ | Gäller för | Beskrivning |
|---|---|---|
--onset | Båda båda två | Tal inställd sannolikhet tröskel |
--offset | Båda båda två | Tal offset sannolikhet tröskel |
--min-speech | Streaming | Minsta talsegmentets varaktighet (sekunder) |
--min-silence | Streaming | Minsta tystnadslängden för slutsegmentet (sekunder) |
--engine | Streaming | Inferensmotor: mlx eller coreml |
--json | Båda båda två | JSON utdata format |
För realtidsapplikationer, använd speech vad-stream med Silero VAD. Pyannote-modellen kräver fullständig ljudfil och passar bättre för offline batch bearbetning där noggrannhet är prioritet.
En VAD hör bara tystnad, så det kan inte berätta en färdig mening från en paus mitten av meningen. Fäst Smart Turn v3.2 till StreamingVADProcessor - eller kör speech vad-stream --smart-turn - för att bekräfta varje paus innan segmentet slutar:
Modell nedladdningar
| Modell | Backend | Storlek | HuggingFace |
|---|---|---|---|
| Silero-VAD-v6.2.1 | MLX | ~1.2 MB | aufklarer/Silero-VAD-v6.2.1-MLX |
| Silero-VAD-v6.2.1 | CoreML | ~1.2 MB | aufklarer/Silero-VAD-v6.2.1-CoreML |
| Pyannote-Segmentation-3.0 | MLX | ~5.7 MB | aufklarer/Pyannote-Segmentation-MLX |
Swift API
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")
}
}
Också tillgänglig på Android, och på Linux & Windows genom Speech Core (ONNX Runtime).