Uso
from transformers import pipeline
asr = pipeline("automatic-speech-recognition", model="balidea-ai-lab/med_whisper_tiny")
print(asr("audio.wav")["text"])
Datos de entrenamiento
- Fuente:
balidea-ai-lab/Qwen-TTS-clinical-sentences
— enunciados clínicos sintéticos en es-ES con audio Qwen-TTS.
- Registros usados: 5316 (train 4791 /
dev 525); split determinista por hash de texto.
- Dominios (top): mixto (3840), urinario_renal (203), endocrino_metabolico (200), respiratorio (200), neurologico (199), digestivo (192), cardiovascular (189), infeccioso (173).
- Sin PHI: todo el texto es sintético (
contains_phi: false).
Anti-fuga (held-out)
Los corpus de evaluación held-out sintéticos (v1/v2) están congelados y no se usan para
entrenar. Se verifica solape exacto por sha256(text) contra sus LOCK.json:
- Hashes de texto en eval: 1231
- Enunciados de la fuente excluidos por coincidir con eval: 17
- Manifest de entrenamiento libre de fuga: True
Entrenamiento (HPO + recipe)
- HPO (Optuna, pruner
median): 12 trials,
6 podados. Espacio de búsqueda: LR (log), warmup_ratio,
weight_decay, lr_scheduler_type.
- Best-params:
{"learning_rate": 8.668628998814983e-05, "warmup_ratio": 0.08398500119059167, "weight_decay": 0.027789685625033346, "lr_scheduler_type": "cosine"}
- Recipe final: warmup + cosine + weight decay; mejor checkpoint por WER de dev;
early-stopping. LR usado: 0.00008669.
- Métrica dev (best): WER_norm = 0.0268.
- Entrenamiento trazado en MLflow (params, dataset fingerprint, métricas de rendimiento y de
ejecución, best-params por trial).
Evaluación
WER sobre held-out clínico sintético (objetivo) y benchmark público en castellano (referencia),
comparado con el baseline whisper-tiny sin fine-tuning:
Table with columns: Dataset, Rol, whisper-tiny (base) WER, med_whisper_tiny WER, Δ| Dataset | Rol | whisper-tiny (base) WER | med_whisper_tiny WER | Δ |
|---|
| v1 | held-out clínico (objetivo) | 0.3337 | 0.1519 | -0.1818 |
| v2_clean | held-out clínico (objetivo) | 0.3853 | 0.1899 | -0.1954 |
| fleurs | público (referencia) | 0.1781 | 0.7105 | +0.5323 |
Hallazgos
- Dominio clínico (objetivo): WER medio -0.1886 vs base (mejora el habla clínica sintética held-out).
- Dominio general (público): WER medio +0.5224 vs base.
⚠️ Olvido catastrófico (catastrophic forgetting). El FFT sobre un corpus clínico sintético estrecho (una familia de voces TTS, texto acotado) mejora mucho el dominio objetivo pero degrada gravemente el ASR de castellano general (público ~3–4× peor). El modelo se especializa a costa de la capacidad general.
Uso previsto: experimental / demostrativo del pipeline y específico de dominio clínico sintético. No apto como ASR general de castellano. Para mitigar el olvido en futuras iteraciones: mezclar datos generales, LoRA/PEFT, LR/épocas menores, o regularización (EWC).
Limitaciones
- Olvido catastrófico del dominio general (ver Hallazgos): no usar como ASR general.
- whisper-tiny es de baja capacidad; WER absoluto limitado.
- Audio de entrenamiento sintético (TTS), no habla clínica espontánea real; posible
sobreajuste a la acústica del TTS (parte de la degradación en habla real pública).
- El held-out sintético mide dominio clínico sintético, no despliegue real (pendiente un
clinical-gold real, fuera del alcance de este modelo).
Reproducir
uv run python scripts/build_med_whisper_tiny_manifest.py
uv run python -m balidea_asr.cli.train_asr \
experiment=train_med_whisper_tiny tracking=mlflow_default
uv run python scripts/eval_asr_model.py --label med_whisper_tiny \
--local-dir models/asr/med_whisper_tiny/final_train --device cuda:0
Model card generada automáticamente desde los artefactos del run (sin PHI).