Wren Audio Classifier
Relevant source files
The following files were used as context for generating this wiki page:
Wren is a family of tiny, on-device convolutional neural network (CNN) audio classifiers developed for the Crisp macOS application. Its primary purpose is to provide a fast, English-only alternative to full speech-to-text models (like Whisper) for the specific task of detecting filler words such as "um" and "uh" in speech audio. By focusing solely on audio classification rather than full transcription, Wren achieves speeds up to 600× real-time while maintaining high precision.
Sources: research/NOTES.md:14-20, research/filler_classifier/MODEL_CARD.md:9-15, research/README.md:5-10
Architecture and Versions
Wren has evolved through two distinct generations, transitioning from a chunk-based classifier to a context-aware temporal sequence model.
Generation 1 (v0.0.8)
The original Wren model is a tiny 2-D CNN consisting of approximately 75k parameters (94 KB on disk). It operates on 250 ms log-mel "chunks" and outputs a binary probability indicating whether the chunk represents a filler word or normal speech.
Generation 2 (v2 / v0.0.9+)
Wren v2 is a context-aware model utilizing a Dilated Temporal Convolutional Network (TCN) with approximately 129k parameters. Unlike v1, which only "hears" 250 ms at a time, v2 features a ~2.5s receptive field, allowing it to distinguish between "removable" isolated fillers and "natural" fillers embedded mid-sentence that should not be cut.
Sources: research/NOTES.md:14-16, research/NOTES.md:142-152, research/filler_classifier/MODEL_CARD.md:9-12
Model Logic Flow
The following diagram illustrates how the Wren system processes raw audio into detected filler intervals.
The system uses a shared audio frontend for feature extraction regardless of the model generation.
Sources: apps/desktop/Sources/crisp-filler/main.swift:234-245, research/NOTES.md:175-185
Audio Feature Extraction (Frontend)
To maintain parity between training (Python) and inference (Swift), the system uses a specific log-mel transformation. Because the Fast Fourier Transform (FFT) size is not a power of two (n_fft=400), the Swift implementation performs the Discrete Fourier Transform (DFT) as a BLAS matrix multiply using the Accelerate framework.
| Parameter | Value | Description |
|---|---|---|
Sample Rate | 16,000 Hz | Standardized mono input |
n_fft | 400 | Window size for Fourier Transform |
hop_length | 160 | Step size between frames (10 ms) |
n_mels | 64 | Number of Mel filterbank bins |
MEL_MEAN | -18.5658 | Fixed constant for normalization |
MEL_STD | 17.9252 | Fixed constant for normalization |
Sources: apps/desktop/Sources/crisp-filler/main.swift:23-33, research/filler_classifier/MODEL_CARD.md:20-22, research/README.md:73-77
Integration and Tooling
The crisp-filler Helper
The Crisp desktop application interacts with the ML model through a standalone Swift helper tool named crisp-filler. This tool is bundled within the engine and is responsible for reading WAV files, computing features, running Core ML inference, and outputting JSON spans.
Configuration and Manifests
Each model is accompanied by a config.json file. This allows the helper to be model-agnostic, loading specific parameters for different model generations without hardcoding logic.
{
"model_type": "sequence",
"input": "mel",
"output": "removable_prob",
"recommended_threshold": 0.85,
"min_filler": 0.30
}
Sources: apps/desktop/Sources/crisp-filler/main.swift:37-63, research/filler_classifier/publish_hf.py:59-79
Training and Data
Wren is trained primarily on the PodcastFillers dataset, featuring ~35k human-labeled "uh"/"um" events from 350+ speakers.
Data Processing Pipeline
To reduce over-cutting in real-world scenarios, Wren v2 uses "Hard Negatives"—audio segments that sound like fillers but are linguistically natural—to train the model to ignore them.
Sources: research/NOTES.md:27-36, research/NOTES.md:144-150, research/MODEL_RESEARCH.md:92-105
Deployment and Updates
Models are hosted on Hugging Face and use a channel-based deployment strategy mirroring the application itself.
- Branches:
nightly(staging) andmain(stable). - Versioning: Based on commit count (
v0.0.N). - Update Flow: The app polls the manifest (
config.json) on the relevant channel branch. If theversionormodel_sha256differs from the local copy, the app prompts for a model update.
Sources: research/filler_classifier/publish_hf.py:38-56, research/NOTES.md:104-124
Performance and Benchmarks
Wren prioritizes precision to avoid cutting legitimate speech, which would result in jarring video edits.
| Metric | Wren v1 (0.7 Thr) | Wren v2 (v0.0.9) |
|---|---|---|
| Precision | 0.944 | ~0.67 (Isolated Only) |
| Recall | 0.894 | ~0.82 |
| F1 Score | 0.918 | 0.74 (Targeting Removability) |
| Speed | 600× Real-time | ~600× Real-time |
Sources: research/filler_classifier/MODEL_CARD.md:36-41, research/NOTES.md:160-165
Summary
The Wren Audio Classifier provides the Crisp application with a highly efficient, on-device mechanism for removing filler words. By utilizing a custom Dilated TCN architecture and a specialized BLAS-based feature extraction frontend, it avoids the high computational overhead of full ASR models while delivering context-aware editing decisions that preserve the natural flow of human speech.