---
title: ChuckleNet-Ten β Peak Achievement
emoji: ποΈ
colorFrom: green
colorTo: gold
sdk: gradio
pipeline_tag: audio-classification
license: mit
library_name: transformers
base_model: microsoft/wavlm-base
tags:
- audio-classification
- laughter-detection
- laughter-anticipation
- wavlm
- speech
- humor
- stand-up-comedy
- transformers
- ten
- human-verified
metrics:
- f1
- iou_f1
- average_precision
datasets:
- Gillick-87
- StandUp4AI
papers:
- https://huggingface.co/Hayasuki/ChuckleNet-Ten
---
# ποΈ 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.**
[](https://huggingface.co/Hayasuki/ChuckleNet-Ten)
[](https://huggingface.co/Hayasuki/ChuckleNet-Ten)
[](https://huggingface.co/Hayasuki/ChuckleNet-Ten)
[](https://opensource.org/licenses/MIT)
[](https://huggingface.co/docs/transformers)
> β οΈ **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](https://huggingface.co/Hayasuki/ChuckleNet-Ten)
---
## 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
```python
# 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
```python
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](https://huggingface.co/Hayasuki/ChuckleNet-Ten) (this page) |
| **Research Repo** | [Das-rebel/autonomous_laughter_prediction](https://huggingface.co/Hayasuki/ChuckleNet-Ten) |
| **Dataset** | [StandUp4AI](https://github.com/Standup4AI/dataset) |
| **Demo Space** | [laugh-prophecy](https://huggingface.co/spaces/Hayasuki/chucklenet) |
| **arXiv Preprint** | Pending β cite this model card for now |
---
## Citation
*For now, cite this model card. An arXiv preprint is in preparation.*
```bibtex
@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)
```json
{
"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"
]
}
```
---
[](https://huggingface.co/Hayasuki/ChuckleNet-Ten)
*Part of the ChuckleNet laughter detection family β detecting comedy before it happens.*