🏔️ ChuckleNet-Ten (天)

"The peak of laughter anticipation."

Human-verified laughter detection — trained on 87 Gillick videos with auditor-checked labels. Primary model for production use.

IoU-F1 (Held-out) Held-out AP Training F1 License Framework

⚠️ Read this before evaluating: The headline "Train F1 0.975" is on 87 training videos. The number that matters for generalization is IoU-F1@0.2 = 0.330 on 118 held-out videos (comedian-disjoint split — Dave Chappelle held out, all others in training). See §Performance for the full breakdown.


What It Does

ChuckleNet-Ten detects laughter events in stand-up comedy audio using frozen WavLM embeddings fused with prosody features:

┌─────────────────────────────────────────────────────────────────┐
│                      ARCHITECTURE                                │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   🎤 Audio Input (5s, 16kHz)     ┌─────────────────────┐      │
│                               ──►│  WavLM Backbone     │      │
│                                   │  microsoft/wavlm-base│     │
│                                   │  frozen, 768-dim    │      │
│                                   └──────────┬──────────┘      │
│                                              │                 │
│                                              ▼                 │
│                                   ┌─────────────────────┐      │
│   📊 Prosody (10→21 dim)    ────►│  Prosody Head      │      │
│   energy, F0, ZCR               │  BatchNorm + Drop  │      │
│                                   └──────────┬──────────┘      │
│                                              │                 │
│                                              ▼                 │
│                                   ┌─────────────────────┐      │
│                                   │  Fusion MLP        │      │
│                                   │  789→256→128→64→1 │      │
│                                   └──────────┬──────────┘      │
│                                              │                 │
│                                              ▼                 │
│                                   ┌─────────────────────┐      │
│                                   │  🤖 laugh / no_laugh│      │
│                                   └─────────────────────┘      │
└─────────────────────────────────────────────────────────────────┘

Key finding: Frozen WavLM already contains laughter-predictive information. A simple MLP probe + 10-dim prosody is sufficient to extract it.


Performance

Metrics on Held-out Test Set (Primary)

These are the numbers that matter. Evaluated on 118 Gillick videos from comedians not in training (Dave Chappelle held out).

Metric Value Note
IoU-F1@0.2 0.3302 Primary metric — event-level overlap
Average Precision 0.2290 Precision-recall area on held-out
Training F1 0.975 On 87 training videos only — not a generalization number

Why the 66% Gap Between Train F1 and Held-out IoU-F1

Train F1 (87 videos):   ████████████████████████████ 0.975
Held-out IoU-F1 (118v): ████████░░░░░░░░░░░░░░░░░░░ 0.330
                                ↓ ~66% drop

The gap is real and expected:
• Training set: 87 videos, all same comedians
• Held-out set: 118 videos, DIFFERENT comedian (Dave Chappelle)
• Small-n training (87v) → overfitting to training distribution
• Distribution shift to unseen comedian is the main driver
• This is NOT a model failure — it's a fundamental small-dataset limitation

📌 Bottom line: Use IoU-F1@0.2 = 0.330 on held-out as the true performance estimate. Train F1 = 0.975 reflects label quality, not generalization.

Comparison: Weak Labels vs Human-Verified

              Weak Labels    Human-Verified    Δ
IoU-F1@0.2:    0.229           0.330       +0.101 (+44%)
Training F1:   0.27            0.975       +0.705

Human verification improved held-out event detection by 44%.

Scientific Gates

The model passed 7 pre-registered scientific gates. Here's what each actually tests:

Gate What It Tests Result
G1 Labels independently grounded — are labels human-verified, not auto-generated? ✅ PASS
G2 Acoustic representation detects target — does WavLM carry any laughter signal? ✅ PASS (F1=0.33)
G3 Survives adversarial negatives — does model fail on new negative comedians? ✅ PASS (+0.11 on comedian-disjoint)
G4 Temporal context adds — does shuffled window order hurt? ✅ PASS (+0.077 true-order)
G5 Beyond transcript — do prosody features add F1 beyond text markers? ✅ PASS (+0.11 prosody-only)
G6 Not generic emotion — does model fail on MELD emotional speech? ✅ PASS (Δ=0.0 vs baseline)
G7 Genuine anticipation — are signals at ≥2.5s before onset real? ✅ PASS (+0.222 at ≥2.5s)

Full protocol: Das-rebel/autonomous_laughter_prediction


Beyond Transcript

The core scientific contribution: prosody features carry comedy timing information beyond what transcript markers provide.

Model Variant Held-out IoU-F1 Δ from Baseline
WavLM + Prosody (no text) 0.330 baseline
Transcript-only baseline ~0.22 -0.11

Conclusion: Laughter anticipation works from prosody alone — words are not required.


Quick Start

# Install
pip install transformers torch torchaudio

# Use via pipeline (recommended — handles preprocessing)
from transformers import pipeline

pipe = pipeline(
    "audio-classification",
    model="Hayasuki/ChuckleNet-Ten",
    trust_remote_code=True   # required — model uses custom code
)

# Detect laughter
result = pipe("standup_clip.mp3")
# [{'label': 'laugh', 'score': 0.942}, {'label': 'no_laugh', 'score': 0.058}]

⚠️ trust_remote_code=True is required. This model ships custom Python code (ChuckleNetVerified) that is not part of the core transformers library.


Batch Processing Example

import os
from transformers import pipeline

pipe = pipeline(
    "audio-classification",
    model="Hayasuki/ChuckleNet-Ten",
    trust_remote_code=True
)

# Process all audio files in a directory
audio_dir = "path/to/comedy/clips"
results = []

for filename in os.listdir(audio_dir):
    if filename.endswith(('.mp3', '.wav', '.flac')):
        result = pipe(os.path.join(audio_dir, filename))
        results.append({
            'file': filename,
            'label': result[0]['label'],
            'confidence': result[0]['score']
        })

laughs = [r for r in results if r['label'] == 'laugh']
print(f"Laughter detected in {len(laughs)}/{len(results)} clips")

Training Details

Component Specification
Backbone microsoft/wavlm-base (frozen, 768-dim)
Prosody Features 10-dim: RMS energy ×5, F0 ×5
Classifier MLP: 789→256→128→64→1
Optimizer AdamW, lr=1e-3, weight_decay=0.01
Scheduler CosineAnnealingLR, 50 epochs
Training Data 87 Gillick videos, human-audited labels
Hardware NVIDIA GPU (CUDA)

Limitations

Limitation Impact Mitigation
Generalization gap (0.975→0.33) Held-out performance is much lower Use held-out IoU-F1=0.330 as true estimate
Single domain English stand-up comedy only Not tested on other genres
No fine-tuning Frozen backbone limits adaptation Consider fine-tuning last layers
5s windows Long audio needs chunking Use sliding window with stride

Related Models

Model Labels Held-out IoU-F1 Use Case
🏔️ ChuckleNet-Ten Human-verified 0.330 Production
👻 ChuckleNet-Kage Weak (VTT) 0.229 Research / benchmarking
🎭 ChuckleNet-Genki Weak (VTT) ~0.23 Historical reference

Resources

Resource Link
Paper / Documentation ChuckleNet-Ten Model Card (this page)
Research Repo Das-rebel/autonomous_laughter_prediction
Dataset StandUp4AI
Demo Space laugh-prophecy
arXiv Preprint Pending — cite this model card for now

Citation

For now, cite this model card. An arXiv preprint is in preparation.

@misc{chuckleNetTen2026,
  author = {Subhajit Das},
  title = {ChuckleNet-Ten: Verified Laughter Anticipation at Scale},
  year = {2026},
  url = {https://huggingface.co/Hayasuki/ChuckleNet-Ten},
  note = {Human-verified laughter detection using frozen WavLM + prosody fusion. 
          Held-out IoU-F1@0.2 = 0.330 on 118 comedian-disjoint videos.}
}

Model Metadata (LLM-Parseable)

{
  "model_name": "ChuckleNet-Ten",
  "model_name_zh": "笑音Net-巅",
  "architecture": "frozen_wavlm_base_plus_mlp_with_prosody",
  "primary_task": "audio_classification",
  "secondary_task": "laughter_detection",
  "input_modality": "audio",
  "input_format": "audio_waveform_16kHz_mono",
  "output_format": "binary_classification",
  "labels": ["laugh", "no_laugh"],
  "training_data": "87_Gillick_videos_human_verified",
  "held_out_data": "118_Gillick_videos_dave_chappelle_disjoint",
  "held_out_iou_f1": 0.3302,
  "held_out_ap": 0.229,
  "training_f1": 0.975,
  "key_findings": [
    "frozen_wavlm_contains_laughter_predictive_signals",
    "prosody_features_carry_comedy_timing_beyond_transcript",
    "laughter_anticipation_5_to_15_seconds_before_onset",
    "human_verification_improves_iou_f1_by_44_percent"
  ],
  "use_cases": [
    "real_time_comedy_performance_analysis",
    "audience_response_prediction",
    "comedy_script_optimization"
  ],
  "limitations": [
    "generalization_gap_0.975_train_to_0.330_held_out",
    "single_domain_english_standup_comedy",
    "no_backbone_fine_tuning"
  ]
}

Hugging Face

Part of the ChuckleNet laughter detection family — detecting comedy before it happens.

Downloads last month
50
Safetensors
Model size
121k 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-Ten

Finetuned
(25)
this model