File size: 13,004 Bytes
0e7f317
2af58cd
 
0e7f317
2af58cd
 
0e7f317
 
 
 
 
 
 
 
 
 
 
 
 
2af58cd
 
0e7f317
 
 
6de1c9c
2af58cd
 
8620c49
0e7f317
2fdc6c1
0e7f317
 
8620c49
 
2af58cd
0e7f317
8620c49
 
2fdc6c1
8620c49
2fdc6c1
 
 
8620c49
 
0e7f317
2fdc6c1
8620c49
 
0e7f317
 
 
2fdc6c1
6de1c9c
2fdc6c1
6de1c9c
 
 
2fdc6c1
6de1c9c
 
2fdc6c1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6de1c9c
 
 
2fdc6c1
0e7f317
 
 
2fdc6c1
0e7f317
2fdc6c1
0e7f317
2fdc6c1
6de1c9c
2fdc6c1
 
 
 
 
0e7f317
2fdc6c1
0e7f317
8620c49
2fdc6c1
 
 
 
 
 
 
 
 
 
8620c49
 
2fdc6c1
8620c49
2fdc6c1
8620c49
 
2fdc6c1
 
 
 
 
8620c49
2af58cd
 
0e7f317
2fdc6c1
8620c49
2fdc6c1
2af58cd
2fdc6c1
 
 
 
 
 
 
 
 
8620c49
2fdc6c1
2af58cd
2fdc6c1
8620c49
2fdc6c1
8620c49
2fdc6c1
8620c49
2fdc6c1
 
 
 
0e7f317
2fdc6c1
0e7f317
2fdc6c1
6de1c9c
2fdc6c1
0e7f317
 
2fdc6c1
8620c49
 
2fdc6c1
0e7f317
 
 
 
2af58cd
2fdc6c1
0e7f317
 
2fdc6c1
8620c49
 
0e7f317
 
2fdc6c1
6de1c9c
2fdc6c1
6de1c9c
2fdc6c1
6de1c9c
 
 
 
 
 
 
 
 
 
 
2fdc6c1
6de1c9c
 
 
 
 
2fdc6c1
6de1c9c
 
 
 
 
2fdc6c1
6de1c9c
2fdc6c1
6de1c9c
 
 
 
2fdc6c1
6de1c9c
2fdc6c1
 
 
 
 
 
 
 
 
6de1c9c
0e7f317
 
2fdc6c1
0e7f317
2fdc6c1
 
 
 
 
 
0e7f317
 
 
2fdc6c1
8620c49
2fdc6c1
 
 
 
 
8620c49
 
 
2fdc6c1
8620c49
2fdc6c1
 
 
 
 
 
 
8620c49
 
 
2fdc6c1
8620c49
2fdc6c1
0e7f317
 
2af58cd
0e7f317
2af58cd
0e7f317
8620c49
2fdc6c1
 
0e7f317
 
 
 
 
2fdc6c1
6de1c9c
 
 
 
 
2fdc6c1
6de1c9c
 
 
 
 
 
 
2fdc6c1
 
 
 
6de1c9c
 
 
2fdc6c1
 
6de1c9c
 
 
 
2fdc6c1
6de1c9c
 
2fdc6c1
6de1c9c
2fdc6c1
6de1c9c
 
 
 
 
 
8620c49
0e7f317
8620c49
0e7f317
2fdc6c1
0e7f317
8620c49
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
---
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
---

<div align="center">

# 🏔️ 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)](https://img.shields.io/badge/IoU--F1%400.2-0.330-brightgreen?style=flat-square)](https://huggingface.co/Hayasuki/ChuckleNet-Ten)
[![Held-out AP](https://img.shields.io/badge/AP-0.229-yellow?style=flat-square)](https://huggingface.co/Hayasuki/ChuckleNet-Ten)
[![Training F1](https://img.shields.io/badge/Train%20F1-0.975-blue?style=flat-square)](https://huggingface.co/Hayasuki/ChuckleNet-Ten)
[![License](https://img.shields.io/badge/License-MIT-green?style=flat-square)](https://opensource.org/licenses/MIT)
[![Framework](https://img.shields.io/badge/Framework-Transformers-orange?style=flat-square)](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.

</div>

---

## 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"
  ]
}
```

---

<div align="center">

[![Hugging Face](https://img.shields.io/badge/🤗-Hugging%20Face-FFD21E?style=for-the-badge&logo=huggingface)](https://huggingface.co/Hayasuki/ChuckleNet-Ten)

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

</div>