HeAR-TB Domain-Aware Dual Heads
Domain-Aware Adaptation of Google HeAR for TB Cough Screening
This model adapts Google's HeAR (Health Acoustic Representations) foundation model for tuberculosis cough screening using a novel domain-aware dual-head approach.
Model Description
- Base Model: Google HeAR (frozen)
- Method: Domain-Aware Dual Heads
- One XGBoost head specialized on Passive (natural) coughs
- One XGBoost head specialized on Forced (voluntary) coughs
- Final patient score = average of both domain predictions (patient-level aggregation)
- Embedding Weighting: Embedding norm used as quality weight per cough
- Dataset: Nairobi TBscreen (Sharma et al., Science Advances 2024)
- 27,343 clean coughs (Passive + Forced)
Performance (Patient-Level, Repeated 5-Fold CV)
| Metric | Value |
|---|---|
| Patient AUC | 0.7476 ± 0.0932 |
| Sensitivity | ~0.78–0.83 (tunable) |
| Accuracy | 0.728 ± 0.060 |
Intended Use
- Research and demonstration of acoustic TB screening using foundation models
- Part of the MedGemma Impact Challenge (HAI-DEF model usage)
- Educational / exploratory use on cough audio
Limitations & Important Disclaimer
This is NOT a medical device or diagnostic tool.
- Trained on a small number of patients (123)
- Performance is research-level only
- Must not be used for clinical decision-making
- Requires proper clinical validation before any real-world use
- May contain biases from the training data (hospital population in Nairobi)
Always consult a qualified healthcare professional for medical advice.
CITE
@misc{hear-tb-2026, author = Sachiv.C, title = {HeAR-TB: Domain-Aware Dual Heads for Tuberculosis Cough Screening}, year = {2026}, dataset =https://zenodo.org/records/10431329, howpublished = (https://huggingface.co/sach3v/Domain_aware_dual_head_HEar), note = {Entry for MedGemma Impact Challenge} }
How to Use
import joblib
import numpy as np
import librosa
from huggingface_hub import hf_hub_download
# Download and load
package = joblib.load(hf_hub_download("sach3v/hear-tb-domain-aware-dualheads", "hear_tb_prize_domain_aware.joblib"))
model_p = package["model_p"]
scaler_p = package["scaler_p"]
model_f = package["model_f"]
scaler_f = package["scaler_f"]
def predict_cough(audio_path):
y, sr = librosa.load(audio_path, sr=16000)
# ... (pad to 2s and get HeAR embedding)
emb = get_hear_embedding(y) # your HeAR extraction function
p_passive = model_p.predict_proba(scaler_p.transform(emb))[0,1]
p_forced = model_f.predict_proba(scaler_f.transform(emb))[0,1]
return (p_passive + p_forced) / 2.0
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support