whistlepops corpus #
Training set for meetings/detect-whistlepops.mjs — the detector that finds
whistle events in meeting recordings and labels them so the LaTeX builder can
turn them into section breaks, decision callouts, highlight blocks, etc.
Grammar that this corpus is meant to train #
- lone whistle (
single) → punctuation: section break / beat - whistle pair (
pair-open… speech …pair-close) → whistlepop: the speech between two whistles is interpreted as a directive to the pipeline, not part of the conversation transcript. Seemeetings/dsl.md.
The acoustic classes the detector learns are the actual sounds, not the grammatical roles — pairing is a post-pass over event timestamps. Classes:
short— quick tweetmedium— ~1s single pitchlong— 2–3s sustainedrising— two-tone, pitch upfalling— two-tone, pitch downquiet— soft, close-micfar— distant, room-mic
Negatives guard against false positives the detector is likely to confuse with whistles (vowels in the same band, hums, laughs, kettles, fan whine, keyboards).
How to record #
cd wave-wizard
swift run WaveWizard samples/whistlepops/spec.json
The wizard walks the sample list, speaks the prompt, waits for an onset,
records, auto-trims, then offers Keep / Retry / Skip. Output WAVs land in
takes/ named after the sample (pos-short-01.wav, …).
Goal: 3 takes of every positive variant + 3 takes of every negative class. ~40 prompts × ~15s of effort each ≈ 15–20 minutes of focused recording.
How the detector uses this #
meetings/detect-whistlepops.mjs loads every WAV under takes/, infers the
class label from the filename prefix (pos-* vs neg-*, then the variant),
extracts a feature vector (peak freq, bandwidth, harmonic ratio, sustain
duration, attack time, peak band concentration), and fits a small classifier
(k-NN or logistic regression — TBD once we see how separable the features
are). At inference time it slides over a meeting WAV, scores each window,
emits [{ kind, t_start, t_end, confidence }] events.
Acoustic variants (short / medium / long / rising / falling) are
preserved on output so a future DSL revision can use them as distinct
verbs without recapture (e.g. rising = "open", falling = "close").