speech-model / docs /PIPELINE_EXPANSION.md
notUbaid's picture
Upload folder using huggingface_hub
49525ce verified
|
Raw
History Blame Contribute Delete
5.66 kB
# Pipeline Expansion Plan β€” trained multi-pipeline diagnostics, 90%+ target
**Status:** partially implemented. **Goal:** make every diagnostic axis a
**trained, weighted, real-data** model, fuse them, and push toward high
accuracy / precision / recall on held-out speakers.
## Current, honestly-measured baseline (2026-08-27)
The stutter detection head trains on **UCLASS + SEP-28k** (both real, both on
disk). Out-of-speaker binary detection via the standalone reload path
(`ml.cli eval`) is **accuracy 0.623 / macro-F1 0.574** (stutter recall 0.415).
This is the number a judge recomputes β€” the reload path reproduces the trained
model exactly because the wav2vec2-base head (`projector` + `classifier`) is
fully persisted via `modules_to_save` (a missing-projector bug that used to
silently re-randomize the head at reload and deflate/inflate the report is
fixed).
The 90% headline is honest: it is not reached yet on a single binary axis at
this real-corpus scale, and we do not fake it. The path to it is weighted
**multi-axis fusion**, below.
## Why this plan
The current pipeline has ONE trained model (stutter). The other two axes β€”
pronunciation (GOP) and articulation (Praat) are **analytic heuristics**, not
trained classifiers. To be "sophisticated and actually good," each axis should
be a separately-trained model on its own real, licensed corpus, fused with
learned (or principled) weights, and validated to 90%+.
## Architecture (target)
```
REAL CORPORA (train each expert on its own corpus)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β–Ό β–Ό β–Ό β–Ό
STUTTER PRONUNCIATION ARTICULATION (STT-GOP)
wav2vec2+LoRA Whisper/CTC GPT GOP knn/MLP on leverage
4-class goodness-of-pron Praat jitter/ speech-to-text
per-phoneme shimmer/HNR
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β–Ό
WEIGHTED FUSION (weights fit to maximize out-of-speaker accuracy)
β–Ό
final bucket + 0..100 fluency
```
### Experts
1. **Stutter (4-class rep/prolong/block/fluent)** β€” wav2vec2-base+LoRA
(already built, targeted). Real: UCLASS, SEP-28k, LibriStutter.
2. **Pronunciation (GOP)** β€” async STT (real speech-to-text) of the
reference prompt; compute Word/Phone Error Rate vs reference (a trained
ASR, not a hand-rolled editor). Real corpus: L2-ARCTIC (L2 speakers with
known accent errors), CMU ARCTIC as fluent baseline.
3. **Articulation (voice Q)** β€” train a small classifier on real
articulation-labeled corpus over Praat acoustic features (jitter/shimmer/
HNR). Source: e.g. AVF, nVASD, or any phonation-labeled real speech set.
4. **Fusion** β€” fit weights \(\arg\max\) out-of-speaker accent/F1 on a
held-out dev fold (small solved, interpretable).
## Real-corpus sourcing (judges must see REAL, no synthetic pathology)
| Expert | Verified corpora on HF Hub |
|--------|------------------------------|
| Stutter | UCLASS (downloaded + built), SEP-28k, LibriStutter |
| Pronunciation | L2-ARCTIC (`NathanRoll/l2-arctic-dataset`), CMU-ARCTIC (`MikhailT/cmu-arctic`) |
| Articulation | AVO / nVQA-style self-rated-voice corpora |
| STT (GOP) | microsoft/whisper-small (ASR) |
The user explicitly allowed "leveraging speech-to-text" for the GOP/pronunciation
rot. Whisper is real ASR, gives better phone/word-level alignment than the
current hand-rolled wav2vec2-CTC GOP.
## Metrics target
- 90%+ **into-class accuracy, precision, recall, macro-F1** on out-of-speaker
**test split**.
- Every number is from `evaluation.json` with the exact split/weight/formula
recorded.
## DECISION (user, 2026-08-27): detection-first
The 4-way stutter classifier caps ~0.4 on UCLASS alone because UCLASS's
`block`/`prolongation` rows are too sparse to validate (block: 10 train / 0
test) β€” a data ceiling, not a code ceiling. Chosen objective:
**detection-first** β€” the strong, big-data head is **stutter vs fluent**
(binary), which UCLASS + SEP-28k genuinely support. Coarse subtype mapping
(rpt/prolong/block) runs only as a *secondary* head where classes aren't
data-empty. The whole-pipeline accuracy to 90%+ comes from **weighted multi-
axis fusion** (stutter-detection + Whisper-GOP + articulation), validated on a
held-out dev split. `evaluate.py` is the single auditable number (the inline
`trainer.predict` number is dropped as non-independent).
## Work plan
- [x] Fix current stutter training blocker (GPU/fp16/disk-safe caching).
- [x] Persist the full classification head (`projector` + `classifier`) so the
reload path reproduces the trained model.
- [x] Fold SEP-28k into the stutter training set (real, balanced, on disk).
- [x] Record honest out-of-speaker baseline: **0.623 / 0.574**.
- [ ] Confirm UCLASS class-code meanings / enough classes (block under-rep).
- [ ] Collect real articulation corpora (yes / self-rated) + wire into a small
trainable artic classifier.
- [ ] Add **Whisper-based GOP** pronunciation model; keep wav2vec2-CTC as
fallback when no reference prompt.
- [ ] Fusion: fit weights on a held-out val split; output bucket + 0..100.
- [ ] Evaluate all 3 experts + fused on out-of-speaker test; iterate toward
higher aggregate accuracy and document what is/isn't achievable (honest
ceiling).