--- 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.** [![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.
--- ## 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" ] } ``` ---
[![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.*