Context
Silero VAD (v6.x, MIT) is the de-facto on-device voice activity detector. A SKaiNET consumer currently has to ship ONNX Runtime only for it, next to whatever runs the ASR model, which costs a second native runtime, an extra ~2.3 MB model on a separate loader, and a minSdk floor set by ORT rather than by SKaiNET.
The model is small: an STFT front end baked into the graph as conv weights, a conv encoder, one LSTM cell with a carried [2,1,128] state, and a dense sigmoid head. Input per call is a 64-sample context prepended to a 512-sample frame at 16 kHz. Lstm with LstmState(h, c) and an explicit step already exists in skainet-lang-core (#823), which was added with exactly this kind of streaming use in mind.
Scope
Non-goals
- Importing the Silero graph through the ONNX graph importer. That needs LSTM/Gather/Unsqueeze/Where/If converters and is tracked separately as the verification path; the hand-written module is the shipping path.
Related
Context
Silero VAD (v6.x, MIT) is the de-facto on-device voice activity detector. A SKaiNET consumer currently has to ship ONNX Runtime only for it, next to whatever runs the ASR model, which costs a second native runtime, an extra ~2.3 MB model on a separate loader, and a minSdk floor set by ORT rather than by SKaiNET.
The model is small: an STFT front end baked into the graph as conv weights, a conv encoder, one LSTM cell with a carried
[2,1,128]state, and a dense sigmoid head. Input per call is a 64-sample context prepended to a 512-sample frame at 16 kHz.LstmwithLstmState(h, c)and an explicitstepalready exists inskainet-lang-core(#823), which was added with exactly this kind of streaming use in mind.Scope
SileroVadmodule (skainet-modelsor a newskainet-model-vad): the graph expressed withctx.ops.*only, so it runs eagerly and lowers through the tape path like every other SKaiNET model. ReuseLstm.silero_vad.onnxthroughskainet-io-onnx's weight reader (no new file format; upstream stays the source of truth). Load the STFT basis as weights rather than re-deriving it so the model matches bit for bit.process(frame: FloatArray): Floatreturning speech probability,reset(), and the state carried across calls; aVoiceActivityDetector-shaped adapter for the audio-side libraries.Non-goals
Related
Lstmlayer with explicit state step API