🎭 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

Open in Colab

Kaggle

Live Demo


📖 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
Safetensors
Model size
230k params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Hayasuki/chucklenet-laughter-detector

Finetuned
(23)
this model