/ Модель

Характеристики

Лицензия
CC BY-NC-SA 4.0
Библиотека
teensyvad
Опубликована
22 авг 2026

teensy-vad-1

Поиск речи в аудиоАудио → label

Компактная модель VAD для выделения речевых участков в потоковом и записанном телефонном аудио с частотой 8 кГц.

0скачиваний за 30 дней0лайковвеса обновлены28 авг 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

Teensy/teensy-vad-1 — компактный детектор голосовой активности из семейства teensyvad. Модель разработана для изучения принципов VAD и применения в телефонных системах, включая Asterisk. Она принимает монофонический PCM-аудиосигнал с частотой 8 кГц и определяет речевые участки; доступны пакетная обработка и потоковые события начала и конца речи.

Модель использует трёхслойный MLP размером 400→48→24→1 с 20 449 параметрами. Входные признаки — логарифмические мел-спектры и их разности для контекста длительностью 100 мс. В репозитории есть ONNX-версии, в том числе динамическая INT8-квантизация. Обучение проводилось на английской читаемой речи LibriSpeech с добавлением экологического шума ESC-50 и телефонных искажений G.711; заявлены результаты на синтетических данных и публичных наборах аудио.

Модель рассчитана на задачи обнаружения речи в телефонном аудио и предварительной сегментации перед ASR. Обучающие данные не включали музыку и многоголосый шум; разметка сохраняет паузы внутри высказываний, поэтому границы сегментов могут быть неточными. Пороговые значения оптимизировались на синтетической валидации. Лицензия — CC BY-NC-SA 4.0, допускающая использование на условиях лицензии с ограничением на коммерческое применение.

Сценарии применения

  • выделение речи из аудиозаписей телефонных звонков
  • обнаружение начала и конца речи в потоке Asterisk
  • подготовка телефонного аудио к распознаванию речи
  • подсчёт времени речи в телефонном разговоре

Ограничения

Обучена на английской читаемой речи и экологическом шуме; музыка и многоголосый шум в обучении не использовались. Границы речи могут быть неточными из-за пауз внутри высказываний, а пороги калибровались на синтетической валидации.

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

teensy-vad-1 — a VAD small enough to understand

The first model of the teensyvad family: a complete voice activity detector in 20,449 parameters (87 KB), written in pure numpy with hand-written backprop — built to learn how VAD works and to run in an Asterisk telephony stack.

Telephony-native: 8 kHz, 16-bit mono — exactly what a phone call is. No resampling anywhere (PSTN / G.711 / Asterisk slin are all 8 kHz).

Quick Start

from teensyvad import OfflineVAD

# Standalone VAD — auto-downloads from the Hub (pip install huggingface_hub)
model = OfflineVAD("Teensy/teensy-vad-1")
result = model.segments("long_audio.wav")
# Returns speech segments: [[start_ms, end_ms], [start_ms, end_ms], ...]
print(result)                    # e.g. [[90, 5150]] — the fsmn-vad convention

Variant selection: OfflineVAD("Teensy/teensy-vad-1", model_file="teensy-v1-80k.npz") (see the variant table below). Local use without the hub: pass a .npz path. teensyvad is pure numpy (single package dir in the project repo) — the only dependency.

Use as Part of an ASR Pipeline

from teensyvad import OfflineVAD
from teensyvad.audio import write_wav

vad = OfflineVAD("Teensy/teensy-vad-1")
segments = vad.segments("meeting_2hours.wav")     # [[start_ms, end_ms], ...]

for i, (start_ms, end_ms) in enumerate(segments):
    seg = vad.slice("meeting_2hours.wav", start_ms, end_ms)  # float32 @ 8 kHz
    write_wav(f"speech_{i}.wav", seg, 8000)
    # text = my_asr.transcribe(f"speech_{i}.wav")  # <- your ASR here

Streaming / telephony (Asterisk AudioSocket): from teensyvad import StreamingVAD — feed 20 ms PCM16LE frames, get speech_start / speech_end events, vad.speech_seconds for talk time; a working server ships as scripts/audiosocket_server.py in the project repo.

Architecture

Model3-layer MLP, 400 → 48 → 24 → 1 (ReLU, sigmoid head)
Parameters20,449 (87 KB float32)
Input10 frames × (20 log-mel + 20 Δ) = 400 dims (100 ms context)
OutputP(speech) per 10 ms frame
Framing25 ms window / 10 ms hop @ 8 kHz
Speed~14 µs/frame numpy single, 0.27 µs batched; 6.6 µs ONNX single

Exact feature specification (reimplementable)

  1. Mono float32 8 kHz, frames of 200 samples (25 ms), hop 80 (10 ms).
  2. Per frame: Hann window → zero-padded FFT to 256 → power spectrum.
  3. 20 mel triangles over 80–3800 Hz (rows normalised to sum 1).
  4. log(mel + 1e-10), then subtract per-frame mean over bands (gain invariance — the model sees spectral shape, not level).
  5. First-order delta (current − previous), concatenate → 40 dims/frame.
  6. Stack 10 frames (oldest→newest, frame-major), standardise with the in_mean / in_std vectors stored in the .npz.

What's in this repo

filewhat
teensy-v1.npzfloat32 weights + norm stats + JSON metadata (thresholds, feature config)
teensy-v1.onnxsame model as ONNX (input normalisation folded in; raw 400-d features in, logit out)
teensy-v1-int8.onnxdynamic int8 ONNX (22 KB)

Minimal numpy inference:

import numpy as np, json
z = np.load("teensy-v1.npz")
meta = json.loads(str(z["meta"]))            # thresholds + feature config
def score(x):                                 # x: standardised 400-dim window
    h1 = np.maximum(x @ z["p/W1"] + z["p/b1"], 0)
    h2 = np.maximum(h1 @ z["p/W2"] + z["p/b2"], 0)
    return 1 / (1 + np.exp(-(h2 @ z["p/W3"] + z["p/b3"])))   # P(speech)

For streaming (chunk-in → speech_start/speech_end events out, with hysteresis + hangover) use the teensyvad source that accompanies this model family.

Training

  • Speech: LibriSpeech dev-clean (1,200 utterances, speaker-disjoint splits)
  • Noise: ESC-50 (fold-disjoint; human-vocal categories excluded)
  • Mixing: SNR 0–20 dB, 40 % of clips round-tripped through G.711 µ-law (realistic telephone degradation)
  • Labels: construction ground truth — a frame is speech iff the placed utterance covers its centre (utterance edges energy-trimmed)

Measured quality

benchmarkframe F1AUC
synthetic test (unseen speakers, unseen noise)0.9030.889
event-level streaming (120 clips)0.976—
TEN VAD public set (real recordings)0.8500.848
AMI SDM meetings (real rooms, manual labels)0.7430.835

The energy-baseline comparison that motivated this model: on the same streamed clips an adaptive energy VAD reaches event F1 0.535 (2.5× over-triggering) vs 0.976 here.

Limitations (honest)

  • English read-speech + environmental noise only; music and multi-talker babble were not in training (see teensy-vad-3 for those).
  • Labels include intra-utterance pauses marked "speech" — boundaries are loose (onset ~430 ms early vs a Silero teacher). teensy-vad-2 fixes this via distillation.
  • Operating thresholds stored in metadata were tuned on synthetic validation; real-domain thresholds differ (see v3's profiles).

Models in this repository (named variants)

All variants share the architecture and training recipe of this card — they differ only in hidden-layer size (88/48, 164/88, 200/96) and were trained to map the capacity/accuracy trade-off:

namefileparamsKBrole
teensy-v1teensy-v1.npz20,44987the original — family sweet spot
teensy-v1-40kteensy-v1-40k.npz39,609162capacity probe
teensy-v1-80kteensy-v1-80k.npz80,373321capacity probe (family's best AUCs)
teensy-v1-100kteensy-v1-100k.npz99,593396capacity probe

ONNX exports (float32 + dynamic int8) are provided for the 20k model.

Accuracy & speed of every variant

teensy-vad-1 variants vs baselines

(Measured on the shared protocol — TEN VAD public set + AMI SDM meetings, human labels, AMI-dev-calibrated operating points, AUC on raw probabilities; see BENCHMARKS.md. Note accuracy is flat across sizes: the 1M-frame training set saturates first — scaling capacity without scaling data buys nothing here.)

Comparison vs Energy / WebRTC / Silero

Same protocol for every system, human-labelled real audio, operating points calibrated on held-out AMI dev meetings (full appendix with charts and per-size results: teensy-vad-3/BENCHMARKS.md):

teensy-v1Silero VADWebRTC VADEnergy VAD
params20,4491,774,000~6k (C)—
TEN VAD set — AUC0.8480.952n/a0.670
AMI SDM — F1 (calibrated)0.8870.7140.8420.592
AMI SDM — AUC0.8350.8940.7600.658
µs / 20 ms chunk638927

Capacity note: this family was also trained at 40k/80k/100k params (files teensy-v1-{40k,80k,100k}.npz) — accuracy is flat across sizes because the 1M-frame training set saturates first; more parameters need more data (demonstrated by the v3 family). Silero ranks best by AUC (87× larger); its stock threshold misses 44 % of room speech — every calibrated teensy model beats it on AMI F1.

License & data

Code: MIT. Weights: CC BY-NC-SA 4.0 (training noise ESC-50 is CC BY-NC-SA 3.0; speech LibriSpeech CC BY 4.0). Not for commercial deployment without replacing the ESC-50-derived training data.

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм · teensyvad

Нельзя запустить

Задача «voice-activity-detection» пока не поддерживается рантаймом.

Ревизия весов
d9a5d55

0 моделей