Instructions to use Hayasuki/chucklenet-laughter-detector with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Hayasuki/chucklenet-laughter-detector with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("audio-classification", model="Hayasuki/chucklenet-laughter-detector", trust_remote_code=True)# Load model directly from transformers import AutoModelForAudioClassification model = AutoModelForAudioClassification.from_pretrained("Hayasuki/chucklenet-laughter-detector", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
🎭 ChuckleNet — Laughter Detection in Stand-Up Comedy
Find the funny moments. ChuckleNet takes any stand-up comedy audio and returns timestamps of laughter events — audience reactions, performer laughs, and the beats between punchlines that get the biggest response.
Built on a frozen microsoft/wavlm-base encoder + a 230K parameter MLP head. Drop-in via Transformers pipeline or use model.detect(audio, sr) for timestamped events.
⚠️ Labels are transcript-markers (
[laughter]cues from VTT files), not human-audited gold labels. This is explicitly a weak-label evaluation. On a 118-video human-verified subset the same architecture reaches IoU-F1 0.30–0.40. See the ChuckleNet repo for the full pre-registered experiment log.
⚡ Quick Start
1-line pipeline (easiest)
from transformers import pipeline
pipe = pipeline("audio-classification", model="Hayasuki/chucklenet-laughter-detector", trust_remote_code=True)
# Done — pipe now has a .detect() method
model.detect() — timestamps directly
import librosa
from transformers import AutoModelForAudioClassification
model = AutoModelForAudioClassification.from_pretrained(
"Hayasuki/chucklenet-laughter-detector",
trust_remote_code=True
)
audio, sr = librosa.load("comedy_special.mp3", sr=None) # any sr, mono
events = model.detect(audio, sr=sr, threshold=0.5) # lower threshold = more recalls
for ev in events:
print(f"{ev['start']:6.2f}s → {ev['end']:6.2f}s confidence={ev['p']:.2f}")
Output looks like:
1.23s → 4.51s confidence=0.91 ← big audience laugh
12.07s → 13.82s confidence=0.87
18.40s → 19.15s confidence=0.54 ← quiet chuckle
detect() runs energy VAD → segment padding/splitting → batch scoring → merge adjacent detections (gap ≤ 0.3s). Default threshold=0.85 is precision-oriented; drop to 0.5 for recall-heavy use.
📊 Evaluation Results
Weak-label eval (124 held-out videos, video-disjoint)
Trained on 620 videos · 121,928 utterance segments · 1,965 positives (1.6%)
| Metric | Value |
|---|---|
| Utterance-level F1 (thr=0.85) | 0.2732 |
| Event IoU-F1 @ 0.2 overlap | 0.2290 (P=0.281, R=0.193) |
| Average Precision | 0.142 |
Human-verified subset (118 videos, pre-registered)
On a subset with word-level human-verified labels, the same architecture reaches IoU-F1 0.30–0.40 and beats order-shuffled acoustic controls by +0.09 F1 — demonstrating the model captures real temporal interaction signal, not just static acoustics.
What does this beat?
- Order-shuffled baseline: +0.09 F1 improvement over shuffled controls (pre-registered, p<0.05)
- Acoustic-only controls: Survives breath/cough/applause/cheer controls (mean FPR=0.189 < 0.2, E01 SUPPORTED)
🔬 Scientific Context
ChuckleNet is a pre-registered research program testing whether interaction behavior carries information beyond what words alone provide.
| Finding | Result |
|---|---|
| E01 — Robustness: Survives breath/cough/applause/cheer/silence controls | ✅ SUPPORTED |
| E02 — Temporal order matters: Sequence order carries laughter-predictive signal beyond static acoustics | ✅ REPLICATED (+0.034 / +0.087 F1) |
| E05 — Scope: Beyond-words signal is specific to laughter/reaction, not general emotion | ✅ SUPPORTED |
See the full pre-registered log for experiment details.
🏗️ Architecture
| Component | Detail |
|---|---|
| Encoder | microsoft/wavlm-base (frozen) · 768-d mean-pooled last hidden state |
| Head | 768 → 256 → 128 → 1 MLP · ReLU · Dropout 0.3/0.2 |
| Trainable params | 230K (entire head < 1 MB) |
| Loss | BCEWithLogitsLoss · pos_weight = N_neg/N_pos |
| Optimizer | AdamW · lr=1e-3 · wd=1e-4 · cosine schedule · 30 epochs |
| Split | GroupShuffleSplit by video · 80/20 · seed=42 · no video overlap |
🎯 Intended Use
Great for:
- Finding the funniest moments / laugh lines in comedy specials
- Ranking segments by laughter intensity for highlight reels
- Reaction-event research in performed monologue audio
- Building "best-of" compilations automatically
Not verified for:
- Multi-party conversation (meetings, podcasts)
- Phone/call audio
- Non-English speech
- General emotion classification (see E05 above — behavior ≠ emotion)
📦 Files
| File | Purpose |
|---|---|
model.safetensors |
Trained MLP head weights (230K params) |
config.json |
Model configuration |
modeling_chucklenet.py |
ChuckleNetDetector class + detect() pipeline |
README.md |
This card |
🔗 Try It Now
📖 Citation
@misc{das2026chucklenet,
author = {Subhajit Das},
title = {ChuckleNet: Temporal Interaction Signals for Laughter Detection in Stand-Up Comedy},
year = {2026},
url = {https://github.com/Das-rebel/ChuckleNet},
note = {Preprint forthcoming}
}
- Downloads last month
- 28
Model tree for Hayasuki/chucklenet-laughter-detector
Base model
microsoft/wavlm-base